diff --git a/VERSIONS_HOTLINE/140061 b/VERSIONS_HOTLINE/140061 new file mode 100644 index 0000000000000000000000000000000000000000..7683b7755455709c83bb248699fca14f862ad0d9 --- /dev/null +++ b/VERSIONS_HOTLINE/140061 @@ -0,0 +1 @@ + - ticket #140061 : Magasin de thèmes : Correction du filtrage des articles dans les carrousels. \ No newline at end of file diff --git a/library/Class/Article/Loader.php b/library/Class/Article/Loader.php index a57bfc23575e4b6ea670161c25eb2b5012a77cf6..42ab4c257f46181d76779fac01295cccc67f8973 100644 --- a/library/Class/Article/Loader.php +++ b/library/Class/Article/Loader.php @@ -28,7 +28,8 @@ class Class_Article_Loader extends Storm_Model_Loader { ORDER_COMMENTS = 'CommentCount'; - protected $_all_articles; + protected $_all_articles, + $_filter_by_local_callback; public function newFromRow($row) { @@ -82,7 +83,9 @@ class Class_Article_Loader extends Storm_Model_Loader { 'place_town' => null, 'display_mode' => 'Title', 'custom_fields' => [], - 'tag' => '' ]; + 'tag' => '', + 'filter_by_workflow' => false, + 'filter_by_local' => false]; } @@ -94,7 +97,6 @@ class Class_Article_Loader extends Storm_Model_Loader { $preferences = array_merge($this->getArticlesByPreferencesDefaults(), $preferences); - $select = Class_AdminVar::isModuleEnabled('ENABLE_ARTICLES_TIMINGS') ? new Class_Article_SelectWithTimings($this) : new Class_Article_Select($this); @@ -109,8 +111,14 @@ class Class_Article_Loader extends Storm_Model_Loader { if ((new ZendAfi_Validate_DateFormat)->isValid($event_date)) $articles = $this->_filterByDay($event_date, $articles); - $this->_all_articles = $articles = $this->_sortArticles($articles, - $select->getSortOrder()); + $articles = $this->_filter_by_local_callback + ? call_user_func($this->_filter_by_local_callback, $articles) + : $articles; + + $this->_all_articles = + $articles = $this->_sortArticles($articles, + $select->getSortOrder()); + if ( ($select->getSortOrder() == static::ORDER_SELECTION) @@ -256,4 +264,8 @@ class Class_Article_Loader extends Storm_Model_Loader { 'status'=>3])); } + + public function setFilterByLocalCallback($callback) { + $this->_filter_by_local_callback = $callback; + } } diff --git a/library/Class/Article/Select.php b/library/Class/Article/Select.php index 670a1aac497fa6127a5a829624b415ca8da3514b..191a7dab3649de8ea9f0315659b60f5bfe1a1a1a 100644 --- a/library/Class/Article/Select.php +++ b/library/Class/Article/Select.php @@ -34,7 +34,9 @@ class Class_Article_Select { $_events_only, $_published, $_display_mode, - $_place_town; + $_place_town, + $_filter_by_workflow, + $_filter_by_local; public function __construct($article_loader) { @@ -89,6 +91,8 @@ class Class_Article_Select { $this->_display_mode = $preferences['display_mode']; $this->_custom_fields = $preferences['custom_fields']; $this->_place_town = $preferences['place_town']; + $this->_filter_by_workflow = $preferences['filter_by_workflow']; + $this->_filter_by_local = $preferences['filter_by_local']; return $this; } @@ -107,6 +111,7 @@ class Class_Article_Select { ->_whereEventEndAfter($this->_event_end_after) ->_filterByLangue() ->_filterByStatus() + ->_filterByLocal() ->_orderAndLimit() ->_getSelect(); } @@ -199,8 +204,8 @@ class Class_Article_Select { protected function _selectAllEvents() { return $this - ->_selectWhereEventStart('%s IS NOT NULL') - ->_selectWhereEventEnd('%s IS NOT NULL'); + ->_selectWhereEventStart('%s IS NOT NULL') + ->_selectWhereEventEnd('%s IS NOT NULL'); } @@ -328,10 +333,10 @@ class Class_Article_Select { : 'asc'; $this->_select - ->join('cms_rank', - 'cms_rank.ID_CMS = cms_article.ID_ARTICLE', - []) - ->order('(cms_rank.abon_nombre_avis + cms_rank.bib_nombre_avis) ' . $order); + ->join('cms_rank', + 'cms_rank.ID_CMS = cms_article.ID_ARTICLE', + []) + ->order('(cms_rank.abon_nombre_avis + cms_rank.bib_nombre_avis) ' . $order); return true; } @@ -361,7 +366,6 @@ class Class_Article_Select { } - /** * @param array $preferences * @return array @@ -416,18 +420,61 @@ class Class_Article_Select { protected function _filterByStatus() { - if (null === $this->_status || !is_array($this->_status)) { + if (null === $this->_select) return $this; - } - if (null === $this->_select) { - return $this; - } + $filters = ($filters = $this->_getFilterByWorkflow()) + ? $filters + : $this->_status; - $this->_select->where('STATUS in (?)', $this->_status); + if ($filters) + $this->_select->where('STATUS in (?)', $filters); return $this; } + protected function _getFilterByWorkflow() { + if (! $this->_filter_by_workflow) + return null; + + if (!Class_AdminVar::isWorkflowEnabled()) + return null; + + $status_filter = [Class_Article::STATUS_VALIDATED]; + + if (Class_Users::isCurrentUserCanAccesBackend()) + $status_filter [] = Class_Article::STATUS_DRAFT; + + if ($this->_status) + $status_filter [] = $this->_status; + + return array_unique($status_filter); + } + + + protected function _filterByLocal() { + if (! $this->_filter_by_local) + return $this; + + if (!Class_AdminVar::isTranslationEnabled()) + return $this; + + if ( ! $langue = Zend_Registry::get('translate')->getLocale()) + return $this; + + $this->_select + ->where('(cms_article.langue = "' . $langue . '" or exists (select \'x\' from cms_article as translation where translation.PARENT_ID = cms_article.ID_ARTICLE and trim(translation.langue) = "' . $langue . '") or cms_article.langue = "" or cms_article.langue is null)'); + + $callback = function ($articles) use ($langue) + { + return array_map(function ($article) use ($langue) { + return $article->getTraductionLangue($langue); + }, + $articles); + }; + + $this->_article_loader->setFilterByLocalCallback($callback); + return $this; + } } diff --git a/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php b/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php index 58d89749e3245e2e3db08012e8f044b8948a3113..62b8fb83e48777ec20a570e2a132b9a979d54da6 100644 --- a/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php +++ b/tests/scenarios/Templates/TemplatesWidgetCarouselTest.php @@ -118,8 +118,38 @@ class TemplatesWidgetCarouselArticlesNotVolatileTest /** @test */ public function withoutLangueShouldDisplayThreeItems() { - Class_AdminVar::set('LANGUES', ''); - $this->dispatch('/index'); - $this->assertXpathCount('//div[contains(@class, "carousel-item")]', '3'); + Class_AdminVar::set('LANGUES', ''); + $this->dispatch('/index'); + $this->assertXpathCount('//div[contains(@class, "carousel-item")]', '3'); } } + + + + +require_once(__DIR__ . '/../../library/Class/ArticleLoaderTest.php'); + + +class TemplatesWidgetCarouselLoaderTestTest extends ArticleLoaderGetArticlesByPreferencesTestCase { + + public function assertQueryEquals($expected) { + $this->assertEquals($expected, + str_replace("\n", "", $this->select->assemble())); + } + + + /** @test */ + public function withFilterByWorkflowShouldFilterByStatus3() { + Class_AdminVar::set('WORKFLOW', 1); + $article = $this->getArticles(['filter_by_workflow' => true]); + $this->assertQueryEquals('SELECT `cms_article`.* FROM `cms_article` WHERE ((DEBUT IS NULL) OR (DEBUT <= CURDATE())) AND ((FIN IS NULL) OR (FIN >= CURDATE())) AND (PARENT_ID=0) AND (STATUS in (3)) ORDER BY `DATE_CREATION` DESC'); + } + + + /** @test */ + public function withFilterByLocalShouldSearchForTranslation() { + Class_AdminVar::set('LANGUES', 'fr;en;es;ro;it'); + $article = $this->getArticles(['filter_by_local' => true]); + $this->assertQueryEquals('SELECT `cms_article`.* FROM `cms_article` WHERE ((DEBUT IS NULL) OR (DEBUT <= CURDATE())) AND ((FIN IS NULL) OR (FIN >= CURDATE())) AND (PARENT_ID=0) AND ((cms_article.langue = "fr" or exists (select \'x\' from cms_article as translation where translation.PARENT_ID = cms_article.ID_ARTICLE and trim(translation.langue) = "fr") or cms_article.langue = "" or cms_article.langue is null)) ORDER BY `DATE_CREATION` DESC'); + } +} \ No newline at end of file