Здравствуйте.
Пользуя Wayfinder для построения менюхи, столкнулся со следующей проблемой: понадобилось исключить документы потомков указанных пунктов. Т.е. попользовать что-то вроде параметра excludeDocs, но с тем условием, что список его аргументов - родители. А исключаются - их дети. Такое действо нужно, когда в родительском контенте вызывается Ditto, собирающий контент деток. А сами детки не попадают в подпункты строящегося Wayfinder’ом меню. При этом, количество деток - есть число динамическое.
Недолго ковырявшись в коде Wayfinder’а, равно как и не сильно оптимизируя оный, соделал нижеописанное решение.
1. к параметрам Wayfinder’а ( $wf->_config = array... ) добавил параметр excludeChildren.
$wf->_config = array(
...
'excludeChildren' => isset($excludeChildren) ? $excludeChildren : 0,
...
2. в файле wayfinder.inc.php подшаманил:
метод getData
после строк
if ($this->_config['excludeDocs']) {
$menuWhere .= " AND (sc.id NOT IN ({$this->_config['excludeDocs']}))";
}
добавляем:
if ($this->_config['excludeChildren']) {
$parentIDs = array();
$parentIDs = explode(',',$this->_config['excludeChildren']);
if (!empty($parentIDs)) {
foreach ($parentIDs as $parentID) {
$childIDs = array();
$childIDs = $modx->getChildIds($parentID,$this->_config['level']);
if (!empty($childIDs)) {
$children = implode(",",$childIDs);
$menuWhere .= " AND (sc.id NOT IN ($children))";
}
}
}
}
3.Вызов Wayfinder’а:
[[Wayfinder? &startId=`23` &level=`2` &excludeChildren=`25,30`]]
В заключение:
1. признаю, что ковырять чужой код не всегда приятно/этично/безопасно/красиво.
2. признаю, что наспех наваяное мной чудо надо подвергнуть детальному просмотру/анализу/тестированию.
3.признаю, что предложенный мной код не является оптимальным с точки зрения построения запроса в части WHERE.
4. просю ответственных товарищей, общающихся с автором Wayfinder’а, предложить вышеобозначенному автору внести изменения в код Wayfinder’а, дабы подобный функционал присутствовал в официальных версиях.
5. заранее прошу извинения за причиненные неудобства.
Спасибо.