You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prestashop 1.6后台覆盖模板引入自定义PHP文件报错求助

解决PrestaShop 1.6后台模板引入自定义PHP文件导致页面崩溃的问题

遇到这种情况很常见,PrestaShop 1.6对Smarty的安全限制和路径错误是导致页面崩溃的主要原因,我给你几个靠谱的解决方案,按推荐程度排序:

一、使用PrestaShop钩子系统(最推荐,符合规范且安全)

直接在模板里用{php}或{include_php}违反了PrestaShop的MVC架构,而且默认被Smarty安全策略禁用,用钩子是官方推荐的方式:

  1. 创建自定义模块:
    新建一个简单模块(比如命名为customcode),目录结构如下:

    modules/customcode/
    ├─ customcode.php       # 模块主文件
    ├─ custom_code.php      # 你的自定义PHP代码文件
    └─ views/templates/hook/
       └─ custom_display.tpl # 可选:如果需要输出HTML到模板
    
  2. 编写模块主文件:
    在customcode.php里注册后台钩子并引入你的自定义代码:

    <?php
    if (!defined('_PS_VERSION_')) exit;
    
    class CustomCode extends Module
    {
        public function __construct()
        {
            $this->name = 'customcode';
            $this->tab = 'administration';
            $this->version = '1.0.0';
            $this->author = 'Your Name';
            $this->need_instance = 0;
    
            parent::__construct();
    
            $this->displayName = $this->l('Custom Backend Code');
            $this->description = $this->l('Injects custom PHP code into PrestaShop backend');
        }
    
        public function install()
        {
            // 注册后台通用钩子,比如displayBackOfficeHeader(所有后台页面都会触发)
            return parent::install() && $this->registerHook('displayBackOfficeHeader');
        }
    
        public function hookDisplayBackOfficeHeader()
        {
            // 用绝对路径引入自定义文件,避免路径错误
            include(_PS_MODULE_DIR_ . 'customcode/custom_code.php');
    
            // 如果需要传递数据到模板,可添加以下代码:
            // $this->context->smarty->assign('custom_data', $your_variable);
            // return $this->display(__FILE__, 'views/templates/hook/custom_display.tpl');
        }
    }
    
  3. 安装模块:
    后台进入"模块与服务",上传并安装这个模块,你的自定义代码就会安全执行,不会触发页面崩溃。

二、修改Smarty安全配置(仅临时测试用,不推荐生产环境)

如果只是临时测试,一定要在模板里直接引入,可以修改Smarty的安全设置,但生产环境绝对不要这么做,会带来安全风险:

  1. 打开config/smarty.config.inc.php文件,找到以下配置并修改:

    // 启用{php}标签
    $smarty->allow_php_tag = true;
    // 启用{include_php}标签
    $smarty->security_settings['INCLUDE_PHP'] = true;
    
  2. 使用绝对路径引入文件,避免相对路径出错:
    在模板里用PrestaShop内置常量构建路径,比如:

    {php}
    // 引入你的update.php文件,用_PS_ROOT_DIR_获取项目根目录
    include(_PS_ROOT_DIR_ . '/panel/update.php');
    {/php}
    

    或者用{include_php}:

    {include_php file='`._PS_ROOT_DIR_ . '/panel/update.php'`'}
    

三、通过控制器传递变量(适合特定页面的逻辑)

如果你的自定义代码只针对某个后台页面(比如产品管理页),可以覆盖对应控制器,把代码逻辑放在控制器里,再传递到模板:

  1. 后台控制器覆盖:
    在override/controllers/admin/目录下新建AdminProductsController.php(以产品页为例):

    <?php
    class AdminProductsController extends AdminProductsControllerCore
    {
        public function initContent()
        {
            parent::initContent();
    
            // 引入你的自定义文件
            include(_PS_ROOT_DIR_ . '/panel/update.php');
            // 将数据赋值给模板变量
            $this->context->smarty->assign('custom_update_result', $some_data_from_update);
        }
    }
    
  2. 在模板里使用变量:
    打开你覆盖的后台产品模板(比如themes/default/template/controllers/products/helpers/form/form.tpl),直接用{$custom_update_result}调用数据即可,不需要在模板里执行PHP。


内容的提问来源于stack exchange,提问作者Darius Pum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:24