deblan.tv/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterAdminController.php

195 lines
6.3 KiB
PHP
Raw Normal View History

2015-03-02 21:57:49 +01:00
<?php
namespace Trinity\Bundle\NewsletterBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
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 Trinity\Bundle\NewsletterBundle\Configuration\NewsletterCrudConfiguration as CrudConfiguration;
use Symfony\Component\HttpFoundation\Request;
use Trinity\Bundle\AdminBundle\Controller\BaseAdminController;
use Trinity\Bundle\UserBundle\Flash\FlashError;
use Trinity\Bundle\UserBundle\Flash\FlashSuccess;
use \FOS\UserBundle\Propel\UserQuery;
use \FOS\UserBundle\Propel\GroupQuery;
/**
* @Route("/admin/newsletter")
*/
class NewsletterAdminController extends BaseAdminController
{
public function __construct()
{
$this->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);
}
}