configuration = new CrudConfiguration(); } /** * @Route("/list/{page}", name="TrinityNewsletterBundleNewsletterAdmin_index", defaults={"page" = "1"}, requirements={"page" = "\d+"}) * @Template() */ public function indexAction($page, Request $request) { return parent::indexAction($page, $request); } /** * @Route("/new", name="TrinityNewsletterBundleNewsletterAdmin_new") * @Template() */ public function newAction(Request $request) { return parent::newAction($request); } /** * @Route("/edit/{id}", name="TrinityNewsletterBundleNewsletterAdmin_edit") * @Template() * @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Newsletter") */ public function editAction($object, Request $request) { return parent::editAction($object, $request); } /** * @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) { 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->getModelId()) { $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(); $blocks = array(); foreach ($object->getModel()->getBlocks() as $block) { $blocks[$block->getName()] = $block; } $message = \Swift_Message::newInstance() ->setSubject($object->getName()) ->setFrom(array($object->getSenderEmail() => $object->getSenderName())) ; foreach ($object->getRecipients() as $email) { $user = UserQuery::create()->filterByEmail($email)->findOne(); if (!$user) { $user = $this->generateNewsletterUser($email); } if (!$user->getUnsubscribeToken()) { $user->setUnsubscribeToken($this->generateUnsubscribeToken()); $user->save(); } $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()); 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 generateNewsletterUser($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(); return $user; } private function generateUnsubscribeToken() { $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; } } if (false === $bytes) { $bytes = hash('sha256', uniqid(mt_rand(), true), true); } return base_convert(bin2hex($bytes), 16, 36); } }