prestashop中的全局替换属性

时间:2017-02-22 09:52:32

标签: php smarty prestashop

拥有prestashop并需要全局替换所有页面中的某些html属性(在显示之前)。

我使用扩展:

protected function smartyOutputContent($content)

一些替换代码。

一切运行良好。 (但这不是正确的重写)

但有问题,如果有人知道如何做到这一点的正确方法。 在prestashop中,或者如果某种方式如何正确地重写一些聪明并扩展它...

(理想情况下,如果可以在prestashop模块中使用它)

感谢所有想法。

更改

在我的情况下,需要替换/重命名itemprop,itemscope,itemtype。 (在模块中更改为json结构)

并且想要在安装modul时理想地做。 但是用户可以拥有自定义主题......所以覆盖模板不是正确的方法。

我现在这样做:

模块/ modul_name /手柄/类/控制器/ Controller.php这样 内容:

protected function smartyOutputContent($content)
{
    $this->context->cookie->write();

    $html = '';
    $js_tag = 'js_def';
    $this->context->smarty->assign($js_tag, $js_tag);

    if (is_array($content)) {
        foreach ($content as $tpl) {
            $html .= $this->context->smarty->fetch($tpl);
        }
    } else {
        $html = $this->context->smarty->fetch($content);
    }

    $html = trim($html);

    if (in_array($this->controller_type, array('front', 'modulefront')) && !empty($html) && $this->getLayout()) {
        $live_edit_content = '';
        if (!$this->useMobileTheme() && $this->checkLiveEditAccess()) {
            $live_edit_content = $this->getLiveEditFooter();
        }

        $dom_available = extension_loaded('dom') ? true : false;
        $defer = (bool)Configuration::get('PS_JS_DEFER');

        if ($defer && $dom_available) {
            $html = Media::deferInlineScripts($html);
        }
        $html = trim(str_replace(array('</body>', '</html>'), '', $html))."\n";

        /* Remove snipped data from attributes html elements */
        $html = str_replace(array('itemprop', 'itemscope', 'itemtype'), 'ip', $html);

        $this->context->smarty->assign(array(
            $js_tag => Media::getJsDef(),
            'js_files' =>  $defer ? array_unique($this->js_files) : array(),
            'js_inline' => ($defer && $dom_available) ? Media::getInlineScript() : array()
        ));

        $javascript = $this->context->smarty->fetch(_PS_ALL_THEMES_DIR_.'javascript.tpl');

        if ($defer && (!isset($this->ajax) || ! $this->ajax)) {
            echo $html.$javascript;
        } else {
            echo preg_replace('/(?<!\$)'.$js_tag.'/', $javascript, $html);
        }
        echo $live_edit_content.((!isset($this->ajax) || ! $this->ajax) ? '</body></html>' : '');
    } else {
        echo $html;
    }
}

所有功能都正确。

感谢评论sadlyblue

0 个答案:

没有答案