diff --git a/CHANGELOG.md b/CHANGELOG.md index 456460e..95a1c08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,14 @@ # ddMenuBuilder changelog +## Version 1.13b (2018-10-17) +* \* Attention! PHP >= 5.6 is required. +* \* ddMenuBuilder snippet: + * \* Wrong type of “providerParams” was fixed. +* \* ddMenuBuilder class: + * \* Small refactoring. + * \* Optimization: + * \- ddMenuBuilder->generate: Redudnand “array_merge” removed, + * \- ddMenuBuilder->generate: Убран проход по всем документам в дереве который определял где находится активный документ. + ## Version 1.12 (2017-08-30) * \* Menu item active status is no logner depends on the “show_in_menu” children flag. * \+ Added JSON format support for the “providerParams” and “placeholders” parameters. diff --git a/assets/snippets/ddMenuBuilder/ddMenuBuilder.class.php b/assets/snippets/ddMenuBuilder/ddMenuBuilder.class.php index 1904c0b..f0f6bb5 100644 --- a/assets/snippets/ddMenuBuilder/ddMenuBuilder.class.php +++ b/assets/snippets/ddMenuBuilder/ddMenuBuilder.class.php @@ -3,7 +3,7 @@ * modx ddMenuBuilder class * @version 2.1.2 (2017-08-30) * - * @uses PHP >= 5.4. + * @uses PHP >= 5.6. * @uses MODXEvo >= 1.1. * @uses MODXEvo.library.ddTools >= 0.16.1. * @@ -12,6 +12,7 @@ class ddMenuBuilder { private $hereDocId; + private $hereDoc_parents = []; private $templates = [ 'item' => '
  • [+menutitle+]
  • ', 'itemHere' => '
  • [+menutitle+]
  • ', @@ -30,7 +31,7 @@ class ddMenuBuilder { /** * __construct - * @version 1.2.6 (2016-10-24) + * @version 1.3 (2018-09-24) * * @param $params {stdClass} — The object of params. Default: new stdClass(). * @param $params->showPublishedOnly {boolean} — Брать ли только опубликованные документы. Default: true. @@ -63,6 +64,17 @@ public function __construct(stdClass $params = NULL){ $this->hereDocId = $modx->documentIdentifier; } + //Получим все id родителей текущего документа. + $this->hereDoc_parents = [$this->hereDocId]; + $hereDoc_parentId = $this->hereDocId; + + while ($hereDoc_parentId > 0){ + $this->hereDoc_parents[] = $hereDoc_parentId = $modx->getParent($hereDoc_parentId)['id']; + } + $this->hereDoc_parents = array_reverse($this->hereDoc_parents ); + //Не null, а 0 + $this->hereDoc_parents[0] = 0; + //Если шаблоны переданы if (isset($params->templates)){ //Перебираем шаблоны объекта @@ -257,7 +269,7 @@ public function prepareProviderParams($params = []){ /** * generate - * @version 3.0.3 (2017-08-30) + * @version 3.1 (2018-09-24) * * @desc Сторит меню. * @@ -270,9 +282,7 @@ public function prepareProviderParams($params = []){ */ public function generate($params){ //Defaults - $params = (object) array_merge([ - 'depth' => 1 - ], (array) $params); + $params = (object) $params; global $modx; @@ -313,20 +323,19 @@ public function generate($params){ //И для вывода тоже пустые $doc['children'] = $children; - //Если это папка (т.е., могут быть дочерние) - if ($doc['isfolder']){ - //Получаем детей (вне зависимости от того, нужно ли их выводить) - $children = $this->generate([ - 'where' => [ - 'parent' => '`parent` = '.$doc['id'], - //Any hidemenu - 'hidemenu' => '`hidemenu` != 2' - ], - 'depth' => $params->depth - 1 - ]); - - //Если надо выводить глубже - if ($params->depth > 1){ + //Если надо выводить глубже + if ($params->depth > 1){ + //Если это папка (т.е., могут быть дочерние) + if ($doc['isfolder']){ + //Получаем детей (вне зависимости от того, нужно ли их выводить) + $children = $this->generate([ + 'where' => [ + 'parent' => '`parent` = '.$doc['id'], + //Any hidemenu + 'hidemenu' => '`hidemenu` != 2' + ], + 'depth' => $params->depth - 1 + ]); //Выводим детей $doc['children'] = $children; } @@ -334,11 +343,11 @@ public function generate($params){ //Если вывод вообще нужен (если «$params->depth» <= 0, значит этот вызов был только для выяснения активности) if ($params->depth > 0){ - //Получаем правильный шаблон для вывода текущего пункта + //Получаем правильный шаблон для вывода текущеёго пункта $tpl = $this->getOutputTemplate([ 'docId' => $doc['id'], 'docPublished' => $doc['published'], - 'hasActiveChildren' => $children['hasActive'], + 'hasActiveChildren' => in_array($doc['id'], $this->hereDoc_parents), 'hasChildrenOutput' => $doc['children']['outputString'] != '' ]); @@ -356,14 +365,6 @@ public function generate($params){ ]); } } - - //Если мы находимся на странице текущего документа или на странице одного из дочерних (не важно отображаются они или нет, т.е., не зависимо от глубины) - if ( - $doc['id'] == $this->hereDocId || - $children['hasActive'] - ){ - $result['hasActive'] = true; - } } } diff --git a/ddMenuBuilder.php b/ddMenuBuilder.php index 69a0546..1bd9075 100644 --- a/ddMenuBuilder.php +++ b/ddMenuBuilder.php @@ -1,11 +1,11 @@ = 5.4. + * @uses PHP >= 5.6. * @uses MODXEvo >= 1.1. * @uses MODXEvo.library.ddTools >= 0.20. * @@ -49,9 +49,9 @@ * @example &placeholders=`{"pladeholder1": "value1", "pagetitle", "My awesome pagetitle!"}`. * @example &placeholders=`pladeholder1=value1&pagetitle=My awesome pagetitle!`. * - * @link http://code.divandesign.biz/modx/ddmenubuilder/1.12 + * @link http://code.divandesign.biz/modx/ddmenubuilder/1.13b * - * @copyright 2009–2017 DivanDesign {@link http://www.DivanDesign.biz } + * @copyright 2009–2018 DivanDesign {@link http://www.DivanDesign.biz } */ //Подключаем класс (ddTools подключится там) @@ -76,10 +76,10 @@ is_numeric($startId) ){ //По умолчанию на 1 уровень - $providerParams = [ - 'parentIds' => $startId, - 'depth' => (isset($depth) && is_numeric($depth) ? $depth : 1) - ]; + $providerParams = '{ + "parentIds": "'.$startId.'", + "depth": '.(isset($depth) && is_numeric($depth) ? $depth : 1).' + }'; } $ddMenuBuilder_params = new stdClass();