Prestashop - header.tpl- $ category类中无法访问的变量不可用

Pet*_*tra 0 variables controller class prestashop

我目前正在学习模板变量,并试图了解它们的工作原理和含义.我已经在{$ category-> id_cms_category}上做了一个测试,我把它放在cms.tpl中,我得到了一个结果9,但是当我把它放在header.tpl或blockcms.tpl(左栏)中时,没有结果,这是空白的.

有人可以解释一下这是如何工作的,以及如何在不同的.tpl文件中获得相同的结果?我认为问题实际上是如何将$ category类分配给例如header.tpl.它与控制器有关吗?为什么我不能在任何地方使用某些变量?这是如何运作的?如果有人解释这一点,我会很高兴.我还在学习聪明.

小智 7

不幸的是,你遇到了一个常见的问题,特别是如何在Prestashop中实现它.

Smarty变量在Prestashop中的范围非常有限,它们的范围取决于它们分配的代码部分在哪一点运行.如果{$category->id_cms_category}它是在CMSController中在主要内容(中间的重要内容)被渲染的位置分配的,那么将在cms.tpl中提供,如您所示.

它在左列或标题中不可用的原因是由于每个部分的呈现顺序.这将会:

a)标题(页面顶部而不是具体的html标题块),然后b)左列,然后c)"主要"内容,然后d)右列,然后e)页脚

您应该发现,如果您要在页面的右栏或页脚中引用它,那么神奇地它将可供您使用(当然,仅在CMS页面上,因为我们依赖于正在运行的CMSController并将其指定为值).

如果您需要在页面标题中引用cms类别之类的内容(可能在水平导航上设置突出显示),那么您将需要获取值并自己将其分配给smarty.您可以通过以下两种方式之一完成此操作:

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
                                )
                          );
  }
}
Run Code Online (Sandbox Code Playgroud)

上述应允许您显示{my_cms_category_id}{my_cms_page_id}你的主题的任何地方(因为我们设置Smarty的变量之前所有其他被渲染).对于非cms页面,它们都应该是0,my_cms_category_id应该在cms类别页面上设置为非零,并且{my_cms_page_id}在特定的cms页面上应该为非零.

希望这可以使它更清晰一些!