From afa84408fb240e7b88b55274cb433f66c42b34e7 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Mon, 20 Jun 2016 11:37:14 +0200 Subject: [PATCH] Trinity updates --- vendor/trinity/src/Trinity/.svn/wc.db | Bin 1793024 -> 1798144 bytes .../TrinityAdminBreadcrumbsBundle.en.yml | 5 + .../TrinityAdminBreadcrumbsBundle.fr.yml | 5 + .../Controller/BaseAdminController.php | 2 +- .../Resources/views/BaseAdmin/form.html.twig | 48 ++- .../Configuration/AkamaiCrudConfiguration.php | 57 +++ .../Controller/AkamaiAdminController.php | 93 +++++ .../DependencyInjection/Configuration.php | 30 ++ .../TrinityAkamaiExtension.php | 30 ++ .../Bundle/AkamaiBundle/Event/AkamaiEvent.php | 60 +++ .../EventListener/AkamaiSubscriber.php | 48 +++ .../Form/Type/AkamaiEventFilterType.php | 38 ++ .../Form/Type/AkamaiEventType.php | 24 ++ .../Bundle/AkamaiBundle/Model/AkamaiEvent.php | 9 + .../AkamaiBundle/Model/AkamaiEventPeer.php | 9 + .../AkamaiBundle/Model/AkamaiEventQuery.php | 9 + .../Bundle/AkamaiBundle/Resources/README.md | 3 + .../AkamaiBundle/Resources/config/schema.xml | 20 + .../Resources/config/services.xml | 22 + .../views/AkamaiAdmin/edit.html.twig | 1 + .../views/AkamaiAdmin/index.html.twig | 1 + .../Resources/views/AkamaiAdmin/new.html.twig | 1 + .../AkamaiBundle/Service/AkamaiCcuClient.php | 126 ++++++ .../AkamaiBundle/TrinityAkamaiBundle.php | 10 + .../AkamaiBundle/TrinityAkamaiEvents.php | 11 + .../Controller/PageAdminController.php | 89 ++-- .../ContentManagerBundle/Model/Node.php | 4 + .../Configuration/ModelCrudConfiguration.php | 37 -- .../NewsletterCrudConfiguration.php | 73 ++-- .../Controller/ModelAdminController.php | 160 -------- .../Controller/NewsletterAdminController.php | 379 +++++++++++++++--- .../Controller/NewsletterController.php | 309 +++++++++----- .../TrinityNewsletterExtension.php | 4 +- .../AddBlockFieldsSubscriber.php | 10 +- .../Form/Type/ModelFilterType.php | 23 -- .../NewsletterBundle/Form/Type/ModelType.php | 75 ---- .../Form/Type/NewsletterFilterType.php | 28 +- .../Form/Type/NewsletterType.php | 141 ++++++- .../NewsletterBundle/Model/BlockVersion.php | 9 - .../Model/BlockVersionPeer.php | 9 - .../Model/BlockVersionQuery.php | 9 - .../Bundle/NewsletterBundle/Model/Model.php | 142 ------- .../NewsletterBundle/Model/ModelPeer.php | 9 - .../NewsletterBundle/Model/ModelQuery.php | 9 - .../NewsletterBundle/Model/ModelVersion.php | 9 - .../Model/ModelVersionPeer.php | 9 - .../Model/ModelVersionQuery.php | 9 - .../NewsletterBundle/Model/Newsletter.php | 314 ++++++++++++++- .../Model/NewsletterQuery.php | 6 + .../Newsletter/ModelOneContent.php | 34 ++ .../ModelThreeContent.php} | 8 +- .../Newsletter/ModelTwoContent.php | 50 +++ .../Resources/config/schema.xml | 73 ++-- .../Resources/config/services.xml | 16 + .../Resources/config/services.yml | 7 - .../Resources/translations/messages.fr.xlf | 18 +- .../Resources/views/Default/index.html.twig | 20 +- .../Resources/views/ModelAdmin/edit.html.twig | 9 - .../views/ModelAdmin/index.html.twig | 115 ------ .../Resources/views/ModelAdmin/new.html.twig | 1 - .../views/Newsletter/subscribe.html.twig | 1 + .../class_key.html.twig | 0 .../views/NewsletterAdmin/edit.html.twig | 25 ++ .../views/NewsletterAdmin/index.html.twig | 116 ++++++ .../NewsletterAdmin/listPreview.html.twig | 2 +- .../views/NewsletterAdmin/listSend.html.twig | 12 +- .../recipients_groups.html.twig | 9 + .../views/NewsletterAdmin/stats.html.twig | 3 + .../template.html.twig | 0 .../Notifier/BasicNotifier.php | 16 +- .../views/Security/Admin/login.html.twig | 3 + 71 files changed, 2083 insertions(+), 983 deletions(-) create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Configuration/AkamaiCrudConfiguration.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Controller/AkamaiAdminController.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/Configuration.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/TrinityAkamaiExtension.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Event/AkamaiEvent.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/EventListener/AkamaiSubscriber.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventFilterType.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventType.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Model/AkamaiEvent.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Model/AkamaiEventPeer.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Model/AkamaiEventQuery.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/README.md create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/config/schema.xml create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/config/services.xml create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/edit.html.twig create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/index.html.twig create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/new.html.twig create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Service/AkamaiCcuClient.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/TrinityAkamaiBundle.php create mode 100644 vendor/trinity/src/Trinity/Bundle/AkamaiBundle/TrinityAkamaiEvents.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/ModelCrudConfiguration.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/ModelAdminController.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelFilterType.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelType.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/BlockVersion.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/BlockVersionPeer.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/BlockVersionQuery.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/Model.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelPeer.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelQuery.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelVersion.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelVersionPeer.php delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelVersionQuery.php create mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelOneContent.php rename vendor/trinity/src/Trinity/Bundle/NewsletterBundle/{Model/DefaultModel.php => Newsletter/ModelThreeContent.php} (84%) create mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelTwoContent.php create mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.xml delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.yml delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/edit.html.twig delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/index.html.twig delete mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/new.html.twig rename vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/{ModelAdmin => NewsletterAdmin}/class_key.html.twig (100%) create mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/recipients_groups.html.twig create mode 100644 vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/stats.html.twig rename vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/{ModelAdmin => NewsletterAdmin}/template.html.twig (100%) diff --git a/vendor/trinity/src/Trinity/.svn/wc.db b/vendor/trinity/src/Trinity/.svn/wc.db index 1aaf2929e31d40b1823683c895f94c0fbc7c10c9..9058a1eddf8c5e8311819bde6b7fd8293b04b4c5 100644 GIT binary patch delta 66192 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 K>U3m4cKAQ6%Xdxy delta 48241 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 f*tzJ<4|N+~yy_6>y}&Lgwq%$8kel#eVx#{9pV {% for fieldname, field in form %} - {% if fieldsnames %} - {% set label = fieldsnames[fieldname] is defined ? fieldsnames[fieldname] : fieldname %} - {% else %} - {% set label = fieldname %} - {% endif %} + {% if not field.isRendered() %} + {% if fieldsnames %} + {% set label = fieldsnames[fieldname] is defined ? fieldsnames[fieldname] : fieldname %} + {% else %} + {% set label = fieldname %} + {% endif %} - {% if 'hidden' not in field.vars.block_prefixes %} - {{ form_label(form[fieldname], null, {'label_attr': {'class': 'control-label'}}) }} - {% endif %} + {% if 'hidden' not in field.vars.block_prefixes %} + {{ form_label(form[fieldname], null, {'label_attr': {'class': 'control-label'}}) }} + {% endif %} -
- {{ form_errors(form[fieldname]) }} - {{ form_widget(form[fieldname]) }} -
+
+ {{ form_errors(form[fieldname]) }} + {{ form_widget(form[fieldname]) }} +
+ {% endif %} + {% endfor %} + + {% elseif fieldsets[key]['matches'] is defined %} + {% set regex_match = '/' ~ fieldsets[key]['matches'] ~ '/' %} +
+ {% for fieldname, field in form %} + {% if not field.isRendered() and fieldname matches regex_match %} + {% if fieldsnames %} + {% set label = fieldsnames[fieldname] is defined ? fieldsnames[fieldname] : fieldname %} + {% else %} + {% set label = fieldname %} + {% endif %} + + {% if 'hidden' not in field.vars.block_prefixes %} + {{ form_label(form[fieldname], null, {'label_attr': {'class': 'control-label'}}) }} + {% endif %} + +
+ {{ form_errors(form[fieldname]) }} + {{ form_widget(form[fieldname]) }} +
+ {% endif %} {% endfor %}
{% else %} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Configuration/AkamaiCrudConfiguration.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Configuration/AkamaiCrudConfiguration.php new file mode 100644 index 0000000..9c33708 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Configuration/AkamaiCrudConfiguration.php @@ -0,0 +1,57 @@ +setModelNamespace('Trinity\\Bundle\\AkamaiBundle\\Model') + ->setModel('AkamaiEvent') + ->setModelPeer('AkamaiEventPeer') + ->setModelQuery('AkamaiEventQuery') + + ->setRoutePrefix('TrinityAkamaiBundleAkamaiAdmin') + + ->setFormNamespace('Trinity\\Bundle\\AkamaiBundle\\Form\Type') + + ->setFormEdit('AkamaiEventType') + ->setFormFilter('AkamaiEventFilterType') + ->setFormNew('AkamaiEventType') + + ->setFieldsets(array( + '' => array( + '*', + ), + )) + + ->setMaxPerPage(100) + + ->setRankable(false) + + ->setListTitle('Akamai purge requests') + ->setNewTitle('New AkamaiEvent Akamai') + ->setEditTitle('Edition of "%reference%"') + + ->setBatchActions(array()) + ->removeIndexAction('new') + ->removeIndexListAction('edit') + ->removeIndexListAction('delete') + ->removeIndexListAction('remove') + +// ->setDisplayFields(array( +// 'reference', +// 'description', +// )) + + // Listing: + + // ->setFieldTemplate('visible', 'TrinityAdminBundle:BaseAdmin:bool.html.twig') + // ->setDisplayFields(array( + // + // )) + // ->setFieldname('foo', 'bar') + ; + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Controller/AkamaiAdminController.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Controller/AkamaiAdminController.php new file mode 100644 index 0000000..1f00b49 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Controller/AkamaiAdminController.php @@ -0,0 +1,93 @@ +configuration = new CrudConfiguration(); + } + + /** + * @Route("/{page}", name="TrinityAkamaiBundleAkamaiAdmin_index", defaults={"page" = "1"}, requirements={"page" = "\d+"}) + * @Template() + */ + public function indexAction($page, Request $request) + { + return parent::indexAction($page, $request); + } + + /** + * @Route("/new", name="TrinityAkamaiBundleAkamaiAdmin_new") + * @Template() + */ + public function newAction(Request $request) + { + return parent::newAction($request); + } + + /** + * @Route("/edit/{id}", name="TrinityAkamaiBundleAkamaiAdmin_edit") + * @Template() + * @ParamConverter("object", class="Trinity\Bundle\NotificationBundle\Model\Template") + */ + public function editAction($object, Request $request) + { + return parent::editAction($object, $request); + } + + /** + * @Route("/remove/{id}/{token}", name="TrinityAkamaiBundleAkamaiAdmin_remove") + * @Template() + * @ParamConverter("object", class="Trinity\Bundle\NotificationBundle\Model\Template") + */ + public function removeAction($object, $token, Request $request) + { + return parent::removeAction($object, $token, $request); + } + + /** + * @Route("/batch", name="TrinityAkamaiBundleAkamaiAdmin_batch") + * @Template() + * @Method({"POST"}) + */ + public function batchAction(Request $request) + { + return parent::batchAction($request); + } + + /** + * @Route("/filter/clear", name="TrinityAkamaiBundleAkamaiAdmin_filter_clear") + * @Template() + */ + public function clearFilterAction(Request $request) + { + return parent::clearFilterAction($request); + } + + /** + * @Route("/rank", name="TrinityAkamaiBundleAkamaiAdmin_rank") + * @Template("TrinityAdminBundle:BaseAdmin:rank.html.twig") + * @Method({"POST"}) + */ + public function rankAction(Request $request) + { + return parent::rankAction($request); + } +} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/Configuration.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..37c8634 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/Configuration.php @@ -0,0 +1,30 @@ +root('trinity_akamai'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + $rootNode->children()->scalarNode('base_url')->isRequired()->end(); + + return $treeBuilder; + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/TrinityAkamaiExtension.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/TrinityAkamaiExtension.php new file mode 100644 index 0000000..2f1a7c1 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/DependencyInjection/TrinityAkamaiExtension.php @@ -0,0 +1,30 @@ +processConfiguration($configuration, $configs); + + $container->setParameter('akamai', $config); + + $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.xml'); + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Event/AkamaiEvent.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Event/AkamaiEvent.php new file mode 100644 index 0000000..afb8bfd --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Event/AkamaiEvent.php @@ -0,0 +1,60 @@ +url; + } + + /** + * @param mixed $url + */ + public function setUrl($url) + { + $this->url = $url; + } + + /** + * @return mixed + */ + public function getObject() + { + return $this->object; + } + + /** + * @param mixed $object + */ + public function setObject($object) + { + $this->object = $object; + } + + public function getObjectClass() + { + if($this->object === null){ + return null; + } + + return get_class($this->object); + } + + public function getObjectId() + { + if($this->object === null){ + return null; + } + + return $this->object->getId(); + } +} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/EventListener/AkamaiSubscriber.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/EventListener/AkamaiSubscriber.php new file mode 100644 index 0000000..e15309a --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/EventListener/AkamaiSubscriber.php @@ -0,0 +1,48 @@ +container = $container; + } + + public static function getSubscribedEvents() + { + return array( + TrinityAkamaiEvents::AKAMAI_PURGE => 'purge', + ); + } + + public function purge(AkamaiEvent $event) + { + $urls = $event->getUrl(); + + if(is_array($urls)){ + $data = ['objects' => $urls]; + } else { + $data = ['objects' => [$urls]]; + } + +// $response = $this->container->get('trinity.akamai.ccu.client')->addRequest($data); +// +// $record = new \Trinity\Bundle\AkamaiBundle\Model\AkamaiEvent(); +// $record +// ->setRawData(serialize($data)) +// ->setRawResponse(serialize($response)) +// ->setObjectClass($event->getObjectClass()) +// ->setObjectId($event->getObjectId()) +// ->setProgressUri(isset($response['progressUri']) ? $response['progressUri'] : null) +// ->setPurgeId(isset($response['purgeId']) ? $response['purgeId'] : null) +// ->setSupportId(isset($response['supportId']) ? $response['supportId'] : null) +// ->save(); + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventFilterType.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventFilterType.php new file mode 100644 index 0000000..7b3c880 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventFilterType.php @@ -0,0 +1,38 @@ + 'Trinity\Bundle\AkamaiBundle\Model\AkamaiEvent', + 'name' => 'event', + 'csrf_protection' => false, + + ); + + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options) + { + $builder->add( + 'purge_id', + 'text', + array( + 'required' => false, + ) + ); + + $builder->add( + 'support_id', + 'text', + array( + 'required' => false, + ) + ); + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventType.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventType.php new file mode 100644 index 0000000..5af1496 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Form/Type/AkamaiEventType.php @@ -0,0 +1,24 @@ + 'Trinity\Bundle\AkamaiBundle\Model\AkamaiEvent', + 'name' => 'event', + ); + + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilderInterface $builder, array $options) + { + + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Model/AkamaiEvent.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Model/AkamaiEvent.php new file mode 100644 index 0000000..ceaa08d --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Model/AkamaiEvent.php @@ -0,0 +1,9 @@ + + + + + + + + + + + + + + + +
+ + diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/config/services.xml b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/config/services.xml new file mode 100644 index 0000000..9f9ec76 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/config/services.xml @@ -0,0 +1,22 @@ + + + + + Trinity\Bundle\AkamaiBundle\Service\AkamaiCcuClient + Trinity\Bundle\AkamaiBundle\EventListener\AkamaiSubscriber + + + + + %akamai% + + + + + + + + + diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/edit.html.twig b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/edit.html.twig new file mode 100644 index 0000000..dc03b85 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/edit.html.twig @@ -0,0 +1 @@ +{% extends "TrinityAdminBundle:BaseAdmin:edit.html.twig" %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/index.html.twig b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/index.html.twig new file mode 100644 index 0000000..d5856b7 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/index.html.twig @@ -0,0 +1 @@ +{% extends "TrinityAdminBundle:BaseAdmin:index.html.twig" %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/new.html.twig b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/new.html.twig new file mode 100644 index 0000000..79caecd --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Resources/views/AkamaiAdmin/new.html.twig @@ -0,0 +1 @@ +{% extends "TrinityAdminBundle:BaseAdmin:new.html.twig" %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Service/AkamaiCcuClient.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Service/AkamaiCcuClient.php new file mode 100644 index 0000000..035f224 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/Service/AkamaiCcuClient.php @@ -0,0 +1,126 @@ +configureOptionResolver($resolver); + + // validation des paramètres + $options = $resolver->resolve($akamai_ws); + + // initialisation du client standard Guzzle + $client = new Client([ + "defaults" => [ + // headers attendus + "headers" => [ + "Content-Type" => "application/json", + "Accept" => "application/json", + ], + ], + "base_url" => $options["base_url"] + ]); + + // définition des requètes supportées par notre service + $description = new Description([ + "name" => 'Akamai', + "description" => "Content Control Utility", + "operations" => [ + "getQueue" => [ + "httpMethod" => "GET", + "uri" => "/ccu/v2/queues/{queueName}", + "responseModel" => "jsonResponse", + "parameters" => [ + "queueName" => [ + 'type' => 'string', + 'default' => 'default', + 'location' => 'uri' + ], + ], + ], + "addRequest" => [ + "httpMethod" => "POST", + "uri" => "/ccu/v2/queues/{queueName}", + "responseModel" => "jsonResponse", + "parameters" => [ + "queueName" => [ + 'type' => 'string', + 'default' => 'default', + 'location' => 'uri' + ], + "objects" => [ + 'type' => 'array', + 'required' => true, + 'location' => 'postField' + ], + "action" => [ + 'type' => 'string', + 'default' => 'remove', + 'location' => 'postField' + ], + "type" => [ + 'type' => 'string', + 'default' => 'url', + 'location' => 'postField' + ], + "domain" => [ + 'type' => 'string', + 'default' => 'production', + 'location' => 'postField' + ] + ] + ], + "getStatus" => [ + "httpMethod" => "GET", + "uri" => "/ccu/v2/purges/{purgeId}", + "responseModel" => "jsonResponse", + "parameters" => [ + "purgeId" => [ + 'type' => 'string', + 'required' => true, + 'location' => 'uri' + ] + ], + ], + ], + // les models permettent de définir le traitement appliqué aux réponses de l'API + // on spécifie ici que l'on veut un objet php à partir du json contenu dans la réponse + "models" => [ + "jsonResponse" => [ + "type" => "object", + "additionalProperties" => [ + "location" => "json" + ] + ] + ] + ]); + + parent::__construct($client, $description, $config); + } + + protected function configureOptionResolver(OptionsResolverInterface $resolver) + { + $resolver + ->setRequired([ + 'base_url', + ]); + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/TrinityAkamaiBundle.php b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/TrinityAkamaiBundle.php new file mode 100644 index 0000000..9937889 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/AkamaiBundle/TrinityAkamaiBundle.php @@ -0,0 +1,10 @@ +use_nav_name = $this->container->getParameter('trinity_content_manager.index_use_nav_name'); - - if ($object->getNodeRelatedByNodeId() !== null) { - $event = new LuceneEvent(); + /** @var $object Page */ + if($this->isBundleEnabled('TrinityAkamaiBundle') && $object->getNode()){ + $event = new AkamaiEvent(); + $event->setUrl($this->generateUrl($object->getNode()->getRealRouteName())); $event->setObject($object); - $nav = $object->getNodeRelatedByNodeId()->getNav(); - if($this->use_nav_name){ - $event->setIndex($nav->getName()); - }else { - $event->setIndex($nav->getCulture()); - } + $this->get('event_dispatcher')->dispatch(TrinityAkamaiEvents::AKAMAI_PURGE, $event); + } - $this->get("event_dispatcher")->dispatch( - TrinitySearchEvents::LUCENE_REMOVE_INDEX, $event - ); + if ($this->isBundleEnabled('TrinitySearchBundle')) { + $this->use_nav_name = $this->container->getParameter('trinity_content_manager.index_use_nav_name'); + + if ($object->getNodeRelatedByNodeId() !== null) { + $event = new LuceneEvent(); + $event->setObject($object); + $nav = $object->getNodeRelatedByNodeId()->getNav(); + if ($this->use_nav_name) { + $event->setIndex($nav->getName()); + } else { + $event->setIndex($nav->getCulture()); + } + + $this->get("event_dispatcher")->dispatch( + TrinitySearchEvents::LUCENE_REMOVE_INDEX, $event + ); + } } return parent::removeAction($object, $token, $request); @@ -430,23 +442,44 @@ class PageAdminController extends BaseAdminController public function postSave($object, $was_new = false) { - $this->use_nav_name = $this->container->getParameter('trinity_content_manager.index_use_nav_name'); - - $node = $object->getNodeRelatedByNodeId(); - - if ($node) { - $event = new LuceneEvent(); + /** @var $object Page */ + if($this->isBundleEnabled('TrinityAkamaiBundle') && !$was_new && $object->getNode()){ + $event = new AkamaiEvent(); + $event->setUrl($this->generateUrl($object->getNode()->getRealRouteName(),array('_locale' => $object->getNode()->getNav()->getLocale()),true)); $event->setObject($object); - $nav = $node->getNav(); - if($this->use_nav_name){ - $event->setIndex($nav->getName()); - }else { - $event->setIndex($nav->getCulture()); - } + $this->get('event_dispatcher')->dispatch(TrinityAkamaiEvents::AKAMAI_PURGE, $event); + } - $this->get("event_dispatcher")->dispatch( - TrinitySearchEvents::LUCENE_UPDATE_INDEX, $event - ); + if($this->isBundleEnabled('TrinitySearchBundle')){ + $this->use_nav_name = $this->container->getParameter('trinity_content_manager.index_use_nav_name'); + + $node = $object->getNodeRelatedByNodeId(); + + if ($node) { + $event = new LuceneEvent(); + $event->setObject($object); + $nav = $node->getNav(); + if($this->use_nav_name){ + $event->setIndex($nav->getName()); + }else { + $event->setIndex($nav->getCulture()); + } + + $this->get("event_dispatcher")->dispatch( + TrinitySearchEvents::LUCENE_UPDATE_INDEX, $event + ); + } } } + + protected function isBundleEnabled($bundle) + { + $bundles = array_keys($this->container->get('kernel')->getBundles()); + + if (in_array($bundle, $bundles)) { + return true; + } + + return false; + } } diff --git a/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Model/Node.php b/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Model/Node.php index fec6186..dfde1d6 100644 --- a/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Model/Node.php +++ b/vendor/trinity/src/Trinity/Bundle/ContentManagerBundle/Model/Node.php @@ -621,6 +621,10 @@ class Node extends BaseNode { $default = array('value' => array()); + if ($this->getNav() && $this->getNav()->getLocale()) { + $default['value']['_locale'] = $this->getNav()->getLocale(); + } + try { $value = $this->parser->parse($this->getDefaultParams()); diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/ModelCrudConfiguration.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/ModelCrudConfiguration.php deleted file mode 100644 index f330272..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/ModelCrudConfiguration.php +++ /dev/null @@ -1,37 +0,0 @@ -setModelNamespace('Trinity\\Bundle\\NewsletterBundle\\Model') - ->setModel('Model') - ->setModelPeer('ModelPeer') - ->setModelQuery('ModelQuery') - - ->setRoutePrefix('TrinityNewsletterBundleModelAdmin') - - ->setFormNamespace('Trinity\\Bundle\\NewsletterBundle\\Form\\Type') - ->setFormEdit('ModelType') - ->setFormFilter('ModelFilterType') - ->setFormNew('ModelType') - - ->setDisplayFields(array('name','class_key','template','updated_at','created_at')) - ->setListTitle('Available newsletter models') - ->setFieldTemplate('class_key','TrinityNewsletterBundle:ModelAdmin:class_key.html.twig') - ->setFieldTemplate('template','TrinityNewsletterBundle:ModelAdmin:template.html.twig') - - ->setNewTitle('New newsletter model') - ->setEditTitle('Edit newsletter model "%name%"') - ->setFieldHelper('classKey','You must save a type of model to edit it\'s content') - - ->setFieldsets(array( - 'Configuration' => array('name','classKey','template'), - 'Content' => array('*') - )) - ->setMaxPerPage(20) - ; - } -} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/NewsletterCrudConfiguration.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/NewsletterCrudConfiguration.php index df1ef7c..681c815 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/NewsletterCrudConfiguration.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Configuration/NewsletterCrudConfiguration.php @@ -4,37 +4,60 @@ namespace Trinity\Bundle\NewsletterBundle\Configuration; class NewsletterCrudConfiguration extends \Trinity\Bundle\AdminBundle\Configuration\CrudConfiguration { - public function __construct() { + public function __construct() + { $this - ->setModelNamespace('Trinity\\Bundle\\NewsletterBundle\\Model') - ->setModel('Newsletter') - ->setModelPeer('NewsletterPeer') - ->setModelQuery('NewsletterQuery') + ->setModelNamespace('Trinity\\Bundle\\NewsletterBundle\\Model') + ->setModel('Newsletter') + ->setModelPeer('NewsletterPeer') + ->setModelQuery('NewsletterQuery') - ->setRoutePrefix('TrinityNewsletterBundleNewsletterAdmin') + ->setRoutePrefix('TrinityNewsletterBundleNewsletterAdmin') - ->setFormNamespace('Trinity\\Bundle\\NewsletterBundle\\Form\\Type') - ->setFormEdit('NewsletterType') - ->setFormFilter('NewsletterFilterType') - ->setFormNew('NewsletterType') + ->setFormNamespace('Trinity\\Bundle\\NewsletterBundle\\Form\\Type') + ->setFormEdit('trinity.newsletter.form.newsletter_type', false) + ->setFormNew('trinity.newsletter.form.newsletter_type', false) + ->setFormFilter('NewsletterFilterType') - ->setDisplayFields(array('id','name','sender_name','model','sentAt','created_at')) - ->setListTitle('Newsletters') - ->setFilterMethod('sentAt','filterBySentAt',\Criteria::GREATER_EQUAL) + ->setDisplayFields(array('id', 'name', 'class_key', 'recipients_groups', 'stats', 'sentAt')) - ->setNewTitle('Create a newsletter') - ->setEditTitle('Edit newsletter "%name%"') - - ->setFieldsets(array( - '' => array('name'), - 'Configuration' => array('senderName','senderEmail','model'), - 'Recipients' => array('emailListing','groups'), - )) + ->setListTitle('Newsletters') - ->setIndexListAction('send','TrinityNewsletterBundle:NewsletterAdmin:listSend.html.twig') - ->setIndexListAction('preview','TrinityNewsletterBundle:NewsletterAdmin:listPreview.html.twig') + ->setFilterMethod('sentAt', 'filterBySentAt', \Criteria::GREATER_EQUAL) - ->setMaxPerPage(20) - ; + ->setNewTitle('Create a newsletter') + ->setEditTitle('Edit newsletter "%name%"') + + ->setFieldsets(array( + 'Configuration' => array('name', 'senderName', 'senderEmail', 'classKey', 'template'), + 'Recipients' => array('emailListing', 'groups', 'emailFile', 'emailFileVar'), + 'Content' => array('matches' => 'block_*'), +// 'Compléments' => array('*') + )) + ->setFieldsetsView('tab') + ->setRedirectIfOneResult(false) + + ->setFieldTemplate('class_key', 'TrinityNewsletterBundle:NewsletterAdmin:class_key.html.twig') + ->setFieldTemplate('template', 'TrinityNewsletterBundle:NewsletterAdmin:template.html.twig') + ->setFieldTemplate('recipients_groups', 'TrinityNewsletterBundle:NewsletterAdmin:recipients_groups.html.twig') + ->setFieldTemplate('stats', 'TrinityNewsletterBundle:NewsletterAdmin:stats.html.twig') + ->setIndexListActions( + array( + 'preview' => 'TrinityNewsletterBundle:NewsletterAdmin:listPreview.html.twig', + 'edit' => 'TrinityAdminBundle:BaseAdmin:listEdit.html.twig', + 'remove' => 'TrinityAdminBundle:BaseAdmin:listRemove.html.twig', + 'send' => 'TrinityNewsletterBundle:NewsletterAdmin:listSend.html.twig', + ) + ) + + ->setFieldname('Id','ID') + ->setFieldname('name','Nom') + ->setFieldname('class_key','Modèle') + ->setFieldname('template','Mise en forme') + ->setFieldname('recipients_groups','Groupes destinataires') + ->setFieldname('stats','Statistiques') + ->setFieldname('sentAt','Envoyé le') + + ->setMaxPerPage(40); } } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/ModelAdminController.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/ModelAdminController.php deleted file mode 100644 index 9a0c5de..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/ModelAdminController.php +++ /dev/null @@ -1,160 +0,0 @@ -configuration = new CrudConfiguration(); - } - - /** - * @Route("/list/{page}", name="TrinityNewsletterBundleModelAdmin_index", defaults={"page" = "1"}, requirements={"page" = "\d+"}) - * @Template() - */ - public function indexAction($page, Request $request) - { - $options = $this->container->getParameter('trinity_newsletter.newsletter'); - - $templates = array(); - - foreach($options['models'] as $key => $model) - { - $templates[$key] = array(); - foreach($model['templates'] as $template){ - $templates[$key][$template['template']] = $template['title']; - } - } - - return array_merge( - parent::indexAction($page, $request), - array( - 'models' => $options['models'], - 'templates' => $templates - ) - ); - } - - /** - * @Route("/new", name="TrinityNewsletterBundleModelAdmin_new") - * @Template() - */ - public function newAction(Request $request) - { - $options = $this->container->getParameter('trinity_newsletter.newsletter'); - - $model = $this->getConfiguration()->getModel(); - $object = new $model(); - $form = $this->getConfiguration()->getFormNew(); - $form = $this->createForm(new $form($options), $object); - - if ('POST' === $request->getMethod()) { - if (false !== $processForm = $this->processForm($form, $object, $request)) { - $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, $this->getConfiguration()->getStorageNamespace()); - - return $processForm; - } - - $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.new'), false, $this->getConfiguration()->getStorageNamespace()); - } - - return array( - 'form' => $form->createView(), - 'fieldsets' => $this->getConfiguration()->getFieldsets(), - 'fieldsnames' => $this->getConfiguration()->getFieldsnames(), - 'fields_helpers' => $this->getConfiguration()->getFieldsHelpers(), - 'title' => $this->getConfiguration()->getNewTitle(), - 'i18n' => $this->getConfiguration()->getI18n(), - 'i18n_cultures' => $this->getConfiguration()->getI18nCultures(), - ); - } - - /** - * @Route("/edit/{id}", name="TrinityNewsletterBundleModelAdmin_edit") - * @Template() - * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Model") - */ - public function editAction($object, Request $request) - { - if (!$object) { - $this->getSessionUser()->setFlash('message', new FlashWarning('crud.flash.unknown'), false, $this->getConfiguration()->getStorageNamespace()); - - return $this->redirect($this->generateUrl(sprintf('%s_index',$this->getConfiguration()->getRoutePrefix()))); - } - - $options = $this->container->getParameter('trinity_newsletter.newsletter'); - - $form = $this->getConfiguration()->getFormEdit(); - $form = $this->createForm(new $form($options), $object); - - if ('POST' === $request->getMethod()) { - if (false !== $processForm = $this->processForm($form, $object, $request)) { - $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, $this->getConfiguration()->getStorageNamespace()); - - return $processForm; - } - - $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.update'), false, $this->getConfiguration()->getStorageNamespace()); - } - - return array( - 'object' => $object, - 'form' => $form->createView(), - 'fieldsets' => $this->getConfiguration()->getFieldsets(), - 'fieldsnames' => $this->getConfiguration()->getFieldsnames(), - 'fields_helpers' => $this->getConfiguration()->getFieldsHelpers(), - 'remove_token' => $this->getRemoveToken(true), - 'title' => $this->getConfiguration()->getEditTitle($object), - 'i18n' => $this->getConfiguration()->getI18n(), - 'i18n_cultures' => $this->getConfiguration()->getI18nCultures(), - ); - } - - /** - * @Route("/remove/{id}/{token}", name="TrinityNewsletterBundleModelAdmin_remove") - * @Template() - * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Model") - */ - public function removeAction($object, $token, Request $request) - { - return parent::removeAction($object, $token, $request); - } - - /** - * @Route("/batch", name="TrinityNewsletterBundleModelAdmin_batch") - * @Template() - * @Method({"POST"}) - */ - public function batchAction(Request $request) - { - return parent::batchAction($request); - } - - /** - * @Route("/filter/clear", name="TrinityNewsletterBundleModelAdmin_filter_clear") - * @Template() - */ - public function clearFilterAction(Request $request) - { - return parent::clearFilterAction($request); - } - -} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterAdminController.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterAdminController.php index 7b37bcb..05bb7b9 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterAdminController.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterAdminController.php @@ -7,14 +7,20 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; +use Symfony\Component\Form\Form; +use Symfony\Component\HttpFoundation\File\UploadedFile; use Trinity\Bundle\NewsletterBundle\Configuration\NewsletterCrudConfiguration as CrudConfiguration; use Symfony\Component\HttpFoundation\Request; use Trinity\Bundle\AdminBundle\Controller\BaseAdminController; +use Trinity\Bundle\NewsletterBundle\Model\Newsletter; +use Trinity\Bundle\NewsletterBundle\Model\NewsletterQuery; use Trinity\Bundle\UserBundle\Flash\FlashError; use Trinity\Bundle\UserBundle\Flash\FlashSuccess; use \FOS\UserBundle\Propel\UserQuery; use \FOS\UserBundle\Propel\GroupQuery; +use Trinity\Bundle\UserBundle\Flash\FlashWarning; +use WD\Component\Csv\CsvParser; /** * @Route("/admin/newsletter") @@ -26,13 +32,51 @@ class NewsletterAdminController extends BaseAdminController $this->configuration = new CrudConfiguration(); } + protected function getFormFilter($new = false) + { + $form = $this->getConfiguration()->getFormFilter() ? $this->getConfiguration()->getFormFilter() : $this->getConfiguration()->getFormNew(); + + $options = $this->container->getParameter('trinity_newsletter.newsletter'); + $options = array_merge( + $this->getConfiguration()->getFormFilterOptions(), + array('models' => $options['models']) + ); + + $form = $this->createForm(new $form($options)); + + if (!$new) { + $datas = $this->cleanFilterArray($this->getSessionUser()->getAttribute('filter', array(), + $this->getConfiguration()->getStorageNamespace())); + $form->bind($datas); + } + + return $form; + } + /** * @Route("/list/{page}", name="TrinityNewsletterBundleNewsletterAdmin_index", defaults={"page" = "1"}, requirements={"page" = "\d+"}) * @Template() */ public function indexAction($page, Request $request) { - return parent::indexAction($page, $request); + $options = $this->container->getParameter('trinity_newsletter.newsletter'); + + $templates = array(); + + foreach ($options['models'] as $key => $model) { + $templates[$key] = array(); + foreach ($model['templates'] as $template) { + $templates[$key][$template['template']] = $template['title']; + } + } + + return array_merge( + parent::indexAction($page, $request), + array( + 'models' => $options['models'], + 'templates' => $templates + ) + ); } /** @@ -41,7 +85,58 @@ class NewsletterAdminController extends BaseAdminController */ public function newAction(Request $request) { - return parent::newAction($request); + $options = $this->getConfiguration()->getFormNewOptions(); + if ($this->has('global_vars')) { + $sender_name = $this->get('global_vars')->get('trinity_newsletter_sender_name'); + $sender_mail = $this->get('global_vars')->get('trinity_newsletter_sender_mail'); + + $this->getConfiguration()->setFormNewOptions( + array_merge( + $options, + array( + 'sender_name' => $sender_name, + 'sender_mail' => $sender_mail + ) + ) + ); + } + + $options = $this->getConfiguration()->getFormNewOptions(); + $options_nws = $this->container->getParameter('trinity_newsletter.newsletter'); + $options = array_merge($options, $options_nws); + + $model = $this->getConfiguration()->getModel(); + $object = new $model(); + $form = $this->getConfiguration()->getFormNew(); + if ($this->has($form)) { + $form = $this->createForm($this->get($form)->getName(), $object, $options); + } else { + $form = $this->createForm(new $form($options), $object); + } + + if ('POST' === $request->getMethod()) { + if (false !== $processForm = $this->processForm($form, $object, $request)) { + $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, + $this->getConfiguration()->getStorageNamespace()); + + return $processForm; + } + + $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.new'), false, + $this->getConfiguration()->getStorageNamespace()); + } + + return array( + 'form' => $form->createView(), + 'fieldsets' => $this->getConfiguration()->getFieldsets(), + 'fieldsetsView' => $this->getConfiguration()->getFieldsetsView(), + 'fieldsnames' => $this->getConfiguration()->getFieldsnames(), + 'fields_helpers' => $this->getConfiguration()->getFieldsHelpers(), + 'title' => $this->getConfiguration()->getNewTitle(), + 'i18n' => $this->getConfiguration()->getI18n(), + 'i18n_cultures' => $this->getConfiguration()->getI18nCultures(), + 'collections' => $this->getConfiguration()->getCollections(), + ); } /** @@ -51,7 +146,50 @@ class NewsletterAdminController extends BaseAdminController */ public function editAction($object, Request $request) { - return parent::editAction($object, $request); + if (!$object) { + $this->getSessionUser()->setFlash('message', new FlashWarning('crud.flash.unknown'), false, + $this->getConfiguration()->getStorageNamespace()); + + return $this->redirect($this->generateUrl(sprintf('%s_index', + $this->getConfiguration()->getRoutePrefix()))); + } + + $options = $this->container->getParameter('trinity_newsletter.newsletter'); + + $form = $this->getConfiguration()->getFormEdit(); + if ($this->has($form)) { + $form = $this->createForm($this->get($form)->getName(), $object, $options); + } else { + $form = $this->createForm(new $form($options), $object); + } + + if ('POST' === $request->getMethod()) { + if (false !== $processForm = $this->processForm($form, $object, $request)) { + $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.updated.singular'), false, + $this->getConfiguration()->getStorageNamespace()); + + return $processForm; + } + + $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.update'), false, + $this->getConfiguration()->getStorageNamespace()); + } + + return array( + 'object' => $object, + 'created_at' => (method_exists($object, 'getCreatedAt')) ? $object->getCreatedAt('d/m/Y') : null, + 'updated_at' => (method_exists($object, 'getUpdatedAt')) ? $object->getUpdatedAt('d/m/Y') : null, + 'form' => $form->createView(), + 'fieldsets' => $this->getConfiguration()->getFieldsets(), + 'fieldsetsView' => $this->getConfiguration()->getFieldsetsView(), + 'fieldsnames' => $this->getConfiguration()->getFieldsnames(), + 'fields_helpers' => $this->getConfiguration()->getFieldsHelpers(), + 'remove_token' => $this->getRemoveToken(true), + 'title' => $this->getConfiguration()->getEditTitle($object), + 'i18n' => $this->getConfiguration()->getI18n(), + 'i18n_cultures' => $this->getConfiguration()->getI18nCultures(), + 'collections' => $this->getConfiguration()->getCollections(), + ); } /** @@ -90,60 +228,148 @@ class NewsletterAdminController extends BaseAdminController */ public function sendAction($object, Request $request) { + /** @var $object Newsletter */ if ($object->getSentAt()) { - $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.send'), false, $this->getConfiguration()->getStorageNamespace()); + $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.send'), false, + $this->getConfiguration()->getStorageNamespace()); return $this->redirect($this->generateUrl('TrinityNewsletterBundleNewsletterAdmin_index')); } - if (!$object->getModelId()) { - $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.no_model'), false, $this->getConfiguration()->getStorageNamespace()); + if (!$object->getClassKey()) { + $this->getSessionUser()->setFlash('message', new FlashError('crud.flash.fail.no_model'), false, + $this->getConfiguration()->getStorageNamespace()); return $this->redirect($this->generateUrl('TrinityNewsletterBundleNewsletterAdmin_index')); } - $object->setSentAt(new \DateTime('now'))->save(); + $object->setSentAt(new \DateTime('now')); $blocks = array(); - foreach ($object->getModel()->getBlocks() as $block) { + foreach ($object->getBlocks() as $block) { $blocks[$block->getName()] = $block; } $message = \Swift_Message::newInstance() - ->setSubject($object->getName()) - ->setFrom(array($object->getSenderEmail() => $object->getSenderName())) - ; + ->setSubject($object->getSubject()) + ->setFrom(array($object->getSenderEmail() => $object->getSenderName())); - foreach ($object->getRecipients() as $email) { - $user = UserQuery::create()->filterByEmail($email)->findOne(); + if ($object->getEmailFileVar() && $object->getEmailVarDesc()) { - if (!$user) { - $user = $this->generateNewsletterUser($email); + $filename = $object->getEmailFileVarAsFile()->getRealPath(); + $parser = new CsvParser($filename, ';', '"', '\\', true); + $parser->parse(); + $legend = $parser->getLegend(); + $datas = $parser->getDatas(); + + $unsubscribed = $object->getUnsubscribed(); + $sended = 0; + $blacklisted = 0; + + foreach ($datas as $line) { + $email = trim($line[0]); + + if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ + continue; + } + + if(in_array($email, $unsubscribed)){ + $blacklisted++; + continue; + } + + $token = $this->generateUnsubscribeToken($email); + + $user = UserQuery::create()->filterByEmail($email)->findOne(); + + if ($user) { + $user->setUnsubscribeToken($token); + $user->save(); + } + + $body = $this->renderView( + $object->getTemplate(), + array( + 'model' => $object, + 'blocks' => $blocks, + 'email' => $email, + 'unsubscribe_token' => $token + ) + ); + + foreach ($legend as $term) { + $token = $object->tokenize($term); + $value = $line[$term]; + $body = str_replace($token, trim($value), $body); + } + + $message + ->setTo($email) + ->setBody($body, 'text/html'); + + $this->get('swiftmailer.mailer.spool_mailer')->send($message); + + $sended++; } - if (!$user->getUnsubscribeToken()) { - $user->setUnsubscribeToken($this->generateUnsubscribeToken()); - $user->save(); + $object->setBlacklistNumber($blacklisted); + $object->setRecipientsNumber($sended); + + } else { + foreach ($object->getRecipients() as $email) { + + $user = UserQuery::create()->filterByEmail($email)->findOne(); + + $token = $this->generateUnsubscribeToken($email); + + if ($user) { + $user->setUnsubscribeToken($token); + $user->save(); + } + + $body = $this->renderView( + $object->getTemplate(), + array( + 'model' => $object, + 'blocks' => $blocks, + 'email' => $email, + 'unsubscribe_token' => $token + ) + ); + + $message + ->setTo($email) + ->setBody($body, 'text/html'); + + $this->get('swiftmailer.mailer.spool_mailer')->send($message); } - - $body = $this->renderView( - $object->getModel()->getTemplate(), - array( - 'model' => $object->getModel(), - 'blocks' => $blocks, - 'user' => $user) - ); - - $message - ->setTo($email) - ->setBody($body,'text/html') - ; - - $this->get('mailer')->send($message); } - $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.success.send'), false, $this->getConfiguration()->getStorageNamespace()); + $object->save(); + + $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.success.send'), false, + $this->getConfiguration()->getStorageNamespace()); + + return $this->redirect($this->generateUrl('TrinityNewsletterBundleNewsletterAdmin_index')); + } + + /** + * @Route("/copy/{id}", name="TrinityNewsletterBundleNewsletterAdmin_copy") + * @Template() + * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Newsletter") + */ + public function copyAction($object, Request $request) + { + NewsletterQuery::create() + ->findPK($object->getId()) + ->copy(true) + ->setSentAt(null) + ->setCreatedAt(new \DateTime('now')) + ->save(); + + $this->getSessionUser()->setFlash('message', new FlashSuccess('crud.flash.success.copy'), false, + $this->getConfiguration()->getStorageNamespace()); return $this->redirect($this->generateUrl('TrinityNewsletterBundleNewsletterAdmin_index')); } @@ -152,43 +378,74 @@ class NewsletterAdminController extends BaseAdminController { foreach ($pks as $pk) { $query->findPK($pk) - ->copy(true) - ->setSentAt(null) - ->setCreatedAt(new \DateTime('now')) - ->save(); + ->copy(true) + ->setSentAt(null) + ->setCreatedAt(new \DateTime('now')) + ->save(); } } - private function generateNewsletterUser($email) + private function generateUnsubscribeToken($email) { - if (!$group = GroupQuery::create()->filterByCode('NEWSLETTER')->findOne()) { - throw new \Exception('No newsletter group define. Please create one with the code NEWSLETTER.'); - } - $user = new \FOS\UserBundle\Propel\User(); - $user->setEmail($email); - $user->setEnabled(false); - $user->setLocked(true); - $user->setUsername(sprintf('%s-%s',$email,date('Y-m-d H:i:s'))); - $user->addGroup($group); - $user->save(); + $key = '1ag4jf96znv07m459kf29kfZl5I9fnvT8dfg0pza114bM5fg6Kl'; + $iv = '3452562488791564'; + $token = openssl_encrypt($email, 'aes128', $key, false, $iv); - return $user; + return $token; } - private function generateUnsubscribeToken() + /** + * @param $form Form + * @param $object Newsletter + * @param Request $request + * @return bool|\Symfony\Component\HttpFoundation\RedirectResponse + * @throws \Trinity\Bundle\AdminBundle\Exception\RequestAdminException + */ + protected function processForm(&$form, &$object, Request $request) { - $bytes = false; - if (function_exists('openssl_random_pseudo_bytes') && 0 !== stripos(PHP_OS, 'win')) { - $bytes = openssl_random_pseudo_bytes(32, $strong); - if (true !== $strong) { - $bytes = false; + $form->submit($request); + + if ($form->isValid()) { + + $this->preSave($object); + + $uploaded_file = $object->getEmailFile(); + if ($uploaded_file instanceof UploadedFile) { + + $lines = file($uploaded_file->getPathname()); + $emails = ""; + $regex2 = '/^([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-' + . '\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80-\\xff]|\\x5c\\x00-' + . '\\x7f)*\\x22)(\\x2e([^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' + . '\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x22([^\\x0d\\x22\\x5c\\x80' + . '-\\xff]|\\x5c\\x00-\\x7f)*\\x22))*\\x40([^\\x00-\\x20\\x22\\x28\\x29' + . '\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+|\\x5b([^' + . '\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*\\x5d)(\\x2e([^\\x00-' + . '\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-' + . '\\xff]+|\\x5b([^\\x0d\\x5b-\\x5d\\x80-\\xff]|\\x5c\\x00-\\x7f)*' + . '\\x5d))*$/'; + + foreach ($lines as $line_num => $line) { + $words = preg_split("/[\s,\;]+/", $line); + foreach ($words as $word) { + if (preg_match($regex2, $word, $matches)) { + $emails .= "\n" . $matches[0]; + } + } + } + + $object->setEmailListing($object->getEmailListing() . $emails); } + + $object->save(); + + $this->postSave($object); + + return $this->redirect($this->redirectByRequest($request, $object)); } - if (false === $bytes) { - $bytes = hash('sha256', uniqid(mt_rand(), true), true); - } - - return base_convert(bin2hex($bytes), 16, 36); + return false; } + + } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterController.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterController.php index 7079cba..f8e1afe 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterController.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterController.php @@ -1,122 +1,209 @@ getModel()) { - throw $this->createNotFoundException('This newsletter does not have a defined template.'); - } - - $blocks = array(); - - foreach ($object->getModel()->getBlocks() as $block) { - $blocks[$block->getName()] = $block; - } - - $user = new User(); - $user->setUnsubscribeToken('show'); - - return $this->render( - $object->getModel()->getTemplate(), - array( - 'model' => $object->getModel() , - 'blocks' => $blocks , - 'user' => $user, - ) - ); + if (!$object) { + throw $this->createNotFoundException('This newsletter does not have a defined template.'); } - /** - * @Route("/newsletter/subscribe", name="newsletter_subscribe") - * @Template() - * - */ - public function subscribeAction(Request $request) - { - $defaultData = array( - 'email' => ($this->getUser())?$this->getUser()->getEmail():null, - ); + $blocks = array(); - // TODO : use DataTransformer and specific Type to manage this - $form = $this->container->get('form.factory')->createNamedBuilder('newsletter_subscribe','form', $defaultData) - ->setMethod('POST') - ->setAction($this->generateUrl('newsletter_subscribe')) - ->add('email', 'email', array( - 'attr' => array( - 'placeholder' => ($this->getUser())?$this->getUser()->getEmail():$this->get('translator')->trans('mail@example.com') - ), - 'constraints' => array( - new NotBlank(), - new NotEqualTo(array('value'=> $this->get('translator')->trans('mail@example.com'))) - ) - )) - ->add('referer','hidden') - ->getForm(); - $form->handleRequest($request); - - if($request->isMethod('POST')) { - if ($form->isValid()) { - $datas = $form->getData(); - $this->save(array_merge($datas,array('newsletter' => true))); - $request->getSession()->getFlashBag()->add('success',$this->get('translator')->trans('Thank you for your subscription to our newsletter.')); - $this->redirect($this->generateUrl("newsletter_subscribe")); - } - } - - return $this->render( - 'TrinityNewsletterBundle:Newsletter:subscribe.html.twig', - array( - 'form' => $form->createView() - ) - ); + foreach ($object->getBlocks() as $block) { + $blocks[$block->getName()] = $block; } - /** - * @Route("/newsletter/unsubscribe/{token}", name="newsletter_unsubscribe") - * @Template() - */ - public function unsubscribeAction($token) - { - $user = UserQuery::create()->filterByUnsubscribeToken($token)->findOne(); - - if (!$user) { - throw $this->createNotFoundException('No user found for this token'); - } - - $blck_group = GroupQuery::create()->filterByCode('BLACKLIST')->findOne(); - - if (!$blck_group) { - throw $this->createNotFoundException('You must define a group with "BLACKLIST" code in order to allow user\'s unsubscribe'); - } - - $user->addGroup($blck_group)->save(); - } - - protected function save(array $datas) - { - $this->get('trinity.user_register')->setCurrentUser($this->getUser()); - - $user = $this->get('trinity.user_register')->registerUserIfUnknown($datas); - $user = $this->get('trinity.user_register')->updateOptins($datas, $user); - } + return $this->render( + $object->getTemplate(), + array( + 'model' => $object , + 'blocks' => $blocks , + 'email' => 'email@show.com', + 'unsubscribe_token' => 'show' + ) + ); } + + /** + * @Route("/newsletter/show_last", name="newsletter_last_preview") + * @Template() + */ + public function lastAction(Request $request) + { + $object = NewsletterQuery::create() + ->filterBySentAt(null, \Criteria::ISNOTNULL) + ->orderBySentAt(\Criteria::DESC) + ->findOne(); + + if(!$object){ + $request->getSession()->getFlashBag()->add('success',$this->get('translator')->trans('No newsletter to show.')); + return $this->redirect($this->generateUrl('homepage')); + } + + $blocks = array(); + + foreach ($object->getBlocks() as $block) { + $blocks[$block->getName()] = $block; + } + + return $this->render( + $object->getTemplate(), + array( + 'model' => $object , + 'blocks' => $blocks , + 'email' => 'email@show.com', + 'unsubscribe_token' => 'show' + ) + ); + } + + /** + * @Route("/newsletter/subscribe", name="newsletter_subscribe") + * @Template() + * + */ + public function subscribeAction(Request $request) + { + $defaultData = array( + 'email' => ($this->getUser())?$this->getUser()->getEmail():null, + ); + + // TODO : use DataTransformer and specific Type to manage this + $form = $this->container->get('form.factory')->createNamedBuilder('newsletter_subscribe','form', $defaultData) + ->setMethod('POST') + ->setAction($this->generateUrl('newsletter_subscribe')) + ->add('email', 'email', array( + 'attr' => array( + 'placeholder' => ($this->getUser())?$this->getUser()->getEmail():$this->get('translator')->trans('mail@example.com') + ), + 'constraints' => array( + new NotBlank(), + new NotEqualTo(array('value'=> $this->get('translator')->trans('mail@example.com'))) + ) + )) + ->add('referer','hidden') + ->getForm(); + $form->handleRequest($request); + + if($request->isMethod('POST')) { + if ($form->isValid()) { + $datas = $form->getData(); + if($this->alreadySubscribed($datas)){ + $request->getSession()->getFlashBag()->add('success',$this->get('translator')->trans('You have already subscribed to the newsletter.')); + }else{ + $this->save(array_merge($datas, array('newsletter' => true))); + $request->getSession()->getFlashBag()->add('success',$this->get('translator')->trans('Thank you for your subscription to our newsletter.')); + } + $this->redirect($this->generateUrl("newsletter_subscribe")); + } + } + + return $this->render( + 'TrinityNewsletterBundle:Newsletter:subscribe.html.twig', + array( + 'form' => $form->createView() + ) + ); + } + + /** + * @Route("/newsletter/unsubscribe/{token}", name="newsletter_unsubscribe") + * @Template() + */ + public function unsubscribeAction(Request $request, $token) + { + $token = urldecode($token); + + $key = '1ag4jf96znv07m459kf29kfZl5I9fnvT8dfg0pza114bM5fg6Kl'; + $iv = '3452562488791564'; + + $email = openssl_decrypt($token, 'aes128', $key, false, $iv); + + $user = UserQuery::create()->filterByUnsubscribeToken($token)->findOne(); + + if (!$user) { + $user = $this->generateNewsletterUser($email); + } + + $blck_group = GroupQuery::create()->filterByCode('BLACKLIST')->findOne(); + + if (!$blck_group) { + throw $this->createNotFoundException('You must define a group with "BLACKLIST" code in order to allow user\'s unsubscribe'); + } + + $user->addGroup($blck_group)->save(); + + $this->get('request')->getSession()->getFlashBag()->add('success',$this->get('translator')->trans('Your unsubscribe request is saved.')); + } + + protected function save(array $datas) + { + $this->get('trinity.user_register')->setCurrentUser($this->getUser()); + + $user = $this->get('trinity.user_register')->registerUserIfUnknown($datas); + + $this->get('trinity.user_register')->updateOptins($datas, $user); + } + + protected function getNewsletterGroups() + { + $groups = array(); + $query = GroupQuery::create()->filterByCode('NEWSLETTER\_%',\Criteria::LIKE)->orderByCode(); + foreach($query->find() as $group){ + $groups[$group->getCode()] = $group->getName(); + } + return $groups; + } + + protected function alreadySubscribed($datas) + { + if(!isset($datas['email'])){ + return false; + } + + $count = UserQuery::create() + ->filterByEmail($datas['email']) + ->useUserGroupQuery() + ->useGroupQuery() + ->filterByCode('NEWSLETTER') + ->endUse() + ->endUse() + ->count(); + + return ($count > 0) ? true : false; + } + + protected function generateNewsletterUser($email) + { + $user = new \FOS\UserBundle\Propel\User(); + $user->setEmail($email); + $user->setEnabled(false); + $user->setLocked(true); + $user->setUsername(sprintf('%s-%s',$email,date('Y-m-d H:i:s'))); + $user->save(); + + return $user; + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/DependencyInjection/TrinityNewsletterExtension.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/DependencyInjection/TrinityNewsletterExtension.php index 77f351a..57e8369 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/DependencyInjection/TrinityNewsletterExtension.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/DependencyInjection/TrinityNewsletterExtension.php @@ -22,8 +22,8 @@ class TrinityNewsletterExtension extends Extension $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); - $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); - $loader->load('services.yml'); + $loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.xml'); $container->setParameter('trinity_newsletter.newsletter', isset($config['newsletter']) ? $config['newsletter'] : array()); } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/EventListener/AddBlockFieldsSubscriber.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/EventListener/AddBlockFieldsSubscriber.php index 238fd56..89a4fb6 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/EventListener/AddBlockFieldsSubscriber.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/EventListener/AddBlockFieldsSubscriber.php @@ -22,15 +22,7 @@ class AddBlockFieldsSubscriber implements EventSubscriberInterface foreach ($data->getConfiguration()->getBlocks() as $block_configuration) { $type = $block_configuration->getType(); - $form->add( - sprintf('block_%s', $block_configuration->getName()), - new $type(), - array( - 'attr' => array( - 'class' => 'embeded-form', - ), - ) - ); + $form->add(sprintf('block_%s', $block_configuration->getName()), new $type()); } } } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelFilterType.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelFilterType.php deleted file mode 100644 index eaa81d8..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelFilterType.php +++ /dev/null @@ -1,23 +0,0 @@ - 'Trinity\Bundle\NewsletterBundle\Model\Model', - 'name' => 'model_filter', - 'csrf_protection' => false, - ); - - /** - * {@inheritdoc} - */ - public function buildForm(FormBuilderInterface $builder, array $options) - { - $builder->add('name'); - } -} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelType.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelType.php deleted file mode 100644 index b8bf2de..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/ModelType.php +++ /dev/null @@ -1,75 +0,0 @@ - 'Trinity\Bundle\NewsletterBundle\Model\Model', - 'name' => 'model', - ); - - /** - * {@inheritdoc} - */ - public function buildForm(FormBuilderInterface $builder, array $options) - { - $builder->add('name'); - - $builder->add( - 'classKey', - 'choice', - array( - 'choices' => self::getModels(), - 'required' => true, - ) - ); - - $builder->add( - 'template', - 'choice', - array( - 'choices' => $this->getTemplates($builder->getData()), - 'required' => true, - ) - ); - - $builder->addEventSubscriber(new AddBlockFieldsSubscriber()); - } - - public function getModels() - { - $models = array(); - - if (is_array($this->getOption('models'))) { - foreach ($this->getOption('models') as $model => $settings) { - $models[$model] = $settings['title']; - } - } - - return $models; - } - - public function getTemplates(\Trinity\Bundle\NewsletterBundle\Model\Model $model = null) - { - $templates = array(); - - if (null !== $model) { - $models = $this->getOption('models'); - - if (isset($models[$model->getClassKey()])) { - $_templates = $models[$model->getClassKey()]['templates']; - - foreach ($_templates as $_template) { - $templates[$_template['template']] = $_template['title']; - } - } - } - - return $templates; - } -} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterFilterType.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterFilterType.php index 889c9a6..9541d84 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterFilterType.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterFilterType.php @@ -10,6 +10,7 @@ class NewsletterFilterType extends BaseAbstractType protected $options = array( 'data_class' => 'Trinity\Bundle\NewsletterBundle\Model\Newsletter', 'name' => 'newsletter_filter', + 'models' => array(), 'csrf_protection' => false, ); @@ -19,15 +20,15 @@ class NewsletterFilterType extends BaseAbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('name'); - $builder->add('senderName'); - $builder->add('senderEmail'); - $builder->add('modelId', - 'model', + $builder->add( + 'classKeyValue', + 'choice', array( - 'empty_value' => 'All', - 'required' => false, - 'class' => 'Trinity\Bundle\NewsletterBundle\Model\Model', + 'choices' => self::getModels(), + 'label' => 'Modèle', + 'required' => false, + 'mapped' => false ) ); @@ -45,4 +46,17 @@ class NewsletterFilterType extends BaseAbstractType ) ); } + + public function getModels() + { + $models = array(); + + if (is_array($this->getOption('models'))) { + foreach ($this->getOption('models') as $model => $settings) { + $models[$model] = $settings['title']; + } + } + + return $models; + } } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterType.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterType.php index e7bdb95..cba5d14 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterType.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Form/Type/NewsletterType.php @@ -4,13 +4,20 @@ namespace Trinity\Bundle\NewsletterBundle\Form\Type; use Propel\PropelBundle\Form\BaseAbstractType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Component\Validator\Constraints\File; +use Trinity\Bundle\NewsletterBundle\Form\EventListener\AddBlockFieldsSubscriber; use \Trinity\Bundle\NewsletterBundle\Model\ModelQuery; +use Trinity\Component\Form\DataTransformer\StringToFileTransformer; +use Trinity\Component\Form\EventListener\FileDeleteFormListener; class NewsletterType extends BaseAbstractType { protected $options = array( - 'data_class' => 'Trinity\Bundle\NewsletterBundle\Model\Newsletter', - 'name' => 'newsletter', + 'data_class' => 'Trinity\Bundle\NewsletterBundle\Model\Newsletter', + 'name' => 'trinity_newsletter_admin_model', + 'models' => array(), + 'sender_name' => null, + 'sender_mail' => null ); /** @@ -18,20 +25,104 @@ class NewsletterType extends BaseAbstractType */ public function buildForm(FormBuilderInterface $builder, array $options) { - $builder->add('name'); - $builder->add('senderName'); - $builder->add('senderEmail'); + $this->setOptions($options); - $builder->add('model', - 'model', + $builder->add( + 'name', + 'text', array( - 'required' => true, - 'class' => 'Trinity\Bundle\NewsletterBundle\Model\Model', + 'attr' => array( + 'data-help' => 'Nom utilisé pour la gestion en BO' + ) ) ); + if ($builder->getData()->isNew()) { + $builder->add( + 'senderName', + null, + array( + 'data' => isset($options['sender_name']) ? $options['sender_name'] : null + ) + ); + + $builder->add( + 'senderEmail', + null, + array( + 'data' => isset($options['sender_mail']) ? $options['sender_mail'] : null + ) + ); + } else { + $builder->add('senderName'); + $builder->add('senderEmail'); + } + + $builder->add( + 'classKey', + 'choice', + array( + 'choices' => self::getModels(), + 'required' => true, + 'attr' => array( + 'data-help' => 'Pour éditer le contenu, vous devez enregistrer un modèle de données' + ) + ) + ); + + $builder->add( + 'template', + 'choice', + array( + 'label' => 'Mise en page', + 'choices' => $this->getTemplates($builder->getData()), + 'required' => true, + ) + ); + + $builder->addEventSubscriber(new AddBlockFieldsSubscriber()); + $builder->add('emailListing','textarea'); + $builder->add( + $builder->create( + 'emailFile', + 'file', + array( + 'label' => 'Fichier email', + 'constraints' => array( + new File(), + ), + ) + )->addModelTransformer(new StringToFileTransformer($builder->getData(), 'emailFile')) + ); + + $builder->add( + $builder->create( + 'emailFileVar', + 'file', + array( + 'label' => 'CSV email', + 'constraints' => array( + new File(), + ), + 'attr' => array( + 'data-help' => 'Fichier CSV avec variables au format suivant : email; var1; var2; ...' + ) + ) + )->addModelTransformer(new StringToFileTransformer($builder->getData(), 'emailFileVar')) + ); + + $builder->addEventSubscriber( + new FileDeleteFormListener( + $builder->getFormFactory(), + array( + 'emailFile', + 'emailFileVar', + ) + ) + ); + $builder->add( 'groups', 'model', @@ -42,4 +133,36 @@ class NewsletterType extends BaseAbstractType ) ); } + + public function getModels() + { + $models = array(); + + if (is_array($this->getOption('models'))) { + foreach ($this->getOption('models') as $model => $settings) { + $models[$model] = $settings['title']; + } + } + + return $models; + } + + public function getTemplates(\Trinity\Bundle\NewsletterBundle\Model\Newsletter $model = null) + { + $templates = array(); + + if (null !== $model) { + $models = $this->getOption('models'); + + if (isset($models[$model->getClassKey()])) { + $_templates = $models[$model->getClassKey()]['templates']; + + foreach ($_templates as $_template) { + $templates[$_template['template']] = $_template['title']; + } + } + } + + return $templates; + } } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/BlockVersion.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/BlockVersion.php deleted file mode 100644 index 2e302d2..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/BlockVersion.php +++ /dev/null @@ -1,9 +0,0 @@ -configuration; - } - - protected function hasBlock($d) - { - return isset($this->blocks[is_object($d) ? $d->getName() : $d]); - } - - public function setBlock(Block $block) - { - $block->setModelId($this->getId()); - - $this->blocks[$block->getName()] = $block; - - return $this; - } - - public function __construct($template = null) - { - if ($template) { - $this->setTemplate($template); - } - - parent::__construct(); - - $this->configuration = new ModelConfiguration(); - } - - public function __toString() - { - return $this->name; - } - - public function getTemplating() - { - return $this->templating; - } - - public function setTemplating($templating) - { - $this->templating = $templating; - - return $this; - } - - public function save(\PropelPDO $con = null) - { - parent::save($con); - - if (!empty($this->blocks)) { - foreach ($this->blocks as $block) { - $block->save($con); - } - } else { - foreach ($this->getConfiguration()->getBlocks() as $block_configuration) { - $this->getBlock($block_configuration->getName())->save($con); - } - } - - return $this; - } - - public function getBlock($name) - { - if (!$this->getId()) { - return $this->getNewBlock($name); - } - - $qBlock = BlockQuery::create()->filterByName($name)->filterByModelId($this->getId())->findOne(); - - $block = $qBlock ? $qBlock : $this->getNewBlock($name, $this->getId()); - - if (!$this->hasBlock($block->getName())) { - $this->setBlock($block); - } - - return $block; - } - - public function getBlockTitle() - { - return $this->getBlock('title'); - } - - public function getBlockSubtitle() - { - return $this->getBlock('subtitle'); - } - - public function getBlockContent() - { - return $this->getBlock('content'); - } - - public function setBlockTitle(Block $block) - { - return $this->setBlock($block); - } - - public function setBlockSubtitle(Block $block) - { - return $this->setBlock($block); - } - - public function setBlockContent(Block $block) - { - return $this->setBlock($block); - } - - protected function getNewBlock($name, $modelId = null) - { - $type = $this->getConfiguration()->getBlock($name)->getType(); - $form = new $type(); - $form_model = $form->getOption('data_class') ? $form->getOption('data_class') : 'Block'; - - $block = new $form_model(); - $block->setname($name); - - if (null !== $modelId) { - $block->setModelId($modelId); - } - - return $block; - } -} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelPeer.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelPeer.php deleted file mode 100644 index a62600e..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/ModelPeer.php +++ /dev/null @@ -1,9 +0,0 @@ -sent_at) { - return sprintf('%s envoyé le : %s',$this->name,$this->getSentAt('d/m/Y H:i:s')); + if ($this->sent_at) { + return sprintf('%s envoyé le : %s', $this->name, $this->getSentAt('d/m/Y H:i:s')); } - return sprintf('%s modifier le : %s',$this->name,$this->getUpdatedAt('d/m/Y H:i:s')); + + return sprintf('%s modifier le : %s', $this->name, $this->getUpdatedAt('d/m/Y H:i:s')); } + //************** Système d'envoi ************************** + public function getRecipients() { - $email_list = explode(',', $this->getEmailListing()); + $email_list = $this->splitEmailList($this->getEmailListing()); $users_mail = $this->getUserByGroups(); - return array_diff( - array_unique( - array_merge( - $email_list, - $users_mail) - ), - $this->getUnsubscribed() - ); + $recipients_array = array_unique(array_merge($email_list, $users_mail)); + $this->setRecipientsNumber(count($recipients_array)); + + $emails = array_diff($recipients_array, $this->getUnsubscribed()); + $this->setBlacklistNumber($this->getRecipientsNumber() - count($emails)); + $recipients = filter_var_array($emails, FILTER_VALIDATE_EMAIL); + + foreach ($recipients as $key => $value) { + if (empty($value) || $value == false) { + unset($recipients[$key]); + } + } + + return $recipients; } - private function getUnsubscribed() + public function getUnsubscribed() { $blck_group = GroupQuery::create()->filterByCode('BLACKLIST')->findOne(); @@ -45,7 +57,7 @@ class Newsletter extends BaseNewsletter private function getUserByGroups() { - if (!$this->getGroups()) { + if (!$this->getGroups() || $this->countGroups() == 0) { return array(); } @@ -64,4 +76,278 @@ class Newsletter extends BaseNewsletter return $user_query->find()->toArray(); } + + private function splitEmailList($listing) + { + preg_match_all('`([\w.-]+@[\w.-]+\.[a-z]{2,6})`i', $listing, $matchesarray, PREG_SET_ORDER); + + $lists = array(); + + if (!empty($matchesarray)) { + foreach ($matchesarray as $matches) { + $lists[] = $matches[1]; + } + } + + return $lists; + } + + // *********** Variable dynamique dans CSV ************* + + public function uploadEmailFileVar() + { + if (null === $this->email_file_var && !$this->delete_email_file_var && null !== $this->rollback_email_file_var) { + $this->email_file_var = $this->rollback_email_file_var; // keep the file + return true; + } + + if (null === $this->email_file_var || !is_object($this->email_file_var)) { + return true; // no file to upload + } + + //Delete old file on overload + $this->removeEmailFileVar(); + + $filename = $this->getNewFilename($this->email_file_var->guessExtension()); + + $this->email_file_var_file = $this->email_file_var; + + $this->has_uploaded_email_file_var = true; + + $this->email_file_var = $filename; + + if ($this->has_uploaded_email_file_var) { + + $filename = $this->email_file_var_file->getRealPath(); + $parser = new CsvParser($filename, ';', '"', '\\', true); + $parser->parse(); + $legend = $parser->getLegend(); + + $text = "Vous avez chargez un fichier CSV avec des variables. Ces variables sont accessibles dans les blocks de contenus.
Voici la liste exhaustive des variables disponibles :
    "; + foreach ($legend as $term) { + $text .= "
  • " . $this->tokenize($term) . "
  • "; + } + $text .= "
"; + + $unsubscribed = $this->getUnsubscribed(); + + foreach ($parser->getDatas() as $k => $line) { + $email = trim($line[0]); + if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { + $no_complient[$k] = $email; + } + if (in_array($email, $unsubscribed)) { + $blacklisted[$k] = $email; + } + } + + if (isset($no_complient)) { + $text .= "
Votre fichier contient des adresses emails invalide, voici la liste:
    "; + foreach ($no_complient as $line => $email) { + $text .= "
  • Ligne " . ($line + 2) . ' : ' . $email . "
  • "; + } + $text .= "
"; + } + + if (isset($blacklisted)) { + $text .= "
Votre fichier contient des adresses emails présent dans les désinscrit, voici la liste:
    "; + foreach ($blacklisted as $line => $email) { + $text .= "
  • Ligne " . ($line + 2) . ' : ' . $email . "
  • "; + } + $text .= "
"; + } + + $this->setEmailVarDesc($text); + } + } + + public function tokenize($term) + { + setlocale(LC_CTYPE, 'fr_FR.utf8'); + + $var = $term; + + if (function_exists('iconv')) { + $var = iconv('utf-8', 'us-ascii//TRANSLIT', $var); + } + + // lowercase + if (function_exists('mb_strtolower')) { + $var = mb_strtolower($var); + } else { + $var = strtolower($var); + } + + // remove accents resulting from OSX's iconv + $var = str_replace(array('\'', '`', '^'), '', $var); + + // replace non letter or digits with separator + $var = preg_replace('/\W+/', '_', $var); + + // trim + $var = trim($var, '_'); + + return '%%' . $var . '%%'; + } + + //************ Templating et modèle ******************** + + protected $blocks = array(); + + protected $configuration = null; + + protected $templating = null; + + protected $object; + + public function __construct($template = null) + { + if ($template) { + $this->setTemplate($template); + } + + parent::__construct(); + + $this->configuration = new ModelConfiguration(); + } + + public function getConfiguration() + { + return $this->configuration; + } + + protected function hasBlock($d) + { + return isset($this->blocks[is_object($d) ? $d->getName() : $d]); + } + + public function setBlock(Block $block) + { + $block->setNewsletterId($this->getId()); + + $this->blocks[$block->getName()] = $block; + + return $this; + } + + public function getTemplating() + { + return $this->templating; + } + + public function setTemplating($templating) + { + $this->templating = $templating; + + return $this; + } + + public function save(\PropelPDO $con = null) + { + parent::save($con); + + if (!empty($this->blocks)) { + foreach ($this->blocks as $block) { + $block->save($con); + } + } else { + foreach ($this->getConfiguration()->getBlocks() as $block_configuration) { + $this->getBlock($block_configuration->getName())->save($con); + } + } + + return $this; + } + + public function getBlock($name) + { + if (!$this->getId()) { + return $this->getNewBlock($name); + } + + $qBlock = BlockQuery::create()->filterByName($name)->filterByNewsletterId($this->getId())->findOne(); + + $block = $qBlock ? $qBlock : $this->getNewBlock($name, $this->getId()); + + if (!$this->hasBlock($block->getName())) { + $this->setBlock($block); + } + + return $block; + } + + public function getBlockTitle() + { + return $this->getBlock('title'); + } + + public function getBlockSubtitle() + { + return $this->getBlock('subtitle'); + } + + public function getBlockContent() + { + return $this->getBlock('content'); + } + + public function getBlockSubject() + { + return $this->getBlock('subject'); + } + + public function setBlockTitle(Block $block) + { + return $this->setBlock($block); + } + + public function setBlockSubtitle(Block $block) + { + return $this->setBlock($block); + } + + public function setBlockContent(Block $block) + { + return $this->setBlock($block); + } + + public function setBlockSubject(Block $block) + { + return $this->setBlock($block); + } + + protected function getNewBlock($name, $newsletterId = null) + { + $type = $this->getConfiguration()->getBlock($name)->getType(); + $form = new $type(); + $form_model = $form->getOption('data_class') ? $form->getOption('data_class') : 'Block'; + + $block = new $form_model(); + $block->setname($name); + + if (null !== $newsletterId) { + $block->setNewsletterId($newsletterId); + } + + return $block; + } + + //********** Affichage BO *********** + + public function getRecipientsGroups() + { + return $this->getGroups(); + } + + public function getStats() + { + return $this; + } + + public function getSubject() + { + $subject = $this->getBlock('subject'); + + return ($subject) ? $subject : $this->getName(); + } } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/NewsletterQuery.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/NewsletterQuery.php index 1be825d..af6fbb0 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/NewsletterQuery.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/NewsletterQuery.php @@ -6,4 +6,10 @@ use Trinity\Bundle\NewsletterBundle\Model\om\BaseNewsletterQuery; class NewsletterQuery extends BaseNewsletterQuery { + public function filterByClassKeyValue($value) + { + $value = str_replace('%','',$value); + + return $this->filterByClassKey($value); + } } diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelOneContent.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelOneContent.php new file mode 100644 index 0000000..99893e0 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelOneContent.php @@ -0,0 +1,34 @@ +configuration + ->setBlock('subject', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') + ->setBlock('title', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') + ->setBlock('subtitle', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') + ->setBlock('content1', 'Trinity\Bundle\NewsletterBundle\Form\Type\TinymceAdvancedBlockType') + ; + } + + public function getBlockContent1() + { + return $this->getBlock('content1'); + } + + public function setBlockContent1(Block $block) + { + return $this->setBlock($block); + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/DefaultModel.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelThreeContent.php similarity index 84% rename from vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/DefaultModel.php rename to vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelThreeContent.php index dbe9f10..58af647 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Model/DefaultModel.php +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelThreeContent.php @@ -1,10 +1,11 @@ configuration + ->setBlock('subject', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') ->setBlock('title', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') ->setBlock('subtitle', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') ->setBlock('content1', 'Trinity\Bundle\NewsletterBundle\Form\Type\TinymceAdvancedBlockType') ->setBlock('content2', 'Trinity\Bundle\NewsletterBundle\Form\Type\TinymceAdvancedBlockType') ->setBlock('content3', 'Trinity\Bundle\NewsletterBundle\Form\Type\TinymceAdvancedBlockType') - ; + ; } public function getBlockContent1() diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelTwoContent.php b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelTwoContent.php new file mode 100644 index 0000000..f3e58ca --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Newsletter/ModelTwoContent.php @@ -0,0 +1,50 @@ +configuration + ->setBlock('subject', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') + ->setBlock('title', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') + ->setBlock('subtitle', 'Trinity\Bundle\NewsletterBundle\Form\Type\BlockType') + ->setBlock('content1', 'Trinity\Bundle\NewsletterBundle\Form\Type\TinymceAdvancedBlockType') + ->setBlock('content2', 'Trinity\Bundle\NewsletterBundle\Form\Type\TinymceAdvancedBlockType') + ; + } + + public function getBlockContent1() + { + return $this->getBlock('content1'); + } + + public function setBlockContent1(Block $block) + { + return $this->setBlock($block); + } + + public function getBlockContent2() + { + return $this->getBlock('content2'); + } + + public function setBlockContent2(Block $block) + { + return $this->setBlock($block); + } + + public function getBlockContent3() + { + return $this->getBlock('content3'); + } +} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/schema.xml b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/schema.xml index f3e157f..ddec768 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/schema.xml +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/schema.xml @@ -1,64 +1,57 @@ - - + + + + - - - - - - - + + + + + + + + + + + + + + +
- - - - + + + + - - + +
- - - - - - - - - - - - -
- - - - - - + + + + + + - - - - - - + +
diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.xml b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.xml new file mode 100644 index 0000000..6e96af2 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.xml @@ -0,0 +1,16 @@ + + + + + + Trinity\Bundle\NewsletterBundle\Form\Type\NewsletterType + + + + + + + + diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.yml b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.yml deleted file mode 100644 index b7bc50d..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/config/services.yml +++ /dev/null @@ -1,7 +0,0 @@ -parameters: -# trinity_newsletter.example.class: Trinity\Bundle\NewsletterBundle\Example - -services: -# trinity_newsletter.example: -# class: %trinity_newsletter.example.class% -# arguments: [@service_id, "plain_value", %parameter%] diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/translations/messages.fr.xlf b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/translations/messages.fr.xlf index d509d94..5647d18 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/translations/messages.fr.xlf +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/translations/messages.fr.xlf @@ -56,7 +56,7 @@ New newsletter model - Nouveau modèle de newsletter + NNouvelle lettre d'information Content @@ -76,16 +76,28 @@ Available newsletter models - Modèle de newsletter disponible + Lettres d'informations disponible Edit newsletter model "%name%" - Modifier le modèle de newsletter "%name%" + Modifier la lettre d'information "%name%" model Modèle + + name + Nom + + + Newsletters + Lettres d'informations + + + Block subject + Sujet + diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Default/index.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Default/index.html.twig index 651f016..2ee54df 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Default/index.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Default/index.html.twig @@ -8,20 +8,24 @@

{{ macros.render_nws_block(blocks['subtitle']) }}

- - + + + {% if 'content2' in blocks|keys %} - + {% endif %} + + {% if 'content3' in blocks|keys %} + {% endif %} - - + - + cliquez ici. + +
{{ macros.render_nws_block(blocks['content1']) }}
{{ macros.render_nws_block(blocks['content1']) }}{{ macros.render_nws_block(blocks['content2']) }}
{{ macros.render_nws_block(blocks['content3']) }}
+
Si vous voulez vous désabonnez de la newsletter, - cliquez ici. -
diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/edit.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/edit.html.twig deleted file mode 100644 index f994649..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/edit.html.twig +++ /dev/null @@ -1,9 +0,0 @@ -{% extends "TrinityAdminBundle:BaseAdmin:edit.html.twig" %} - -{% block javascripts %} - {{ parent() }} - - -{% endblock %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/index.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/index.html.twig deleted file mode 100644 index 22e898a..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/index.html.twig +++ /dev/null @@ -1,115 +0,0 @@ -{% extends "TrinityAdminBundle:BaseAdmin:index.html.twig" %} - -{% block body %} - {% set colspan = 0 %} -
-

{{ title|trans() }}

- -
- {% render controller(bundle_name ~ ":" ~ controller_name ~ ":flash") %} - - {% include "TrinityAdminBundle:BaseAdmin:pager.html.twig" %} - - {% for action,template in index_actions %} - {% include template %} - {% endfor %} - -
-
-
- -
-
- - - - {% if batch_actions %} - {% set colspan = colspan + 1 %} - - {% endif %} - - {% for field in fields %} - - {% set colspan = colspan + 1 %} - {% endfor %} - - - - - - - - - - - {% for object in pager %} - - {% if batch_actions %} - - {% endif %} - - {% for key, field in fields %} - - {% endfor %} - - - {% endfor %} - -
- - - {% if fieldsnames %} - {% set label = fieldsnames[field.name] is defined ? fieldsnames[field.name] : field.name %} - {% else %} - {% set label = field.name|trans() %} - {% endif %} - - {% set sort = (app.request.query.get('sort') == field.name ~ ":asc") ? field.name ~ ":desc" : field.name ~ ":asc" %} - - {{ label }} - {% set colspan = colspan + 1 %}
- {% if rankable %} -

{{ 'crud.list.rankable'|trans({}, 'TrinityAdminBundle') }}

- {% endif %} - -
- {% if batch_actions %} -

- {{ 'crud.list.actions.batch'|trans({}, 'TrinityAdminBundle') }} {{ form_widget(form_batch["action"]) }} -

- {% endif %} - - {% if pager|length %} - {{ form_widget(form_batch._token) }} - {% endif %} -
- -
- {% include "TrinityAdminBundle:BaseAdmin:pager.html.twig" %} - - {% for action, template in index_actions %} - {% include template %} - {% endfor %} -
-
- - - - {% set href = list_actions.edit is defined and key == 0 ? path(route_prefix ~ "edit", { id: object.id }) : false %} - - {% if field.name == 'class_key' %} - {{ models[object.classKey]['title'] }} - {% elseif field.name == 'template' %} - {{ templates[object.classKey][object.template] }} - {% else %} - {{ field_render(object, field.method, field.template, href) }} - {% endif %} - - {% for action, template in list_actions %} - {% include template %} - {% endfor%} -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/new.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/new.html.twig deleted file mode 100644 index de4539b..0000000 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/new.html.twig +++ /dev/null @@ -1 +0,0 @@ -{% extends "TrinityAdminBundle:BaseAdmin:new.html.twig" %} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Newsletter/subscribe.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Newsletter/subscribe.html.twig index b47d649..3cce894 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Newsletter/subscribe.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/Newsletter/subscribe.html.twig @@ -11,6 +11,7 @@ {{ form_errors(form) }} {{ form_row(form.email) }} + {{ form_widget(form.groups) }} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/class_key.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/class_key.html.twig similarity index 100% rename from vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/class_key.html.twig rename to vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/class_key.html.twig diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/edit.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/edit.html.twig index 37d91c5..a33f51c 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/edit.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/edit.html.twig @@ -1 +1,26 @@ {% extends "TrinityAdminBundle:BaseAdmin:edit.html.twig" %} + +{% block body %} +
+ {% include "TrinityAdminBundle:BaseAdmin:editTop.html.twig" %} + +
+
+
+ {% if object.getEmailVarDesc() %} + {{ object.getEmailVarDesc()|raw }} + {% endif %} +
+ {% include "TrinityAdminBundle:BaseAdmin:flash.html.twig" %} + {% include "TrinityAdminBundle:BaseAdmin:editForm.html.twig" %} +
+
+{% endblock %} + +{% block javascripts %} + {{ parent() }} + + +{% endblock %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/index.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/index.html.twig index e0e624d..10134c2 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/index.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/index.html.twig @@ -1 +1,117 @@ {% extends "TrinityAdminBundle:BaseAdmin:index.html.twig" %} + +{% block body %} + {% set colspan = 0 %} +
+

{{ title|trans() }}

+ +
+ {% render controller(bundle_name ~ ":" ~ controller_name ~ ":flash") %} + + {% include "TrinityAdminBundle:BaseAdmin:pager.html.twig" %} + + {% for action,template in index_actions %} + {% include template %} + {% endfor %} + +
+
+
+ +
+
+ + + + {% if batch_actions %} + {% set colspan = colspan + 1 %} + + {% endif %} + + {% for field in fields %} + + {% set colspan = colspan + 1 %} + {% endfor %} + + + + + + + + + + + {% for object in pager %} + + {% if batch_actions %} + + {% endif %} + + {% for key, field in fields %} + + {% endfor %} + + + {% endfor %} + +
+ + + {% if fieldsnames %} + {% set label = fieldsnames[field.name] is defined ? fieldsnames[field.name] : field.name %} + {% else %} + {% set label = field.name|trans() %} + {% endif %} + + {% set sort = (app.request.query.get('sort') == field.name ~ ":asc") ? field.name ~ ":desc" : field.name ~ ":asc" %} + + {{ label }} + {% set colspan = colspan + 1 %}
+ {% if rankable %} +

{{ 'crud.list.rankable'|trans({}, 'TrinityAdminBundle') }}

+ {% endif %} + +
+ {% if batch_actions %} +

+ {{ 'crud.list.actions.batch'|trans({}, 'TrinityAdminBundle') }} {{ form_widget(form_batch["action"]) }} +

+ {% endif %} + + {% if pager|length %} + {{ form_widget(form_batch._token) }} + {% endif %} +
+ +
+ {% include "TrinityAdminBundle:BaseAdmin:pager.html.twig" %} + + {% for action, template in index_actions %} + {% include template %} + {% endfor %} +
+
+ + + + {% set href = list_actions.edit is defined and key == 0 ? path(route_prefix ~ "edit", { id: object.id }) : false %} + + {% if field.name == 'class_key' %} + {{ models[object.classKey]['title'] }} + {% elseif field.name == 'template' %} + {% if templates[object.classKey] is defined and object.template %} + {{ templates[object.classKey][object.template] }} + {% endif %} + {% else %} + {{ field_render(object, field.method, field.template, href) }} + {% endif %} + + {% for action, template in list_actions %} + {% include template %} + {% endfor%} +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listPreview.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listPreview.html.twig index d29bfc8..adadaf5 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listPreview.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listPreview.html.twig @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listSend.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listSend.html.twig index ff8b928..1746d38 100644 --- a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listSend.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/listSend.html.twig @@ -1,5 +1,11 @@ +  +  {% if object.sentAt == null %} - - - + + + +{% else %} + + + {% endif %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/recipients_groups.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/recipients_groups.html.twig new file mode 100644 index 0000000..9bb70b1 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/recipients_groups.html.twig @@ -0,0 +1,9 @@ +{% if value %} +
    + {% for group in value %} +
  • + {{ group.name }} +
  • + {% endfor %} +
+{% endif %} \ No newline at end of file diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/stats.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/stats.html.twig new file mode 100644 index 0000000..e2a3343 --- /dev/null +++ b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/stats.html.twig @@ -0,0 +1,3 @@ +{% if object.sentAt %} + {{ object.recipientsNumber }} destinataires dont {{ object.blacklistNumber }} désinscrit (blacklist) +{% endif %} diff --git a/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/template.html.twig b/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/template.html.twig similarity index 100% rename from vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/ModelAdmin/template.html.twig rename to vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Resources/views/NewsletterAdmin/template.html.twig diff --git a/vendor/trinity/src/Trinity/Bundle/NotificationBundle/Notifier/BasicNotifier.php b/vendor/trinity/src/Trinity/Bundle/NotificationBundle/Notifier/BasicNotifier.php index 11f2139..fd79596 100644 --- a/vendor/trinity/src/Trinity/Bundle/NotificationBundle/Notifier/BasicNotifier.php +++ b/vendor/trinity/src/Trinity/Bundle/NotificationBundle/Notifier/BasicNotifier.php @@ -68,14 +68,20 @@ class BasicNotifier extends AbstractNotifier return $user; } - public function notify($template, array $data = array()) + public function notify($template = null, array $data = array()) { $notification = $this->getNewNotification(); - $template = $this->loadTemplate($template); - $data = array_merge($this->getDefaultData(), $data); - $content = $this->twig->render($template->getContent(), $data); - $logContent = $this->twig->render($template->getLogContent(), $data); + $content = ''; + + if($template) { + $template = $this->loadTemplate($template); + $data = array_merge($this->getDefaultData(), $data); + $content = $this->twig->render($template->getContent(), $data); + $logContent = $this->twig->render($template->getLogContent(), $data); + } else { + $logContent = implode(' / ', $data); + } $notification ->setContentRender($content) diff --git a/vendor/trinity/src/Trinity/Bundle/UserBundle/Resources/views/Security/Admin/login.html.twig b/vendor/trinity/src/Trinity/Bundle/UserBundle/Resources/views/Security/Admin/login.html.twig index 27c9e5f..42c672a 100644 --- a/vendor/trinity/src/Trinity/Bundle/UserBundle/Resources/views/Security/Admin/login.html.twig +++ b/vendor/trinity/src/Trinity/Bundle/UserBundle/Resources/views/Security/Admin/login.html.twig @@ -43,3 +43,6 @@ {% endblock body %} + +{% block javascripts %} +{% endblock %} \ No newline at end of file