Просто хочется иметь нечто вроде наборов, чтобы все в одном месте лежало, а при необходимости нужное по имени вытаскивать. Все равно на все случаи жизни наборами не запасешься. И есть барьер, когда куча наборов не помогают, а мешают, так как многое взаимосвязано, и правишь одно, а в другом месте боком выходит. Напиши себе несколько базовых процессоров и их развивай. А лучше сразу сборку себе движка сделай и все.
Нет, неправильно понял. Наоборот, процессоры очень даже возвращают массивы. А если очень надо, то можно и объекты возвращать. Это сниппеты строки только возвращают. Нет, я не про процессоры, с ними все понятно, я про конструкции типа {processor ... и т.п. А без сниппетов я совсем хочу по максимуму обходиться. Но я тоже уже подумал, что заполнить массив по месту как-то попроще будет, чем вызывать набор параметров. Да и свой модуль написать можно, где все это собрать в одну кучу. Подумаю еще. Просто хочется иметь нечто вроде наборов, чтобы все в одном месте лежало, а при необходимости нужное по имени вытаскивать.
Переношу сайт с Эво на Рево. И натыкаюсь вот на такую проблему: на Эво менюшка нормально формируется, а в Рево этой менюшки нет.
MODX-тег очень простой: [[Wayfinder?startId=2
&level=2
&hideSubMenus=1
]] И что же здесь не так? А оказывается, всему виной hideSubMenus=1
. Я этот параметр довольно часто раньше использовал и знаком с ним хорошо — полезная и простая штука — не выводит подразделы меню, если они не активные. А здесь раз, и всего меню нет… Полез в код Wayfinder-а, а там следующее: /* only process resource group, if starting at root, hidesubmenus is off, or is in current parenttree */
if ((!$this->_config['hideSubMenus'] || $this->isHere($parentId) || $parentId == 0)) {
/* build the output for the group of resources */
$menuPart = $this->buildSubMenu($docs,$level);
/* if at the top of the menu start the output, otherwise replace the wrapper with the submenu */
if (($level == 1 && (!$this->_config['displayStart'] || $this->_config['id'] == 0)) || ($level == 0 && $this->_config['displayStart'])) {
$output = $menuPart;
} else {
$output = str_replace("[[+wf.wrapper.{$parentId}]]",$menuPart,$output);
}
} То есть формировать меню только если не указано, что скрывать меню, или startId==0, или это текущий раздел.
И вот здесь засада получается. То есть если надо меню не из корня формировать, то оно просто не будет выводиться, если пользователь не находится в этом разделе. В общем, я думаю, здесь надо добавить еще одно условие || $level==1, то есть если это первый уровень, то обязательно меню фигачить. Хотя может надо добавить еще одну настройку, типа «выводить ли первый уровень, если он не активен и включено hideSubMenus». Кто-нибудь вообще с этим сталкивался? Есть какие-то мысли? Просто Wayfinder уже два года не обновлялся, и возможно мы просто возьмем этот пакет на поддержку, и будем фиксить баги сами. Вряд ли Шон будет этим заниматься. P.S. на уровне Smarty я пока без багфикса так сделал: {snippet name=Wayfinder params="startId=2
&level=2
&hideSubMenus=1
" assign=modelslist}
{if $modelslist}
{$modelslist}
{else}
{snippet name=Wayfinder params="startId=2
&level=1
"}
{/if} То есть сначала просто пытаюсь получить это меню с настройкой hideSubMenus и на два уровня. И если меню было получено, то вывожу его. Если нет, то уже вывожу меню без hideSubMenus, но на 1 уровень.
ну, чтобы сразу из наборов дергать параметры. Но, насколько я понял, smarty-планигы возвращают только строку? Нет, неправильно понял. Наоборот, процессоры очень даже возвращают массивы. А если очень надо, то можно и объекты возвращать. Это сниппеты строки только возвращают. Про это я писал здесь: community.modx-cms.ru/blog/tips_and_tricks/9966.html Возникла у меня идея сделать плагин, ну, чтобы можно было делать что-то типа А зачем? В сниппеты параметры передаются в имени. В плагинах параметры можно назначить по дефолту в методе initialize через $this->setDefaultProperties(). Не думаю, что имеет смысл утяжелять все это дело.
Кастати, по поводу передачи параметров… Возникла у меня идея сделать плагин, ну, чтобы можно было делать что-то типа {processor action=«getmenu» ns=«site» params={params name='top-menu'} assign=result} ну, чтобы сразу из наборов дергать параметры. Но, насколько я понял, smarty-планигы возвращают только строку? И json-encode тоже отдает не в том виде, что надо. Можно ли сделать что-то вроде этого? И стоит ли овчинка выделки?
Как я понял, вызов сниппета а не кода напрямую не утяжеляет код Утяжеляет, тем более если через MODX-теги делается. Но даже если не через MODX-теги, все равно это лишний вызов объекта сниппета. Процессоры быстрее.
Я все понял. Просто в документации сразу не разберешься, да и с английским не очень дружен... Спасибо огромное за помощь.
Ну тогда в общих чертах все ОК (что-то я как-то проморгал передачу параметров в Smarty-плагин процессора). Но в любом случае, в комменте выше я написал в чем проблема вызова объекта параметров.
У меня там такой код: {$menuParams=$modx->getObject('modPropertySet','top-menu')->getProperties()} … {processor action=«getmenu» ns=«site» params=$menuParams assign=result} {assign var=items value=$result.object} {include file=«top-menu/outer.tpl»}