diff --git a/application/modules/admin/controllers/CmsController.php b/application/modules/admin/controllers/CmsController.php index 134c25d8cc2c3f24c67e12aa18ff8fe0112653f0..084f3c10c879a89e75f0b48bec3805bfc7052098 100644 --- a/application/modules/admin/controllers/CmsController.php +++ b/application/modules/admin/controllers/CmsController.php @@ -23,6 +23,7 @@ class Admin_CmsController extends ZendAfi_Controller_Action { /** @var Class_Bib */ private $_bib; + protected $_article_old_status = null; public function init() { $identity = Class_Users::getLoader()->getIdentity(); @@ -203,8 +204,8 @@ class Admin_CmsController extends ZendAfi_Controller_Action { if ($this->_isArticleSaved($article)) { if($id_module = $this->_getParam('id_module')) $this->updateConfigBoiteNews($id_module,$article); - - $this->_helper->notify('Article ajouté '.$article->getNotifyMessage()); + $this->_notifyArticleChanged($article); + $this->_helper->notify('Article ajouté'); $this->_redirectClose(sprintf('admin/cms/newsedit/id/%d', $article->getId())); return; } @@ -229,7 +230,7 @@ class Admin_CmsController extends ZendAfi_Controller_Action { public function newseditAction() { $article = Class_Article::getLoader()->find((int)$this->_getParam('id')); - $article->setOldStatus($article->getStatus()); + $this->_article_old_status = $article->getStatus(); if (null === ($article->getCategorie()->getBib())) { $article->getCategorie()->setBib($this->_bib); } @@ -239,7 +240,8 @@ class Admin_CmsController extends ZendAfi_Controller_Action { } if ($this->_isArticleSaved($article)) { - $this->_helper->notify('Article sauvegardé '.$article->getNotifyMessage()); + $this->_notifyArticleChanged($article); + $this->_helper->notify('Article sauvegardé '); $this->_redirectClose(sprintf('admin/cms/newsedit/id/%d', $article->getId())); return; } @@ -272,7 +274,6 @@ class Admin_CmsController extends ZendAfi_Controller_Action { * @return bool */ protected function _isArticleSaved($article) { - $article->setView($this->view); if ($this->_request->isPost()) { $post = $this->_request->getPost(); @@ -299,6 +300,100 @@ class Admin_CmsController extends ZendAfi_Controller_Action { } + protected function _notifyArticleChanged($article) { + $this->_sendMailWhenUpdatedStatusToValidationPending($article); + $this->_sendMailWhenUpdatedStatusToRefused($article); + } + + + protected function _sendMailWhenUpdatedStatusToRefused($article) { + if ($this->_article_old_status != Class_Article::STATUS_REFUSED && + $article->getStatus() == Class_Article::STATUS_REFUSED) { + $this->_sendMailToAuteur($article); + } + } + + + protected function _sendMailWhenUpdatedStatusToValidationPending($article) { + if ($this->_article_old_status != Class_Article::STATUS_VALIDATION_PENDING && + $article->getStatus() == Class_Article::STATUS_VALIDATION_PENDING) { + $this->_sendMailToAdmin($article); + } + } + + + protected function _sendMailToAuteur($article) { + $mail = new ZendAfi_Mail('utf8'); + if(!$article->getAuteur()) { + $this->_helper->notify('Mail non envoyé: article sans auteur'); + return; + } + if(!$mail_address = $article->getAuteur()->getMail()) { + $this->_helper->notify('Mail non envoyé: '.$article->getNomCompletAuteur().' sans mail.'); + return; + } + + $body = $article->getRefusMessage(); + $body = str_replace('TITRE_ARTICLE', + $article->getTitre(), + $body); + $body = str_replace('URL_ARTICLE', + $this->view->absoluteUrl($article->getUrl(), null, true), + $body); + + $mail + ->setFrom('no-reply@no-reply-afi.fr') + ->addTo($mail_address) + ->setSubject(quoted_printable_decode('[AFI-OPAC] Refus de l\'article '.$article->getTitre())) + ->setBodyText($body,'utf-8',Zend_Mime::ENCODING_8BIT); + if($this->_sendMail($mail)) + $this->_helper->notify('Mail envoyé à : '.$mail_address); + + } + + + protected function _sendMailToAdmin($article) { + $mail = new ZendAfi_Mail('utf8'); + $all_admins=Class_Users::findAllBy(['role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL]); + $mails=[]; + foreach ($all_admins as $admin) { + if (!$mail_admin=$admin->getMail()) + continue; + $mails[]=$mail_admin; + } + + if(!$mail_address = implode(',',$mails)) + return; + $body = Class_AdminVar::getWorkflowTextMailArticlePending(); + $body = str_replace('TITRE_ARTICLE', + $article->getTitre(), + $body); + $body = str_replace('URL_ARTICLE', + $this->view->absoluteUrl($article->getUrl(), null, true), + $body); + + $mail + ->setFrom('no-reply@no-reply-afi.fr') + ->addTo($mail_address) + ->setSubject('[AFI-OPAC] Validation d\'article en attente: '.$article->getTitre()) + ->setBodyText($body); + + if($this->_sendMail($mail)) + $this->_helper->notify('Mail de validation envoyé aux administrateurs.'); + } + + + protected function _sendMail($mail) { + try { + $mail->send(); + return true; + }catch (Exception $e) { + $this->_helper->notify('Mail non envoyé: vérifier la configuration du serveur de mail.'); + return false; + } + } + + public function deleteAction() { if ( null !== ( diff --git a/library/Class/Article.php b/library/Class/Article.php index dfbd7694e34e8d1a1a48f1a2fc4ffc7905cee53a..9fa5be44023c02a65cddd5e1e0183a5720d2d691 100644 --- a/library/Class/Article.php +++ b/library/Class/Article.php @@ -410,12 +410,9 @@ class Class_Article extends Storm_Model_Abstract { self::STATUS_REFUSED => 'Refusé', self::STATUS_ARCHIVED => 'Archivé']; - protected $_view; protected $_loader_class = 'ArticleLoader'; protected $_table_name = 'cms_article'; protected $_table_primary = 'ID_ARTICLE'; - protected $old_status; - protected $notify_message; protected $_has_many = ['traductions' => ['model' => 'Class_Article', 'role' => 'article_original', 'dependents' => 'delete'], @@ -567,14 +564,10 @@ class Class_Article extends Storm_Model_Abstract { public function __construct() { - $this->_default_attribute_values['langue'] = Class_AdminVar::getDefaultLanguage(); } - public function getNotifyMessage() { - return $this->notify_message; - } /** * @return string @@ -708,11 +701,6 @@ class Class_Article extends Storm_Model_Abstract { $this->setDateMaj($date->DateTimeDuJour()); } - public function setOldStatus($status) { - $this->old_status = $status; - } - - public function beforeSave() { $this->_updateDateMaj(); @@ -720,92 +708,6 @@ class Class_Article extends Storm_Model_Abstract { $this->setDateCreation($this->getDateMaj()); } - public function afterSave() { - - $this->_sendMailWhenUpdatedStatusToValidationPending(); - $this->_sendMailWhenUpdatedStatusToRefused(); - } - - - protected function _sendMailWhenUpdatedStatusToRefused() { - if ($this->old_status != self::STATUS_REFUSED && - $this->getStatus() == self::STATUS_REFUSED) { - $this->_sendMailToAuteur(); - } - } - - - protected function _sendMailWhenUpdatedStatusToValidationPending() { - if ($this->old_status != self::STATUS_VALIDATION_PENDING && - $this->getStatus() == self::STATUS_VALIDATION_PENDING) { - $this->_sendMailToAdmin(); - } - } - - - protected function _sendMailToAuteur() { - - $mail = new ZendAfi_Mail('utf8'); - if(!$this->getAuteur()) { - $this->notify_message.= 'Mail non envoyé: article sans auteur.'; - return; - } - if(!$mail_address = $this->getAuteur()->getMail()) { - $this->notify_message.= 'Mail non envoyé: '.$this->getNomCompletAuteur().' sans mail.'; - return; - } - - $body = $this->getRefusMessage(); - $body = str_replace('TITRE_ARTICLE',$this->getTitre(),$body); - $body = str_replace('URL_ARTICLE',$this->getStaticUrl(),$body); - - $mail - ->setFrom('no-reply@no-reply-afi.fr') - ->addTo($mail_address) - ->setSubject(quoted_printable_decode('[AFI-OPAC] Refus de l\'article '.$this->getTitre())) - ->setBodyText($body,'utf-8',Zend_Mime::ENCODING_8BIT); - if($this->_sendMail($mail)) - $this->notify_message.= 'Mail envoyé à : '.$mail_address; - - } - - - protected function _sendMailToAdmin() { - $mail = new ZendAfi_Mail('utf8'); - $all_admins=Class_Users::findAllBy(['role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL]); - $mails=[]; - foreach ($all_admins as $admin) { - if (!$mail_admin=$admin->getMail()) - continue; - $mails[]=$mail_admin; - } - - if(!$mail_address = implode(',',$mails)) - return; - $body = Class_AdminVar::getWorkflowTextMailArticlePending(); - $body = str_replace('TITRE_ARTICLE',$this->getTitre(),$body); - $body = str_replace('URL_ARTICLE',$this->getStaticUrl(),$body); - - $mail - ->setFrom('no-reply@no-reply-afi.fr') - ->addTo($mail_address) - ->setSubject('[AFI-OPAC] Validation d\'article en attente: '.$this->getTitre()) - ->setBodyText($body); - if($this->_sendMail($mail)) - $this->notify_message.= 'Mail de validation envoyé aux administrateurs.'; - } - - - protected function _sendMail($mail) { - try { - $mail->send(); - return true; - }catch (Exception $e) { - $this->notify_message.= 'Mail non envoyé: vérifier la configuration du serveur de mail.'; - return false; - } - - } /** * @param string $str_date @@ -940,14 +842,6 @@ class Class_Article extends Storm_Model_Abstract { } - public function getStaticUrl() { - return $this->_view->absoluteUrl(['controller'=>'cms', - 'module'=>'opac', - 'action'=>'articleview', - 'id'=> $this->getId()],null,true); - } - - /** * @return string */ @@ -1102,11 +996,6 @@ class Class_Article extends Storm_Model_Abstract { } - public function setView($view) { - $this->_view = $view; - } - - public function getProfil() { if(!$categorie = $this->getCategorie()) return null; diff --git a/tests/application/modules/AbstractControllerTestCase.php b/tests/application/modules/AbstractControllerTestCase.php index 26ac23aee575e5839e63ecd3cb4db94411647068..e0ae39f3a335ac5e32bc47e71b2d6d7fa3d13117 100644 --- a/tests/application/modules/AbstractControllerTestCase.php +++ b/tests/application/modules/AbstractControllerTestCase.php @@ -259,8 +259,11 @@ abstract class AbstractControllerTestCase extends Zend_Test_PHPUnit_ControllerTe public function assertFlashMessengerContentContains($value, $message = '') { $messages = $this->_getFlashMessengerMessages(); foreach($messages as $message_value){ - $this->assertContains($value, $message_value, $message); + if (false!==strpos($message_value, $value)) + return; } + + $this->fail("Flash messenger does not contains: ".$value.". ".$message); } diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php index 53aed740a79a99e0f813e0242c78adfcb694bd5c..4b958ef736b7ebac6c2e1150fe5d1bd166885f53 100644 --- a/tests/application/modules/admin/controllers/CmsControllerTest.php +++ b/tests/application/modules/admin/controllers/CmsControllerTest.php @@ -147,7 +147,9 @@ abstract class CmsControllerTestCase extends Admin_AbstractControllerTestCase { $this->concert = Class_Article::newInstanceWithId(4, ['categorie' => $this->cat_evenements, 'titre' => 'Erik Truffaz en concert', - 'auteur' => Class_Users::newInstanceWithIdAssertSave(2,['Nom' => 'Tom et Jerry','password'=>'toto','login'=>'tom']), + 'auteur' => Class_Users::newInstanceWithIdAssertSave(2,['Nom' => 'Tom et Jerry', + 'password'=>'toto', + 'login'=>'tom']), 'description' => 'Venez nombreux ici: <img src="'.BASE_URL.'/images/bonlieu.jpg" />', 'contenu' => 'à Bonlieu. <img src="'.BASE_URL.'/images/truffaz.jpg" />', 'debut' => '2011-03-20', @@ -1330,7 +1332,27 @@ class CmsControllerNewsAddActionPostWithoutWorkflowTest extends CmsControllerTes } -class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerTestCase { + + +abstract class CmsControllerWorkflowTestCase extends CmsControllerTestCase { + public function setUp() { + parent::setUp(); + + $this->article_wrapper + ->whenCalled('find') + ->answers($this->concert); + + $this->mock_transport = new MockMailTransport(); + Zend_Mail::setDefaultTransport($this->mock_transport); + Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); + + Class_AdminVar::getLoader()->newInstanceWithId('WORKFLOW')->setValeur('1'); + } +} + + + +class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerWorkflowTestCase { /** @var Class_Article */ protected $_article; protected $mock_transport; @@ -1350,15 +1372,6 @@ class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerTestCa public function setUp() { parent::setUp(); $this->_basePostDatas['auteur']=$this->_laurent; - $this->article_wrapper - ->whenCalled('find') - ->answers($this->concert); - - $this->mock_transport = new MockMailTransport(); - Zend_Mail::setDefaultTransport($this->mock_transport); - Class_Profil::getCurrentProfil()->setMailSite('laurent@afi-sa.fr'); - - Class_AdminVar::getLoader()->newInstanceWithId('WORKFLOW')->setValeur('1'); } @@ -1394,8 +1407,8 @@ class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerTestCa public function newArticleSavedWithStatusAValiderShouldSendMail() { $data = $this->_basePostDatas; $data['status'] = Class_Article::STATUS_VALIDATION_PENDING; - $this->getRequest()->setMethod('POST')->setPost($data); - $this->dispatch('/admin/cms/newsadd/id_cat/23'); + $this->postDispatch('/admin/cms/newsadd/id_cat/23', + $data); $this->_article = $this->article_wrapper->getFirstAttributeForLastCallOn('save'); $this->assertEquals(['laurent@afi-sa.fr', 'bernard@afi-sa.fr'],$this->mock_transport->getSentMails()[0]->getRecipients()); } @@ -1466,61 +1479,60 @@ class CmsControllerNewsAddActionPostWithWorkflowTest extends CmsControllerTestCa } -class CmsControllerWorkflowArticleRefusedTest extends CmsControllerNewsAddActionPostWithWorkflowTest { - - public function setup() { - parent::setup(); - + + + +class CmsControllerWorkflowArticleRefusedTest extends CmsControllerWorkflowTestCase { + public function setUp() { + parent::setUp(); + $this->concert + ->setStatus(Class_Article::STATUS_DRAFT) + ->setAuteur(Class_Users::newInstanceWithId(1,['mail'=>'bernard@afi-sa.fr'])); } - public function postArticleRefuser() { - $this->concert->setStatus(Class_Article::STATUS_DRAFT); - $this->concert->setAuteur(Class_Users::newInstanceWithId(1,['mail'=>'bernard@afi-sa.fr'])); + public function postArticleRefuser() { + $datas = [ + 'titre' => 'Katsuhiro Otomo en dédicace !', + 'debut' => '', + 'fin' => '', + 'events_debut' => '', + 'events_fin' => '', + 'ckeditor_description' => '', + 'id_cat' => 23, + 'ckeditor_contenu' => 'Ne manquez pas cet évènement.', + 'status' => Class_Article::STATUS_REFUSED + ]; - $data = $this->_basePostDatas; - $this->getRequest()->setMethod('POST')->setPost($data); - $this->dispatch('/admin/cms/newsadd/id/230'); - $data['status'] = Class_Article::STATUS_REFUSED; - $this->getRequest()->setMethod('POST')->setPost($data); - $this->dispatch('/admin/cms/newsedit/id_cat/230'); + $this->postDispatch('/admin/cms/newsedit/id/4', + $datas); } /** @test */ public function statusBrouillonUpdatedToRefuserShouldSendMail() { + $this->concert->getAuteur()->setMail('tom@acme.com'); $this->postArticleRefuser(); - $this->_article = $this->article_wrapper->getFirstAttributeForLastCallOn('save'); - $this->assertEquals([$this->_article->getAuteur()->getMail()],$this->mock_transport->getSentMails()[0]->getRecipients()); + $this->assertEquals(['tom@acme.com'], + $this->mock_transport->getSentMails()[0]->getRecipients()); } /** @test */ public function statusBrouillonUpdatedToRefuserAndAuteurNotSetShouldNotifyMessagePasDAuteur() { - $this->_basePostDatas['auteur']=''; + $this->concert->setAuteur(null); $this->postArticleRefuser(); - $this->_article = $this->article_wrapper->getFirstAttributeForLastCallOn('save'); - $this->assertEquals($this->_article->getNotifyMessage(), 'Mail non envoyé: article sans auteur.'); + $this->assertFlashMessengerContentContains('Mail non envoyé: article sans auteur'); } /** @test */ public function statusBrouillonUpdatedToRefuserAndAuteurWithOutMailShouldNotifyMessagePasDeMail() { - $this->_basePostDatas['auteur']->setMail('')->setLogin('Russe'); + $this->concert->getAuteur()->setMail('')->setLogin('Russe'); $this->postArticleRefuser(); - $this->_article = $this->article_wrapper->getFirstAttributeForLastCallOn('save'); - $this->assertEquals($this->_article->getNotifyMessage(), 'Mail non envoyé: Russe sans mail.'); + $this->assertFlashMessengerContentContains('Mail non envoyé: Russe sans mail.'); } - /** @test */ - public function statusBrouillonUpdatedToRefuseWithAuteurAndMailShouldNotifyMessageEnvoyeWithRecipient() { - $this->postArticleRefuser(); - $this->_article = $this->article_wrapper->getFirstAttributeForLastCallOn('save'); - $this->assertEquals($this->_article->getNotifyMessage(), 'Mail envoyé à : laurent@afi-sa.fr'); - } - - - /** @test */ public function sentMailToUserWhenRefusedShouldContainsDefaultTitle() { $this->postArticleRefuser();