Автор Тема: Вопрос по модулю Express Cache  (Прочитано 138 раз)

21 Апрель 2022, 14:57:28
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
День добрый, возник вопрос по модулю Express Cache

В product-list.tpl для каждого товара вызывается хук displayProductListFunctionalButtons

Столкнулся с тем что модуль Express Cache
не позволяет кешировать для определённых параметров хука, например для определённого id_product
{hook h='displayProductListFunctionalButtons' id_product=$product.id_product}
Только целиком для всего хука:
<!--[hook displayProductListFunctionalButtons] 157-->т.е. в эту конструкцию id_product добавить невозможно.

В результате в хуке displayProductListFunctionalButtons для определённого id_product не могу закешировать информацию.
Как быть?
22 Апрель 2022, 10:30:11
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 1591
  • Репутация: +31/-1
  • Сообщество PrestaShop
    • Просмотр профиля
{block name='product_list_functional_buttons'}
    ....
    hook h='displayProductListFunctionalButtons' product=$product}
Перевать нужно не отдельный элемент класса товара, а весь класс.
22 Апрель 2022, 15:58:47
Ответ #2
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Express cache 3 работает так.
сохраняет страницу по урлу в файле кеша (при первом посещении страницы).
динамические хуки выделяет вот так:
<!--[hook displayProductListFunctionalButtons] 157-->
<!--[hook displayProductListFunctionalButtons] 157-->

В следующий раз по этому же урлу.
Достаётся страница из файла кеша.

И там где вот это
<!--[hook displayProductListFunctionalButtons] 157-->
<!--[hook displayProductListFunctionalButtons] 157-->

Выполняет для них Hook::exec(....
$hook_content = Hook::exec($hook_name, $hook_args, $id_module, false, true, false, null);
$hook_name = displayProductListFunctionalButtons
$id_module = 157

Далее осуществляется preg_replace — Выполняет поиск и замену полученного результата по регулярному выражению.

$pattern = "/<!--\[hook $hook_name\] $id_module-->(.*?)<!--\[hook $hook_name\] $id_module-->/s";
 $hook_content = preg_replace('/\$(\d)/', '\\\$$1', $hook_content);
$p_content = preg_replace($pattern, $hook_content, $content, 1, $count);
                 

После чего смотрим результат на экране.
Так вот, в этом механизме
<!--[hook displayProductListFunctionalButtons] 157-->
не предусмотрено добавить в эту конструкцию id_product (либо что-то другое ),
чтобы кешировать для определённых параметров хука.
23 Апрель 2022, 11:16:25
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1281
  • Репутация: +12/-1
  • Сообщество PrestaShop
    • Просмотр профиля
День добрый, возник вопрос по модулю Express Cache

В product-list.tpl для каждого товара вызывается хук displayProductListFunctionalButtons

Столкнулся с тем что модуль Express Cache
не позволяет кешировать для определённых параметров хука, например для определённого id_product
{hook h='displayProductListFunctionalButtons' id_product=$product.id_product}
Только целиком для всего хука:
<!--[hook displayProductListFunctionalButtons] 157-->т.е. в эту конструкцию id_product добавить невозможно.

В результате в хуке displayProductListFunctionalButtons для определённого id_product не могу закешировать информацию.
Как быть?
Хук динамический для показа новых элементов после загрузки списка товаров.
Так что сделать такое у вас не получится. Если хотите закешировать, то не используйте этот хук в шаблонах и модулях.
19 Май 2022, 13:04:59
Ответ #4
  • Ветеран
  • *****
  • Сообщений: 520
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Решил эту проблему, добавил id_product.

В Hook.php
if($hook_name == 'displayProductListFunctionalButtons') {
                            $data_wrapped = '<!--[hook '.$hook_name.'] '.$hook_args['id_product'].' '.$m['id_module'].'-->'.$data.'<!--[hook '.$hook_name.'] '.$hook_args['id_product'].' '.$m['id_module'].'-->';
                        }
В Controller.php
if($hook_name == 'displayProductListFunctionalButtons') {
                                $pattern = "/<!--\[hook $hook_name\] (.*?) $id_module-->(.*?)<!--\[hook $hook_name\] (.*?) $id_module-->/s";
                                if (preg_match_all($pattern, $content, $matches)) {
                                    foreach ($matches[1] as $key => $id_product) {
                                        $hook_args['id_product'] = $id_product;
                                        $hook_content = Hook::exec($hook_name, $hook_args, $id_module, false, true, false, null);
                                        $pattern = "/<!--\[hook $hook_name\] $id_product $id_module-->(.*?)<!--\[hook $hook_name\] $id_product $id_module-->/s";
                                        $hook_content = preg_replace('/\$(\d)/', '\\\$$1', $hook_content);
                                        $count = 0;
                                        $p_content = preg_replace($pattern, $hook_content, $content, 1, $count);
                                        if (preg_last_error() === PREG_NO_ERROR && $count > 0) {
                                            $content = $p_content;
                                        }
                                    }
                                }