Как переместить крюк в prestashop? - PullRequest
0 голосов
/ 05 января 2019

Мне нужно переместить мой крюк прямо между описанием товара и кнопкой добавления в корзину, в области, которую я отметил на фотографии

enter image description here

Пока я могу поставить его только до и после кнопок социальных сетей, используя админ, но мне нужно поставить свой модуль перед кнопкой.

Вот как я создаю свой хук:

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();
    }

И это мой файл, который содержит фрейм, который я хочу показать

{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 голосов
/ 08 января 2019

Это именно то, к чему стремится концепция виджета. Виджеты - это расширенная функция, представленная в PS 1.7, которая расширяет функцию хуков.

Из документации :

С помощью виджетов разработчики модулей могут отображать контент везде, где модуль просят сделать это. Когда модуль реализует виджеты в своем код, он позволяет:

1 тема для вызова модуля напрямую с {widget name = "module_name"}

2 ядро ​​для отката на него, если вызывается зарегистрированный хук, но его метод hook () не существует.

Перейдя по той же ссылке, вы можете сделать виджеты модуля совместимыми, а затем вызвать виджет в templates/catalog/product.tpl в нужном вам месте.

В классической теме для 1.7.5.0 вы можете вызвать виджет в строке 98 непосредственно перед <div class="product-actions">.

Надеюсь, это помогло.

Редактировать

Давайте предположим, что имя вашего модуля - «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'}
0 голосов
/ 05 января 2019

Это встроенный крюк Prestashop, и он должен оставаться там.

Что вы можете сделать, это зарегистрировать свой собственный хук, например displayMyHookHere, вот руководство о том, как это сделать хуков в PS 1.7 +

Подключите к нему свой модуль и отобразите его в любом месте вашей страницы, например {hook h = 'displayMyHookHere'}

...