在smarty中添加一个新的全局变量?所有页面都提供。 (的Prestashop)

时间:2018-05-07 13:25:19

标签: prestashop smarty

我希望在smarty中添加一个全局变量。

我在stylesheep.tpl中添加了{$ urls.css_url}的css样式

<link rel="stylesheet" type="text/css" href="{$urls.css_url}my.css">

它工作得很好,除非我把商店放在调试模式下,我有这个错误:

ContextErrorException in smarty_internal_templatebase.php(157) : eval()'d code line 393: Notice: Undefined index: css_url

这是什么意思?这个变量在smarty中不可用?所以,如果我放入缓存,它将无法加载?

如何使用smarty提供变量{$ urls.css_url}?网站上到处都是什么?

我应该放置哪些代码以及放置它的位置,以便变量(url_css)在调试模式下仍然可用?

感谢您的帮助

感谢您的帮助,与我相比,你的水平很高。

事实上,变量已经定义并且随处可用。

在frontcontroler.php中,我有这个:

$assign_array = array(
    'img_ps_url' => _PS_IMG_,
    'img_cat_url' => _THEME_CAT_DIR_,
    'img_lang_url' => _THEME_LANG_DIR_,
    'img_prod_url' => _THEME_PROD_DIR_,
    'img_manu_url' => _THEME_MANU_DIR_,
    'img_sup_url' => _THEME_SUP_DIR_,
    'img_ship_url' => _THEME_SHIP_DIR_,
    'img_store_url' => _THEME_STORE_DIR_,
    'img_col_url' => _THEME_COL_DIR_,
    'img_url' => _THEME_IMG_DIR_,
    'css_url' => _THEME_CSS_DIR_,
    'js_url' => _THEME_JS_DIR_,
    'pic_url' => _THEME_PROD_PIC_DIR_,
);

然后我添加了下面的一行,以巧妙的方式分配它。

$this->context->smarty->assign(array('urls' => $urls));

显示变量,没问题,但如果我把商店放在调试模式下:

/* Debug only */
if (!defined('_PS_MODE_DEV_')) {
define('_PS_MODE_DEV_', true);
}

我总是这样:

ContextErrorException in smarty_internal_templatebase.php(157) : eval()'d code line 393: Notice: Undefined index: css_url

这表明没有价值吗?为什么它的价值会消失? (当我激活PS_MODE_DEV时)

再次感谢。

2 个答案:

答案 0 :(得分:0)

{$urls.css_url}表示从urls数组中检索css_url值。

此外,您收到的通知表示该变量没有值,因此它根本无法工作,所以也许您认为正确,但您看到的是来自其他变量/钩子。

如何设置Smarty变量

如果你想设置一个smarty变量,你将首先分配它。

您可以通过模块,控制器或TPL来完成。

从模块或控制器发出声明后,它将立即可用。打印或调试它。

因此,例如,如果您在hookDisplayHeaderactionFrontControllerSetMedia挂钩中添加该变量,则该变量可用于您想要使用它的位置。

此外,要在模块或控制器中分配值,您必须使用如下代码:

$urls = array (
    'css_url' => 'The URL to your CSS'
    ...
);
$this->context->smarty->assign(array('urls' => $urls));

然后您就可以使用{$urls.css_url}

访问它了

如何知道Smarty中已定义的变量

启用商店的调试模式,然后在任何TPL中添加{debug},这将显示弹出窗口(记得允许从您的URL弹出窗口),并将所有变量分配给Smarty。

答案 1 :(得分:0)

也许这就是你要找的东西:

版本:Prestashop 1.7.2.4

我们将覆盖一个类,在本例中为以下文件:classes / controller / FrontController.php,此文件为Prestashop分配全局变量。

  1. 创建文件:override / classes / controller / FrontController.php
  2. 将所有内容从:classes / controller / FrontController.php复制到我们最近创建的文件。
  3. 检查以下行:1444,有一个名为 getTemplateVarUrls()的函数,在此函数内部已经存在一个变量 css_url ,指向主题css默认目录: / public_html / themes / theme_name / assets / css
  4. 如果要创建自定义url变量,请在那里编写代码,即:

    public function getTemplateVarUrls()
    {
      $http = Tools::getCurrentUrlProtocolPrefix();
      $base_url = $this->context->shop->getBaseURL(true, true);
    
      //custom css url var points to a folder called "my_custom_css" in the root of the project
      $customCssFolderUrl = $base_url.'/my_customs_css';
    
      $urls = array(
        'base_url' => $base_url,
        'current_url' => $this->context->shop->getBaseURL(true, false).$_SERVER['REQUEST_URI'],
        'shop_domain_url' => $this->context->shop->getBaseURL(true, false),
        'custom_css_url' => $customCssFolderUrl ,
    );
    
  5. 完成所有这些步骤后,我们继续删除public_html / app / cache / prod / class_index.php文件,这是为了防止Prestashop忽略我们的新文件,以了解更多相关信息:http://doc.prestashop.com/display/PS16/Overriding+default+behaviors

  6. 在任何.tpl文件中使用新变量:{$ urls.custom_css_url}

  7. 希望这有帮助。