Тег {php} в tpl шаблоне

#1 27 марта 2015 в 22:14
Здравствуйте,(1.10.6) есть нужда вставить модуль в модуль. Собираюсь использовать такую конструкцию:
  1. {php}cmsPage::getInstance()->printModules('mod_parent'){/php}
, но тег {php} в Smarty3 не работает. Нашёл здесь, что для использования данного тега следует применить класс SmartyBC. Подскажите как и где его подключить. Пробовал в файле core/tpl_classes/smartyTpl.php поменять
  1. cmsCore::includeFile('/includes/smarty/libs/Smarty.class.php');
  2. $smarty = new Smarty();
на
  1. cmsCore::includeFile('/includes/smarty/libs/SmartyBC.class.php');
  2. $smarty = new SmartyBC();
, но при открытии модуля выдаёт ошибку
  1. Parse error: syntax error, unexpected $end in Z:\home\default\www\includes\smarty\libs\SmartyBC.class.php(464) : eval()'d code on line 1
. Подскажите как правильно.
#2 27 марта 2015 в 23:20
{php } cmsPage :: getInstance () -> printModule ( 'mod_name' ){ / php}

На прежних версиях так работало
#3 27 марта 2015 в 23:30
Спешу Вас разочаровать в 1.10.6 вообще нельзя сделать такую конструкцию штатными средствами, если вы сделаете вызов модуля в модуля вы получите бесконечный цикл вызова функции, и как результат на 1000 итерации php оборвет его с fatal error
#4 28 марта 2015 в 00:41
А вообще можно обойтись "малой кровью".
\includes\smarty\libs\plugins
Создаем файл с названием function.printModule.php и содержимым
  1. function smarty_function_printModule($params, $template) {
  2. cmsPage::getInstance()->printModule($params['mod_name']);
  3. }
В шаблоне tpl выводим в удобном месте модуль. Например, модуль блогов будет вставляться так:
{printModule mod_name='mod_blogs'}
#5 28 марта 2015 в 11:25
Спасибо, Джехутимери, ваш вариант работает, но вот, что странно. Там уже присутствует подобная ф-ция
  1. function smarty_function_printModules($params, $template) {
  2. cmsPage::getInstance()->printModules($params['pos']);
  3. }
и как я понимаю в ней в качестве параметра следует использовать позицию модуля {printModules pos='sidebar'}, но при этом так не работает, а получаю ошибку о которй писал maxisoft.
И вопрос о теге {php} остаётся актуален.
#6 28 марта 2015 в 13:01
вы не правильно сделали то что предложил Джехутимери правильное решение на 100% единственный момент и ошибка в его решении что нужно
  1. cmsPage::getInstance()->printModule($params['module_id']);
и в smarty будет так

  1. {printModule module_id=34}
функция принимает не имя модуля а его ID так что если сделаете правки в предложенный вариант выше у вас все заработает
#7 28 марта 2015 в 13:39
Спасибо, maxisoft, с module_id тоже работает и если так правильнее чем mod_name, то пусть так и будет. Но непонятно другое. Почему не работает уже существующая в системе ф-ция
  1. function smarty_function_printModules($params, $template) {
  2. cmsPage::getInstance()->printModules($params['pos']);
  3. }
?
#8 28 марта 2015 в 13:45
по причине того что функция printModules выводить все модули за 1 раз, получается что если в позиции модуль вызывает другои происходит циклический вызов функции, поэтому есть функция printModule которая выводить 1 модуль по его id или name. Хотя у меня есть решение которое выводит именно модули по позиции без зацикливания системы :)

  1.  
  2. <?php
  3. function smarty_function_printInnerModules($params, $template)
  4. {
  5. $is_strict = cmsCore::getInstance()->isMenuIdStrict();
  6.  
  7. if (!$is_strict) {
  8. $strict_sql = "AND (m.is_strict_bind = 0)";
  9. } else {
  10. $strict_sql = '';
  11. }
  12.  
  13. $menuid = cmsCore::getInstance()->menuId();
  14.  
  15. $sql = "SELECT m.*, mb.position as mb_position
  16. FROM cms_modules m
  17. INNER JOIN cms_modules_bind mb ON mb.module_id = m.id AND mb.menu_id IN ($menuid, 0)
  18. WHERE m.published = 1 AND mb.position='{$params['pos']}' $strict_sql
  19. ORDER BY m.ordering ASC";
  20.  
  21. $result = cmsDatabase::getInstance()->query($sql);
  22.  
  23. if (!cmsDatabase::getInstance()->num_rows($result)) {
  24. return false;
  25. }
  26.  
  27. while ($mod = cmsDatabase::getInstance()->fetch_assoc($result)) {
  28.  
  29. if (!cmsCore::checkContentAccess($mod['access_list'], false)) {
  30. continue;
  31. }
  32.  
  33. if ($mod['hidden_menu_ids']) {
  34. $mod['hidden_menu_ids'] = cmsCore::yamlToArray($mod['hidden_menu_ids']);
  35. if (in_array($menuid, $mod['hidden_menu_ids'])) {
  36. if ($is_strict || !$mod['is_strict_bind_hidden']) {
  37. continue;
  38. }
  39. }
  40. }
  41.  
  42. $m = renderModule($mod);
  43. if (!$m) {
  44. continue;
  45. }
  46. echo $m;
  47.  
  48. }
  49. }
  50.  
  51. function renderModule($mod)
  52. {
  53. $callback = true;
  54. $html = '';
  55.  
  56. if (!$mod['user']) {
  57. cmsCore::loadLanguage('modules/' . $mod['content']);
  58. }
  59.  
  60. if (!$mod['is_external']) {
  61.  
  62. $mod['body'] = cmsCore::processFilters($mod['content']);
  63.  
  64. } else {
  65. if (cmsCore::includeFile('modules/' . $mod['content'] . '/module.php')) {
  66. if ($mod['cache'] && cmsCore::isCached('module', $mod['id'], $mod['cachetime'], $mod['cacheint'])) {
  67. $mod['body'] = cmsCore::getCache('module', $mod['id']);
  68. $callback = true;
  69. } else {
  70. $cfg = cmsCore::yamlToArray($mod['config']);
  71.  
  72. if (!isset($cfg['tpl'])) {
  73. $cfg['tpl'] = $mod['content'] . '.tpl';
  74. }
  75.  
  76. cmsCore::getInstance()->cacheModuleConfig($mod['id'], $cfg);
  77.  
  78. $callback = call_user_func($mod['content'], $mod, $cfg);
  79. $mod['body'] = ob_get_clean();
  80. if ($mod['cache']) {
  81. cmsCore::saveCache('module', $mod['id'], $mod['body']);
  82. }
  83. }
  84. }
  85. }
  86.  
  87. if ($callback) {
  88. $module_tpl = file_exists(TEMPLATE_DIR . 'modules/' . $mod['template']) ? $mod['template'] : 'module.tpl';
  89. $cfglink = (cmsConfig::getConfig('fastcfg') && cmsUser::getInstance()->is_admin) ? true : false;
  90.  
  91. $html = cmsPage::initTemplate('modules', $module_tpl)
  92. ->assign('cfglink', $cfglink)
  93. ->assign('mod', $mod)
  94. ->fetch($module_tpl);
  95. }
  96. return $html;
  97. }
  98.  
выводить модули в tpl как {printInnerModules pos='top'}
#9 28 марта 2015 в 14:14
Большое спасибо за пояснение и особенно за ф-ции.
#10 16 ноября 2015 в 05:32

и как я понимаю в ней в качестве параметра следует использовать позицию модуля {printModules pos='sidebar'}, но при этом так не работает, а получаю ошибку о которой писал maxisoft.

Lora
работает.

Вставил в шаблон модульную позицию

  1. {printModules pos='position1'}
и назначил вывод модуля на эту позицию, все нормально
#11 16 ноября 2015 в 05:42
У Марата, если мне память не изменяет, был фильтр, который позволял тело модуля вставить в статью или описание категории или описание клуба. Полагаю, в модуле этот фильтр тоже заработает. Не могу утверждать наверняка, поскольку не пробовал такое делать, но кому охота покуражиться — велкам)
Это я к тому, что одного результата можно добиться разными способами.)))
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.