Commit e1cfcbc9 by Van

feat(all): create command Cron:run ; update translation

parent 7d3a4216
...@@ -17,6 +17,7 @@ class FluxController extends BackendBase ...@@ -17,6 +17,7 @@ class FluxController extends BackendBase
* @var Application * @var Application
*/ */
private $application; private $application;
/** /**
* @var array * @var array
*/ */
......
...@@ -25,7 +25,7 @@ class FluxType extends AbstractType ...@@ -25,7 +25,7 @@ class FluxType extends AbstractType
'title', 'title',
TextType::class, TextType::class,
[ [
'label' => Translator::__('Title'), 'label' => Translator::__('appolo.tourinsoft.contenttype.titre_pluriel'),
'required' => true, 'required' => true,
'attr' => [ 'attr' => [
'class' => 'form-control' 'class' => 'form-control'
...@@ -66,7 +66,7 @@ class FluxType extends AbstractType ...@@ -66,7 +66,7 @@ class FluxType extends AbstractType
'contentType', 'contentType',
TextType::class, TextType::class,
[ [
'label' => Translator::__('appolo.tourinsoft.content_type'), 'label' => Translator::__('appolo.tourinsoft.contenttype.type_singulier'),
'required' => true, 'required' => true,
'attr' => [ 'attr' => [
'class' => 'form-control' 'class' => 'form-control'
...@@ -81,9 +81,11 @@ class FluxType extends AbstractType ...@@ -81,9 +81,11 @@ class FluxType extends AbstractType
), ),
]) ])
->add('viewless', CheckboxType::class, [ ->add('viewless', CheckboxType::class, [
'label' => Translator::__('appolo.tourinsoft.contenttype.viewless'),
'required' => false 'required' => false
]) ])
->add('searchable', CheckboxType::class, [ ->add('searchable', CheckboxType::class, [
'label' => Translator::__('appolo.tourinsoft.contenttype.searchable'),
'required' => false 'required' => false
]) ])
; ;
......
...@@ -38,7 +38,7 @@ class KeyType extends AbstractType ...@@ -38,7 +38,7 @@ class KeyType extends AbstractType
$locale, $locale,
TextType::class, TextType::class,
[ [
'label' => Translator::__('appolo.tourinsoft.key').sprintf(Translator::__(' for %s syndication'), $locale), 'label' => Translator::__('appolo.tourinsoft.syndication_key').sprintf(Translator::__(' (%s) '), $locale),
'required' => $required, 'required' => $required,
'attr' => [ 'attr' => [
'class' => 'form-control' 'class' => 'form-control'
......
<?php
namespace Bolt\Extension\Appolo\Tourinsoft\Nut;
use Bolt\Application;
use Bolt\Extension\Appolo\Tourinsoft\Storage\Entity\Flux;
use Bolt\Extension\Appolo\Tourinsoft\Synchronisation\Synchronisation;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Pimple as Container;
class CronCommand extends Command
{
/**
* @var Container
*/
private $container;
/**
* @var array
*/
private $config;
/**
* CronCommand constructor.
* @param Container $container
* @param array $config
*/
public function __construct(Container $container, array $config = [])
{
parent::__construct();
$this->container = $container;
$this->config = $config;
}
/**
* CronCommand Configure
*/
protected function configure()
{
$this
->setName('cron:run')
->setDescription('Synchronize the flux tourinsoft ')
;
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @return int|null|void
* @throws \Exception
*/
protected function execute(InputInterface $input, OutputInterface $output)
{
/** @var Application $app */
$app = $this->container;
/** @var Flux $flux */
$flux = $app['storage']->getRepository(Flux::class)->findAll();
/** @var Flux $item */
foreach ($flux as $item)
{
$item->setSynchronizedAt(new \DateTime());
$app['storage']->getRepository(Flux::class)->update($item);
$sync = new Synchronisation($this->config, $app, $item);
$sync->cron();
}
$output->writeln([
'CRON RUN',
'============',
"<comment>Synchronisation terminée</comment>"
]);
}
}
\ No newline at end of file
...@@ -45,6 +45,7 @@ class Synchronisation ...@@ -45,6 +45,7 @@ class Synchronisation
$this->application = $application; $this->application = $application;
} }
/** /**
* Synchronisation flux * Synchronisation flux
*/ */
...@@ -61,7 +62,6 @@ class Synchronisation ...@@ -61,7 +62,6 @@ class Synchronisation
$file = new ContentTypeFile($this->application, $this->flux, $fields, $options); $file = new ContentTypeFile($this->application, $this->flux, $fields, $options);
$file->updateInFile(); $file->updateInFile();
// Sync database // Sync database
$schema = new Schema($this->application); $schema = new Schema($this->application);
$schema->updateStep1(); $schema->updateStep1();
...@@ -72,7 +72,34 @@ class Synchronisation ...@@ -72,7 +72,34 @@ class Synchronisation
} }
/** /**
* * Cron synchronisation
*/
public function cron()
{
$options = $this->config['tourinsoft'];
$options['keys'] = $this->flux->getKeys();
// Parse tourinsoft flux
$parser = new Parser($options);
$fields = $parser->getFields();
$arrayStream = $parser->getArrayStream();
// Write in contenttypes.yml file
$file = new ContentTypeFile($this->application, $this->flux, $fields, $options);
$file->updateInFile();
// Sync database
$schema = new Schema($this->application);
$schema->updateCron();
// Add data
$data = new Data($this->application, $this->flux->getCode(), $arrayStream, $options);
$data->insert();
}
/**
* Delete
*/ */
public function delete() { public function delete() {
// Write in contenttypes.yml file // Write in contenttypes.yml file
...@@ -86,6 +113,6 @@ class Synchronisation ...@@ -86,6 +113,6 @@ class Synchronisation
// Sync database // Sync database
$schema = new Schema($this->application); $schema = new Schema($this->application);
$schema->updateStep1(); $schema->updateStep1();
} }
} }
\ No newline at end of file
...@@ -2,32 +2,27 @@ ...@@ -2,32 +2,27 @@
namespace Bolt\Extension\Appolo\Tourinsoft; namespace Bolt\Extension\Appolo\Tourinsoft;
use Bolt\AccessControl\Token\Token;
use Bolt\Asset\File\JavaScript; use Bolt\Asset\File\JavaScript;
use Bolt\Asset\File\Stylesheet; use Bolt\Asset\File\Stylesheet;
use Bolt\Controller\Zone; use Bolt\Controller\Zone;
use Bolt\Events\CronEvent;
use Bolt\Events\CronEvents; use Bolt\Events\CronEvents;
use Bolt\Extension\Appolo\Tourinsoft\Controller\Backend\FluxController;
use Bolt\Extension\Appolo\Tourinsoft\Storage\Entity\Flux;
use Bolt\Extension\Appolo\Tourinsoft\Synchronisation\Synchronisation;
use Bolt\Extension\DatabaseSchemaTrait; use Bolt\Extension\DatabaseSchemaTrait;
use Bolt\Extension\SimpleExtension;
use Bolt\Extension\StorageTrait; use Bolt\Extension\StorageTrait;
use Bolt\Menu\MenuEntry; use Bolt\Menu\MenuEntry;
use Silex\Application;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Bolt\Extension\SimpleExtension;
use Pimple as Container;
use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\PipeToArray; use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\PipeToArray;
use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\HashtagToArray; use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\HashtagToArray;
use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\LabelFilter; use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\LabelFilter;
use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\TarifFilter; use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\TarifFilter;
use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\TourinsoftFilter; use Bolt\Extension\Appolo\Tourinsoft\TwigFilters\TourinsoftFilter;
use Bolt\Extension\Appolo\Tourinsoft\Controller\Backend\FluxController;
use Bolt\Extension\Appolo\Tourinsoft\Nut\CronCommand;
use Bolt\Storage\Entity\Authtoken;
use Bolt\Storage\Entity\Users;
use Silex\Application;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\FormType;
/** /**
...@@ -40,6 +35,17 @@ class TourinsoftExtension extends SimpleExtension ...@@ -40,6 +35,17 @@ class TourinsoftExtension extends SimpleExtension
use DatabaseSchemaTrait; use DatabaseSchemaTrait;
/** /**
* @param Container $container
* @return array
*/
protected function registerNutCommands(Container $container)
{
return [
new Nut\CronCommand($container, $this->getConfig())
];
}
/**
* @return array * @return array
*/ */
protected function registerMenuEntries() protected function registerMenuEntries()
...@@ -153,46 +159,4 @@ class TourinsoftExtension extends SimpleExtension ...@@ -153,46 +159,4 @@ class TourinsoftExtension extends SimpleExtension
{ {
$dispatcher->addListener(CronEvents::CRON_DAILY, [$this, 'tourinsoftCron']); $dispatcher->addListener(CronEvents::CRON_DAILY, [$this, 'tourinsoftCron']);
} }
/**
* Callback method for the custom cron job.
*
* @param CronEvent $event
* @throws \Exception
*/
public function tourinsoftCron(CronEvent $event)
{
$this->InitializeRootSession();
$flux = $this->getContainer()['storage']->getRepository(Flux::class)->findAll();
/** @var Flux $item */
foreach ($flux as $item) {
$item->setSynchronizedAt(new \DateTime());
$this->getContainer()['storage']->getRepository(Flux::class)->update($item);
$sync = new Synchronisation($this->getConfig(), $this->getContainer(), $item);
$sync->sync();
}
// Return a message to the console
$event->output->writeln("<comment>Synchronisation terminée</comment>");
}
/**
* @throws \Exception
*/
private function initializeRootSession() {
$user = $this->getContainer()['storage']->getRepository(Users::class)->find(1);
$authToken = new Authtoken();
$authToken->setUserId($user->getId());
$authToken->setToken(uniqid());
$authToken->setSalt($user->getSalt());
$authToken->setLastseen(new \DateTime());
$authToken->setValidity((new \DateTime())->add(new \DateInterval('P8D')));
$token = new Token($user, $authToken);
$this->getContainer()['session']->set('authentication', $token);
}
} }
\ No newline at end of file
...@@ -22,6 +22,9 @@ class Schema ...@@ -22,6 +22,9 @@ class Schema
$this->application = $application; $this->application = $application;
} }
/**
* Update Step 1
*/
public function updateStep1() public function updateStep1()
{ {
$this->application['config']->initialize(); $this->application['config']->initialize();
...@@ -32,6 +35,15 @@ class Schema ...@@ -32,6 +35,15 @@ class Schema
} }
/** /**
* Update Cron
*/
public function updateCron()
{
$output = $this->schemaManager()->update();
$this->session()->set('dbupdate_result', $output->getResponseStrings());
}
/**
* @return \Bolt\Storage\Database\Schema\Manager * @return \Bolt\Storage\Database\Schema\Manager
*/ */
protected function schemaManager() protected function schemaManager()
......
...@@ -22,10 +22,11 @@ ...@@ -22,10 +22,11 @@
<tbody class="sortable striping_odd ui-sortable"> <tbody class="sortable striping_odd ui-sortable">
<tr class="header"> <tr class="header">
<th class="hidden-xs">{{ __('appolo.tourinsoft.id') }}</th> <th class="hidden-xs">{{ __('appolo.tourinsoft.id') }}</th>
<th>{{ __('Title') }}</th> <th>{{ __('general.phrase.title') }}</th>
<th>{{ __('appolo.tourinsoft.code') }}</th> <th>{{ __('appolo.tourinsoft.code') }}</th>
<th>{{ __('appolo.tourinsoft.key') }}</th> <th>{{ __('appolo.tourinsoft.key') }}</th>
<th>{{ __('appolo.tourinsoft.content_type') }}</th> <th>{{ __('appolo.tourinsoft.content_type') }}</th>
<th>{{ __('appolo.tourinsoft.synchronized_at') }}</th>
<th style="text-align: right;"> <th style="text-align: right;">
<span class="hidden-xs">{{ __('general.phrase.action-plural') }} </span> <span class="hidden-xs">{{ __('general.phrase.action-plural') }} </span>
</th> </th>
...@@ -42,6 +43,7 @@ ...@@ -42,6 +43,7 @@
{#{{ item.key }}#} {#{{ item.key }}#}
</td> </td>
<td>{{ item.contentType }}</td> <td>{{ item.contentType }}</td>
<td>{{ item.synchronizedAt| date('d/m/Y H:i') }}</td>
<td class="actions"> <td class="actions">
<div class="btn-group"> <div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle btn-xs" data-toggle="dropdown"> <button type="button" class="btn btn-default dropdown-toggle btn-xs" data-toggle="dropdown">
......
...@@ -6,6 +6,7 @@ appolo.tourinsoft.select_an_action: Select an action ...@@ -6,6 +6,7 @@ appolo.tourinsoft.select_an_action: Select an action
appolo.tourinsoft.id: "#" appolo.tourinsoft.id: "#"
appolo.tourinsoft.code: Code appolo.tourinsoft.code: Code
appolo.tourinsoft.key: Key appolo.tourinsoft.key: Key
appolo.tourinsoft.syndication_key: Syndication key
appolo.tourinsoft.content_type: Content type appolo.tourinsoft.content_type: Content type
appolo.tourinsoft.actions_for_flux: Actions for flux appolo.tourinsoft.actions_for_flux: Actions for flux
appolo.tourinsoft.new_flux: New Flux appolo.tourinsoft.new_flux: New Flux
...@@ -24,3 +25,9 @@ appolo.tourinsoft.content_type_is_required: Content type is required ...@@ -24,3 +25,9 @@ appolo.tourinsoft.content_type_is_required: Content type is required
# Flash Messages # Flash Messages
appolo.tourinsoft.flux_delete: Flux deleted appolo.tourinsoft.flux_delete: Flux deleted
appolo.tourinsoft.flux_inexistant: Flux inexistant appolo.tourinsoft.flux_inexistant: Flux inexistant
# Options ContentTypes
appolo.tourinsoft.contenttype.titre_pluriel: Stream title (plural)
appolo.tourinsoft.contenttype.type_singulier: Content type (singular)
appolo.tourinsoft.contenttype.searchable: Searchable
appolo.tourinsoft.contenttype.viewless: Viewless
\ No newline at end of file
...@@ -6,6 +6,7 @@ appolo.tourinsoft.select_an_action: Sélectionner une action ...@@ -6,6 +6,7 @@ appolo.tourinsoft.select_an_action: Sélectionner une action
appolo.tourinsoft.id: "#" appolo.tourinsoft.id: "#"
appolo.tourinsoft.code: Code appolo.tourinsoft.code: Code
appolo.tourinsoft.key: Clé appolo.tourinsoft.key: Clé
appolo.tourinsoft.syndication_key: Clé de syndication
appolo.tourinsoft.content_type: Type de contenu appolo.tourinsoft.content_type: Type de contenu
appolo.tourinsoft.actions_for_flux: Actions pour les flux appolo.tourinsoft.actions_for_flux: Actions pour les flux
appolo.tourinsoft.new_flux: Nouveau Flux appolo.tourinsoft.new_flux: Nouveau Flux
...@@ -24,3 +25,9 @@ appolo.tourinsoft.content_type_is_required: Le type de contenu est requis ...@@ -24,3 +25,9 @@ appolo.tourinsoft.content_type_is_required: Le type de contenu est requis
# Flash Messages # Flash Messages
appolo.tourinsoft.flux_delete: Flux supprimé appolo.tourinsoft.flux_delete: Flux supprimé
appolo.tourinsoft.flux_inexistant: Flux inexistant appolo.tourinsoft.flux_inexistant: Flux inexistant
# Options ContentTypes
appolo.tourinsoft.contenttype.titre_pluriel: Titre du flux (au pluriel)
appolo.tourinsoft.contenttype.type_singulier: Type de contenu (au singulier)
appolo.tourinsoft.contenttype.searchable: Consultable (Searchable)
appolo.tourinsoft.contenttype.viewless: Pas de vue (Viewless)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment