Идея интересная. Надо будет над ней подучать. Только здесь момент сразу: $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 на папку соседнего сайта. В итоге пусто.