我目前正在学习模板变量并尝试了解它们的工作原理和含义。 我已经在{$ category-> id_cms_category}上做了一个测试,我把它放在cms.tpl中,我得到了一个结果9,但当我把它放在header.tpl或blockcms.tpl(左栏)时,有没有结果,这是空白的。
有人可以解释一下这是如何工作的,以及如何在不同的.tpl文件中获得相同的结果? 我认为问题实际上是如何将$ category类分配给例如header.tpl。它与控制器有关吗? 为什么我不能在任何地方使用某些变量?这是如何运作的?如果有人解释这一点,我会很高兴。 我还在学习聪明。
答案 0 :(得分:7)
不幸的是,你遇到了一个常见的问题,特别是它如何在Prestashop中实现。
Smarty变量在Prestashop中的范围非常有限,它们的范围取决于它们分配的代码部分在哪一点运行。在{$category->id_cms_category}
的情况下,它在CMSController中被指定在主要内容(中间的重要内容)被渲染的位置,因此将在cms.tpl中提供,如您所示。
它在左列或标题中不可用的原因是由于每个部分的呈现顺序。这将是:
a)标题(页面顶部而不是具体的html标题块),然后 b)左列,然后 c)然后是“主要”内容 d)然后是右栏 e)页脚
您应该会发现,如果您要在页面的右栏或页脚中引用它,那么您可以使用它(当然,因为我们依赖于正在运行的CMSController,因此在CMS页面上)给它分配一个值。)
如果您需要在页面标题中引用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
)
);
}
}
以上应该允许您在主题中的任何位置显示{my_cms_category_id}
和{my_cms_page_id}
(因为我们在所有其他内容呈现之前设置了智能变量)。对于非cms页面,它们都应为0,my_cms_category_id
应在cms类别页面上设置为非零,并且{my_cms_page_id}
在特定的cms页面上应为非零。
希望这可以让它更清晰一点!