Prestashop - переменные, недоступные в классе header.tpl- $ category, недоступны - PullRequest
0 голосов
/ 05 марта 2012

В настоящее время я изучаю переменные шаблона и пытаюсь понять, как они работают и что они значат. Я сделал тест на {$ category-> id_cms_category}, который я поместил в cms.tpl, и я получил результат 9, но когда я помещаю это в header.tpl или blockcms.tpl (левый столбец), нет результаты пустые.

Может кто-нибудь объяснить, как это работает и как я могу получить один и тот же результат в другом файле .tpl? Я думаю, что вопрос в том, как назначить класс $ category, например, header.tpl. Это как-то связано с контроллерами? Почему я не могу использовать определенные переменные везде? Как это работает? Я был бы очень рад, если бы кто-нибудь объяснил это. Я также все еще учусь умничать.

1 Ответ

7 голосов
/ 19 марта 2012

К сожалению, вы сталкиваетесь с общей проблемой с smarty, и, в частности, с тем, как она реализована в Prestashop.

Переменные Smarty очень ограничены в области действия в Prestashop, и их область действия определяется тем, какая часть кодаони назначены в беге.В случае {$category->id_cms_category} он назначается в CMSController в точке, в которой отображается основное содержимое (важные элементы посередине), и поэтому будет доступно в cms.tpl, как вы продемонстрировали.

Причина, по которой он недоступен в левом столбце или в заголовке, связана с порядком отображения каждого из этих разделов.Это будет:

a) Заголовок (в частности, верхняя часть страницы, а не блок заголовка html), затем b) Левый столбец, затем c) «Основной» контент, затем d) Правый столбец, затем e) Нижний колонтитул

Вы должны обнаружить, что если вы будете ссылаться на него в правом столбце или в нижнем колонтитуле страницы, то волшебным образом он будет вам доступен (конечно, только на страницах CMS, поскольку мы полагаемся на CMSController).запускается и присваивает ему значение).

Если вам нужно сослаться на такие вещи, как категория cms в заголовке страницы (возможно, чтобы выделить подсветку при горизонтальной навигации), то вам нужно будет извлечьзначение и назначьте его для умного себя.Вы можете сделать это одним из двух способов:

1) Написать модуль, который подключен к заголовку, и назначить там свою переменную. 2) Переопределить класс FrontController и назначить там переменную smarty (например, в функции init).)

Примером 2), который вы можете попробовать, является создание файла /override/classes/FrontController.php, содержащего:

<?php
class FrontController extends FrontControllerCore
{
  function init() {
    parent::init();
    $id_cms_category = (int)Tools::getValue('id_cms_category');
    $id_cms_page = (int)Tools::getValue('id_cms');
    self::$smarty->assign(array(
                                'my_cms_category_id' => $id_cms_category,
                                'my_cms_page_id' => $id_cms_page
                                )
                          );
  }
}

Вышеуказанное должно позволять отображать {my_cms_category_id} и {my_cms_page_id} в любом местев вашей теме (потому что мы устанавливаем переменные smarty до того, как все будет обработано).Для страницы, не относящейся к cms, они оба должны быть 0, my_cms_category_id должно быть установлено ненулевым на страницах категории cms, а {my_cms_page_id} должно быть ненулевым, когда на определенной странице cms.

Надеюсь, этоидет к тому, чтобы сделать это немного яснее!

...