模块的 "themes" 文件夹有什么用?

What is module's "themes" folder used for?

PS 文档说,在开发模块时,您可以创建 /themes/[theme_name]/modules 子文件夹,它用于:

"Sub-folder for overriding .tpl files and languages files, if necessary."

并且它:

"enables you to handle the module's template files in various ways, depending on the current theme.",

但是我不太明白它的实际用法。它的用例是什么?

谢谢

当您开发 Prestashop 网站时,永远不要更改核心文件。这意味着您只能在 /modules/ 文件夹中创建新模块,而不能更改现有模块。因为如果您更新您修改过的模块,您所做的所有更改都将消失。

每次 Prestashop 需要加载模块模板文件时,它会首先查看当前主题 /themes/your_theme/modules/the_module/path_to_tpl.tpl 是否存在此模板的覆盖。如果不是,它将从 /modules 目录加载模板。

此建议也适用于 .css.js 文件。


documentation you mentioned in the comment below 是错误的,应该更新。您不能将 themes 文件夹放入模块中。

这里是 Module class 中的 _isTemplateOverloadedStatic() 方法,每次我们需要模块模板时调用:

/*
** Template management (display, overload, cache)
*/
protected static function _isTemplateOverloadedStatic($module_name, $template)
{
    if (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$module_name.'/'.$template)) {
        return _PS_THEME_DIR_.'modules/'.$module_name.'/'.$template;
    } elseif (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$module_name.'/views/templates/hook/'.$template)) {
        return _PS_THEME_DIR_.'modules/'.$module_name.'/views/templates/hook/'.$template;
    } elseif (Tools::file_exists_cache(_PS_THEME_DIR_.'modules/'.$module_name.'/views/templates/front/'.$template)) {
        return _PS_THEME_DIR_.'modules/'.$module_name.'/views/templates/front/'.$template;
    } elseif (Tools::file_exists_cache(_PS_MODULE_DIR_.$module_name.'/views/templates/hook/'.$template)) {
        return false;
    } elseif (Tools::file_exists_cache(_PS_MODULE_DIR_.$module_name.'/views/templates/front/'.$template)) {
        return false;
    } elseif (Tools::file_exists_cache(_PS_MODULE_DIR_.$module_name.'/'.$template)) {
        return false;
    }
    return null;
}

如您在此代码中所见,Prestashop 在加载模板时绝不会查看模块中的 themes 文件夹。