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();