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) { $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="TrinityNewsletterBundleNewsletterAdmin_new") * @Template() */ public function newAction(Request $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(), ); } /** * @Route("/edit/{id}", name="TrinityNewsletterBundleNewsletterAdmin_edit") * @Template() * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Newsletter") */ 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(); 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(), ); } /** * @Route("/remove/{id}/{token}", name="TrinityNewsletterBundleNewsletterAdmin_remove") * @Template() * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Newsletter") */ public function removeAction($object, $token, Request $request) { return parent::removeAction($object, $token, $request); } /** * @Route("/batch", name="TrinityNewsletterBundleNewsletterAdmin_batch") * @Template() * @Method({"POST"}) */ public function batchAction(Request $request) { return parent::batchAction($request); } /** * @Route("/filter/clear", name="TrinityNewsletterBundleNewsletterAdmin_filter_clear") * @Template() */ public function clearFilterAction(Request $request) { return parent::clearFilterAction($request); } /** * @Route("/send/{id}", name="TrinityNewsletterBundleNewsletterAdmin_send") * @Template() * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Newsletter") */ 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()); return $this->redirect($this->generateUrl('TrinityNewsletterBundleNewsletterAdmin_index')); } 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')); $blocks = array(); foreach ($object->getBlocks() as $block) { $blocks[$block->getName()] = $block; } $message = \Swift_Message::newInstance() ->setSubject($object->getSubject()) ->setFrom(array($object->getSenderEmail() => $object->getSenderName())); if ($object->getEmailFileVar() && $object->getEmailVarDesc()) { $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++; } $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); } } $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')); } protected function copyObjects($query, array $pks) { foreach ($pks as $pk) { $query->findPK($pk) ->copy(true) ->setSentAt(null) ->setCreatedAt(new \DateTime('now')) ->save(); } } private function generateUnsubscribeToken($email) { $key = '1ag4jf96znv07m459kf29kfZl5I9fnvT8dfg0pza114bM5fg6Kl'; $iv = '3452562488791564'; $token = openssl_encrypt($email, 'aes128', $key, false, $iv); return $token; } /** * @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) { $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)); } return false; } }