Идея интересная. Надо будет над ней подучать. Только здесь момент сразу: $out=$smarty->fetch($tpl); $ouput=$out; Лучше сразу $ouput=$smarty->fetch($tpl); Но с выводом надо будет поиграться. Элементарно скорее всего в $smarty->fetch($tpl) просто не будет виден результат процессора, так как assign ты еще не сделал.
Ясно, спасибо.
На заметку: обновил скрипт: gist.github.com/Fi1osof/6987afe4545a37dc805d Добавил параметр hideSubMenus. Теперь неактивные подменю не будут подгружаться из бд. Функция пока экспериментальная, так как с кешированием еще разбирался.
А как тебе такая идея: добавляем в процессор параметр tpl, в который передаем имя файла шаблона {processor action="getmenu" ns="site" propset="cities" tpl="cities/outer.tpl"} и добавляем код в плагин function.processor.php: function smarty_function_processor($params, & $smarty) { ... if ($response = $modx->runProcessor($action, $scriptProperties, $options)) { $output = $response->getResponse(); if ($response->isError()) { if ($response->hasFieldErrors()) { $errors = (array) $response->getFieldErrors(); foreach ($errors as $error) { $output['field_errors'][$error->getField()] = $error->getMessage(); } } } else {
if (isset($params['tpl']) and $tpl = $params['tpl']) {
$items=$ouput['object'];
$out=$smarty->fetch($tpl);
$ouput=$out;
} else {
$output['success'] = true;
}
}
}
return !empty($assign) ? $smarty->assign($assign, $output) : $output; } Тогда, если есть это параметр, процессор вернет не объект, а обработанный smarty текст. Я уже у себя проверил, работает. и шаблоны поаккуратнее смотрятся, вывод меню или данных — в одну строку :)
Ну и замечательно. Скорее всего прав нет для «все остальные» (если путь верно прописан).
Во, классно :-) Я чуть-чуть другое имел ввиду, но так даже лучше. Получилось универсально, и без бесконечной рекурсии.
А, ну да, не в блоке этого не происходит.
Блин, действительно все просто: function smarty_function_load($params, & $smarty) { if(!isset($params['file']) OR !$file = $params['file']){return;}
if(!empty($params['assign'])){
$assign = (string)$params['assign'];
}
$output = $smarty->fetch($file);
return !empty($assign) ? $smarty->assign($assign, $output) : $output;
} и вызываю {load file="cities/outer.tpl"} Работает.
Попробовал. basePathRelative в false. basePath на папку соседнего сайта. В итоге пусто.
Да, я просто вынес формирование меню из блока. Работает.