如何在prestashop中移动挂钩?

时间:2019-01-05 02:58:05

标签: php prestashop prestashop-1.7

我需要在产品说明和购物车中的添加按钮之间的右边移动钩子,在照片中标记的区域

enter image description here

到目前为止,我只能使用admin将其放在社交网络的按钮之前和之后,但是我需要将模块放在按钮之前。

这是我创建钩子的方式:

public function install()
    {
        if (!parent::install() || !$this->registerHook('displayProductAdditionalInfo'))
            return false;
        return true;
    }

public function uninstall()
    {
        if (!parent::uninstall() || !$this->unregisterHook('displayProductAdditionalInfo'))
            return false;
        return true;
    }

public function hookDisplayProductAdditionalInfo($params)
    {
        return $this->runnable();
    }

这是我的文件,其中包含我要显示的iframe

{block name='product_description_short' prepend}
    <style type='text/css'> 
        .products { border: none; width: 100%; height: {$height}px;  } 
    </style>
    <iframe class='products' src='{$iframe}{$token}'></iframe>
{/block}

如何在无需触摸主题源代码的情况下将挂钩移动到需要的位置?

2 个答案:

答案 0 :(得分:1)

这正是小部件的概念所针对的。 Widgets是PS 1.7中引入的一项高级功能,它扩展了hooks功能。

来自documentation

  

借助小部件,模块开发人员可以在   模块被要求这样做。当模块在其模块中实现小部件时   代码,它允许:

     

1个主题,可以直接使用{widget name =“ module_name”}

调用模块      

2如果调用了已注册的钩子,但其方法hook()不存在,则要回退的核心。

通过单击相同的链接,您可以使模块小部件兼容,然后在templates/catalog/product.tpl中的所需位置调用该小部件。

在1.7.5.0的经典主题中,您可以在<div class="product-actions">之前的98行中调用该小部件。

希望有帮助。

修改

让我们假设您的模块名称为“ my_module”,而您的自定义钩子名称为“ myCustomHook”,这就是模块类的外观:

class MyModule extends Module implements WidgetInterface
{

    public function __construct()
    {
        $this->name = 'my_module';
        $this->version = '1.0.0';
        $this->author = 'me';
        $this->tab = 'front_office_features';
        $this->need_instance = 0;
        $this->bootstrap = true;

        parent::__construct();

        $this->description = ...
        $this->displayName = ...
        $this->confirmUninstall = ...
    }



    public function install()
    {
        if(!parent::install())
        {
            return false;
        }

        return true;
    }


    public function uninstall()
    {
        return(parent::uninstall());
    }

    public function renderWidget($hookName = null, array $configuration = [])
    {

        $this->smarty->assign($this->getWidgetVariables($hookName, $configuration));

        return $this->display(__FILE__, 'views/templates/widget/my_template.tpl');

    }

    public function getWidgetVariables($hookName = null, array $configuration = [])
    {
            if($hookName === 'MyCustomHook')
            {
                $your_height_value, $your_iframe_value, $your_token_value... //  Get the values depending on your logic

                return [
                    'token' => $your_token_value;
                    'height' => $your_height_value;
                    'iframe' => $your__iframe_value;
                ];

            }
    }

在模板文件中,只需调用小部件即可:

{widget module='my_module' hook='myCustomHook'}

答案 1 :(得分:0)

这是一个内置的Prestashop挂钩,它必须留在那里。

您可以做的是注册一个自己的自定义钩子,例如displayMyHookHere,这里是如何做的指南hooks in PS 1.7+

将模块挂在其上,并在页面上的任何位置显示,例如{hook h ='displayMyHookHere'}