195 lines
6.3 KiB
PHP
195 lines
6.3 KiB
PHP
|
<?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);
|
||
|
}
|
||
|
}
|