deblan.tv/vendor/trinity/src/Trinity/Bundle/NewsletterBundle/Controller/NewsletterController.php
2016-06-20 11:37:14 +02:00

210 lines
6.9 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 FOS\UserBundle\Propel\UserQuery;
use FOS\UserBundle\Propel\GroupQuery;
use FOS\UserBundle\Propel\User;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\NotEqualTo;
use Trinity\Bundle\NewsletterBundle\Model\NewsletterQuery;
class NewsletterController extends Controller
{
/**
* @Route("/newsletter/show/{id}", name="newsletter_preview")
* @Template()
* @ParamConverter("object", class="Trinity\Bundle\NewsletterBundle\Model\Newsletter")
*/
public function indexAction($object)
{
if (!$object) {
throw $this->createNotFoundException('This newsletter does not have a defined template.');
}
$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/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;
}
}