Различная сортировка в различных подуровнях
Здравствуйте.
Могу ли я сортировать документы в выводе pdoMenu таким образом, чтобы первый уровень сортировался по menuindex, второй по pagetitle, а третий, например, по publishedon?
Я пытался это сделать вызовом чанка в чанке, но в таком случае не работает важный для меня параметр &hideSubMenus=`1` и мне выдаётся полное дерево документов.
Могу ли я сортировать документы в выводе pdoMenu таким образом, чтобы первый уровень сортировался по menuindex, второй по pagetitle, а третий, например, по publishedon?
Я пытался это сделать вызовом чанка в чанке, но в таком случае не работает важный для меня параметр &hideSubMenus=`1` и мне выдаётся полное дерево документов.
Комментарии: 11
Одним вызовом — нет, нельзя.
hideSubMenus при вызове в чанках можно сэмулировать своим сниппетом, который будет определять текущую ветку документов и или запускать pdoMenu, или нет.
hideSubMenus при вызове в чанках можно сэмулировать своим сниппетом, который будет определять текущую ветку документов и или запускать pdoMenu, или нет.
Ок, спасибо. Написание сниппета я не осилю, поэтому пойду в раздел «Работа» и попробую заказать у кого-нибудь.
Примерный сниппет checkParent (не проверял)
Вызов в чанке основного pdoMenu, вместо [[+wrapper]]:
Нужно проверять и доделывать, но направление примерно такое.
<?php
// Получаем всех родителей от указанного id
$parents = $modx->getParentsIds($id);
// Проверяем, есть ли в них текущий документ MODX
if (in_array($modx->resource->id, $parents) {
// Если есть - это активная ветка, вызываем pdoMenu
return $modx->runSnippet('pdoMenu', array(
'parents' => $id,
// Другие параметры
));
}
// Если нет - отдаём ссылку на пункт меню
else {
return "<li><a href="[[~[[+$id]]]]">$menutitle</a></li>"
}
Вызов в чанке основного pdoMenu, вместо [[+wrapper]]:
[[!checkParent?
&id=`[[+id]]`
&menutitle=`[[+menutitle]]`
]]
Нужно проверять и доделывать, но направление примерно такое.
Пробую писать сам, пока никто не откликается. При вот таком запросе (я поправил ваш по мелочи):
<?php
$parents = $modx->getParentsIds($id);
if (in_array($modx->resource->id, $parents))
{
return $modx->runSnippet('pdoMenu', array('parents' => $id));
}else {
return "<a href='[[~[[+$id]]]]'>$menutitle</a>";
}
?>
Ругается на то, что Call to undefined method modX::getParentsIds().
Ясно. Заработало. URL не генерируется.
[2014-06-12 08:37:53] (ERROR @ /index.php) `[[+948]]` is not a valid integer and may not be passed to makeUrl()
Как я понимаю, ругается на [[~[[+$id]]]]
Угу, тогда сделай чуть длиннее, но правильнее:
$url = $modx->makeUrl($id, $modx->context->key, '', $modx->getOption('link_tag_scheme', null, '-1'));
return "<a href=\"$url\">$menutitle</a>";
Делаю вот так: вызываю в шаблоне pdoMenu:
[[pdoMenu?
&parents=`5`
&level=`4`
&hideSubMenus=`1`
&tpl=`menu.UL`
]]
В чанке menu.UL лежит вот такая простенькая конструкция:<li[[+classes]]>
[[!checkParent?
&id=`[[+id]]`
&menutitle=`[[+menutitle]]`
]]
</li>
И всё это хозяйство вместе вызывает ваш сниппет:<?php
$parents = $modx->getParentIds($id);
if (in_array($modx->resource->id, $parents))
{
return $modx->runSnippet('pdoMenu', array('parents' => $id));
}else {
$url = $modx->makeUrl($id, $modx->context->key, '', $modx->getOption('link_tag_scheme', null, '-1'));
return "<a href=\"$url\">$menutitle</a>";
}
Возвращает только первый, верхний уровень меню.
Я подсказал общее направление, дальше сам разбирайся.
У меня, извини, времени нет дальше помогать.
У меня, извини, времени нет дальше помогать.
Спасибо. Попробую.
Добрый день,
Пытаюсь сделать многоуровневое выпадающее меню и при этом очень хочется обойтись без тяжёлых фреймворков и jQuery.
Суть такая: Есть меню вида:
Пункт1---Пункт2----------------Пункт3------Пункт4 (ссылка).
Под1------Под1-------------------Под1
Под2------Под1.1 Под1.2-------Под2
Под3------Под2
-------------Под2.1
Пытался сделать двумя способами:
1.
2.
Как быть? Очень хотелось бы RTFM, но где он этот FM?
Подмывает плюнуть на всё и написать свой сниппет для меню, но хотелось как-то стандартными средствами эту проблему решить.
Пытаюсь сделать многоуровневое выпадающее меню и при этом очень хочется обойтись без тяжёлых фреймворков и jQuery.
Суть такая: Есть меню вида:
Пункт1---Пункт2----------------Пункт3------Пункт4 (ссылка).
Под1------Под1-------------------Под1
Под2------Под1.1 Под1.2-------Под2
Под3------Под2
-------------Под2.1
Пытался сделать двумя способами:
1.
[[pdoMenu?
&parents=`0`
&level=`1`
&levelClass=`subLevel`
&tplOuter=`@INLINE <div class="divLB iMenuFrame [[+classnames]]">[[+wrapper]]</div>`
&tplInner=`@INLINE <div class="[[+classnames]]">[[+wrapper]]</div>`
&tpl=`@INLINE <div class="[[+classnames]]"><a href="[[+link]]">[[+menutitle]]</a>[[+wrapper]]</div>`
]]
Всё выводит как надо, через систему subLevel1,2,3 стилей могу всё форматировать, но не могу задать свойство onClick только первому уровню, чтобы можно было прятать ветку меню. Если задаю, то прячутся все tplParentRow.2.
[[pdoMenu?
&parents=`0`
&level=`1`
&levelClass=`subLevel`
&tplOuter=`@INLINE <div class="divLB iMenuFrame [[+classnames]]">[[+wrapper]]</div>`
&tplInner=`@INLINE <div class="[[+classnames]]">[[+wrapper]]</div>`
&tpl=`@INLINE <div class="[[+classnames]]"><a href="[[+link]]">[[+menutitle]]</a>id:[[+id]]
[[pdoMenu?
&parents=`[[+id]]`
&level=`2`
&tpl=`@INLINE <div>[[+id]]<a href="[[+link]]">[[+menutitle]]</a></div>`
]]</div>`
]]
Оно бы и решило мне большую часть вопросов, но во вложенное меню не передаётся значение текущего [[+id]].Как быть? Очень хотелось бы RTFM, но где он этот FM?
Подмывает плюнуть на всё и написать свой сниппет для меню, но хотелось как-то стандартными средствами эту проблему решить.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.