210 lines
6.9 KiB
PHP
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;
|
|
}
|
|
}
|