diff --git a/vendor/trinity/src/Trinity/.svn/wc.db b/vendor/trinity/src/Trinity/.svn/wc.db
index 1aaf292..9058a1e 100644
Binary files a/vendor/trinity/src/Trinity/.svn/wc.db and b/vendor/trinity/src/Trinity/.svn/wc.db differ
diff --git a/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.en.yml b/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.en.yml
index 952ba77..fe64a84 100644
--- a/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.en.yml
+++ b/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.en.yml
@@ -135,3 +135,8 @@ trinity:
title: 'New'
edit:
title: "Edition"
+
+ akamai:
+ akamaiadmin:
+ index:
+ title: "Akamai purge request"
\ No newline at end of file
diff --git a/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.fr.yml b/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.fr.yml
index ce67e38..8d2275c 100644
--- a/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.fr.yml
+++ b/vendor/trinity/src/Trinity/Bundle/AdminBreadcrumbsBundle/Resources/translations/TrinityAdminBreadcrumbsBundle.fr.yml
@@ -135,3 +135,8 @@ trinity:
title: "Nouveau"
edit:
title: "Édition"
+
+ akamai:
+ akamaiadmin:
+ index:
+ title: "Akamai purge request"
\ No newline at end of file
diff --git a/vendor/trinity/src/Trinity/Bundle/AdminBundle/Controller/BaseAdminController.php b/vendor/trinity/src/Trinity/Bundle/AdminBundle/Controller/BaseAdminController.php
index e8ee4a7..ba89ed5 100644
--- a/vendor/trinity/src/Trinity/Bundle/AdminBundle/Controller/BaseAdminController.php
+++ b/vendor/trinity/src/Trinity/Bundle/AdminBundle/Controller/BaseAdminController.php
@@ -770,7 +770,7 @@ class BaseAdminController extends Controller
}
/**
- * @Route("/jsTranslations.js", name="TrinityAdminBundle_jsTranslation")
+ * @Route("/admin/jsTranslations", name="TrinityAdminBundle_jsTranslation")
* @Template("TrinityAdminBundle:BaseAdmin:jsTranslation.html.twig")
*/
public function jsTranslationAction(Request $request)
diff --git a/vendor/trinity/src/Trinity/Bundle/AdminBundle/Resources/views/BaseAdmin/form.html.twig b/vendor/trinity/src/Trinity/Bundle/AdminBundle/Resources/views/BaseAdmin/form.html.twig
index 68de9f3..76a8528 100644
--- a/vendor/trinity/src/Trinity/Bundle/AdminBundle/Resources/views/BaseAdmin/form.html.twig
+++ b/vendor/trinity/src/Trinity/Bundle/AdminBundle/Resources/views/BaseAdmin/form.html.twig
@@ -29,20 +29,44 @@
{% if '*' in fieldsets[key] %}
{% 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
+