Кэширование отображения продуктов с помощью Display Cache и возможность добавления продуктов

Я создаю сайт электронной коммерции, используя D7, в основном с Commerce и DS. Чтобы улучшить производительность, я установил Display Cache, который представляет собой модуль, который кэширует визуализированный HTML-код сущности для анонимных и аутентифицированных пользователей. В моем конкретном случае я кеширую отображение продукта (узел, который ссылается на продукт и его варианты, если таковые имеются).

После нескольких часов настройки я получаю "хороший результат" в производительности. Все мои объекты были кэшированы по ролям, в тизере и в полном режиме... но тогда проблема возникает, когда пользователь нажимает кнопку "Добавить в корзину", потому что он не добавляет товары в корзину... и не показывает ошибку.

Одной из возможных причин является маркер формы или некоторая функция обработки формы, которая делает недействительным действие, потому что форма генерируется не каждый раз, как ожидалось. Я прочитал, как отключить маркер формы в "Добавить в корзину" (или любую форму), но он не работает. Я установил для $form['#token'] значение false, но по-прежнему не добавляю товары в корзину.

Возможно, решение не простое, но мне нужны подсказки о том, что я мог бы сделать или где я мог бы начать решать проблему.

Итак, спасибо за ваш опыт.

1 ответ

Решение

Решение этой комбинации модулей для кэширования отображения для анонимных и аутентифицированных пользователей и добавления в корзину форм заключается в том, чтобы программно отключить кэш запрашиваемого продукта на всех его экранах... и отключить маркер "добавить в корзину". форма".

Вот код для отключения токена:

function YOUR_MODULE_form_alter(&$form, &$form_state, $form_id) {
    if (strstr($form_id, 'commerce_cart_add_to_cart_form') || strstr($form_id, 'views_form_commerce_cart_form_default')) {
        unset($form['#token']);
    }
}

А вот код для удаления кэширования при нажатии кнопки добавления в корзину:

function YOUR_MODULE_init() {
    if (isset($_POST['product_id'])) {
        $id_product = intval($_POST['product_id']);
        $res = views_get_view_result('sys_search_product_display', 'default', $id_product);
        foreach ($res as $nid) {
            display_cache_flush_cache('node', $nid);
        }
    }
}

Обратите внимание, что "sys_search_product_display" - это просто представление, которое получает идентификатор продукта и возвращает идентификатор отображения продукта. Это можно сделать другими способами.

Другие вопросы по тегам