Как Сделать Чтобы Дополнительный Блок Появлялся Только Для Всех Товаров Одной Категории


#1

Добрый день.

Есть такая задача. Надо в одной категории на всех товарах выводить один дополнительный блок (видоизмененный блок "похожих товаров"). Таких товаров в этой категории около 75000. На всех остальных товарах во всех остальных категориях этот блок не нужен, буду выводить обычный блок "похожие товары". Этих товаров в остальных категориях будет около 50000.

Я нашел следующие способы реализации:
1. В настройках макетов, в настройках блока указать, для каких товаров его показывать. Но я предполагаю, что если ввести туда список из 75000 товаров, то и вывод страницы товара для посетителей существенно замедлится, и редактировать этот список будет сложно при добавлении/удалении товаров. Так ли это?

2. Создать новую страницу макета товаров, и для этой страницы указать список из 75000 товаров, для которых эта страница макета актуальна. Но здесь те же опасения, что и в первом пункте. Не знаю, какой из вариантов будет работать быстрее - первый или второй?

3. Создать smarty блок на странице макета товара, в котором указать, что если товар находится в заданной категории, то надо отображать новый созданный блок с "похожими товарами". Мне кажется, что в этом случае не должно быть проблем со скоростью открытия страниц товаров. Поправьте, если я ошибаюсь. Но я не смог разобраться, как с помощью smarty вывести на экран нужный блок. И возможно ли это вообще, или smarty выводит только переменные, но не может вывести готовый блок?
Я задаю в smarty блоке:
{if $product.seo_path == 1}
надо вывести блок с "похожими товарами". Подскажите, что надо тут прописать, чтобы вывести нужный мне блок, id блока 49
{else}
не надо ничего выводить
{/if}

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

Подскажите наиболее правильный способ решения исходной задачи. Если это можно сделать с помощью smarty или изменения кода движка, то подскажите код. Если только как описано в 1 и 2 пункте, то подскажите, какой лучше выбрать и будет ли заметно увеличение времени открытия страницы товара.

Спасибо.


#2

Здравствуйте!

Добрый день.

Есть такая задача. Надо в одной категории на всех товарах выводить один дополнительный блок (видоизмененный блок "похожих товаров"). Таких товаров в этой категории около 75000. На всех остальных товарах во всех остальных категориях этот блок не нужен, буду выводить обычный блок "похожие товары". Этих товаров в остальных категориях будет около 50000.

Я нашел следующие способы реализации:
1. В настройках макетов, в настройках блока указать, для каких товаров его показывать. Но я предполагаю, что если ввести туда список из 75000 товаров, то и вывод страницы товара для посетителей существенно замедлится, и редактировать этот список будет сложно при добавлении/удалении товаров. Так ли это?

2. Создать новую страницу макета товаров, и для этой страницы указать список из 75000 товаров, для которых эта страница макета актуальна. Но здесь те же опасения, что и в первом пункте. Не знаю, какой из вариантов будет работать быстрее - первый или второй?

3. Создать smarty блок на странице макета товара, в котором указать, что если товар находится в заданной категории, то надо отображать новый созданный блок с "похожими товарами". Мне кажется, что в этом случае не должно быть проблем со скоростью открытия страниц товаров. Поправьте, если я ошибаюсь. Но я не смог разобраться, как с помощью smarty вывести на экран нужный блок. И возможно ли это вообще, или smarty выводит только переменные, но не может вывести готовый блок?
Я задаю в smarty блоке:
{if $product.seo_path == 1}
надо вывести блок с "похожими товарами". Подскажите, что надо тут прописать, чтобы вывести нужный мне блок, id блока 49
{else}
не надо ничего выводить
{/if}

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

Подскажите наиболее правильный способ решения исходной задачи. Если это можно сделать с помощью smarty или изменения кода движка, то подскажите код. Если только как описано в 1 и 2 пункте, то подскажите, какой лучше выбрать и будет ли заметно увеличение времени открытия страницы товара.

Спасибо.

Как вариант, можно попробовать решить эту задачу через модуль My changes (необходимо тестирование, не применяйте на "живом" магазине).

Создайте файл app/addons/my_changes/init.php со следующим содержимым:

<?php
       if (!defined('BOOTSTRAP')) { die('Access denied'); }
   fn_register_hooks(
       'get_products_pre',
   );

Код файла init.php добавляет вызов нашей функции, fn_my_changes_get_products_pre из func.php

Создайте файл app/addons/my_changes/func.php со следующим содеримым:
<?php
       function fn_my_changes_get_products_pre(&$params, &$items_per_page, &$lang_code){
           if (!empty($params['similar'])) {
               if (!empty($params['only_for_choosed_categories'])) {
                   $product = Tygh::$app['view']->getTemplateVars('product');
               // Если категория продукта не в указанных категориях,
               // пытаемся сделать, так чтобы продукты не нашлись и блок соотв. не выводился
               if(!in_array($product['main_category'], $params['only_for_choosed_categories'])  ){ 
                   $params['cid'] = 'NULL';
               }
           }
       }
   }

Код файла func.php должен при заданном значении параметра ['only_for_choosed_categories'] проверять категорию продукта с указанными в параметрах блока.

Создайте файл app/addons/my_changes/schemas/block_manager/fillings.post.php
<?php
       $schema['similar']['only_for_choosed_categories'] => array (
           'type' => 'picker',
           'option_name' => 'filter_by_categories',
           'picker' => 'pickers/categories/picker.tpl',
           'picker_params' => array(
                   'multiple' => true,
                   'use_keys' => 'N',
                   'view_mode' => 'table',
           ),
           'unset_empty' => true, // remove this parameter from params list if the value is empty
       );

Код файла fillings.post.php добавляет доп. настройку позволяющую выбирать категорию.

Таким образом, в настройках заполнения блока появится дополнительный параметр для выбора категории.


#3

Спасибо, я попробую. Очень нужная фишка!


#4

Menya tozhe nado testrovat eto, spasibo!


#5

Я попробовал. но у меня ничего не получилось.

Блок никак не поменялся

Но вот еще, я написал в службу поддержки. вот мой вопрос и их ответ:

ВОПРОС:

Хотим создать блок "С этим товаром так же покупают", но не можем понять, как сделать !ОДИН! блок для всех товаров категории на странице "Продукта", не делая эту настройку вручную для каждого товара.

Например: категория Обувь-> Обувь детская. В ней ~400 товаров. Мы хотим, что бы при открытии карточки каждого товара в этой категории у нас появлялся блок с пресетом определенных товаров.
Мы поняли, что можно в каждом товаре установить свои настройки блока. но не поняли, как не заходить во все 400 товаров, а категорий у нас тоже много. И самое главное. что бы новые товары, которые выгружаются из 1С, сразу были с этими настройками.

ОТВЕТ:

Спасибо, что обратились к нам.

К сожалению, в стандартной версии CS-Cart можно установить какой-либо блок только на весь макет "Товары", добавив исключения в настройках блока. В исключениях можно добавлять только отдельные товары, на которых блок нужно скрывать (если блок глобально включен) или наоборот, отображать (в случае, если блок глобально выключен). На новые товары, выгруженные из 1С, распространяется только глобальная настройка блока.

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

Список рекомендованных нами партнеров можно найти в разделе Рекомендованные разработчики на нашем сайте:

http://www.cs-cart.ru/partner-rating.html


#6

Я попробовал. но у меня ничего не получилось.

После изменений кэш почистили? Все схемы хранятся в кэше, поэтому нужно почистить после внесения изменений, для верности лучше удалить папку var/cache

Ну и самая частая ошибка - модуль Мои изменения выключен или не активирован


#7

Я данный вопрос решил "прямой записью в базу"

У меня 4.6.1 - версия

Брал таблицу, cscart_bm_blocks:

SELECT *
FROM cscart_bm_blocks cbb
, cscart_bm_blocks_content cbbc
WHERE cbb.block_id = 82

AND cbb.block_id = cbbc.block_id

И смотрел - как добавляется нужная группировка товаров.

У меня добавилась строка:

82 products a:4:{s:8:"template";s:41:"blocks/products/products_multicolumns.tpl";s:11:"item_number";s:1:"Y";s:17:"number_of_columns";s:1:"3";s:23:"hide_add_to_cart_button";s:1:"Y";} 1 0 37 products 82 ru a:1:{s:5:"items";a:2:{s:7:"filling";s:8:"manually";s:8:"item_ids";s:12:"249,281,1127";}}

Я ее "проанализировал" и понял, что можно указать только поле "object_id" - который соответсвует product_code.

Я вытащил запросом все коды продуктов в нужных категориях и добавил нужное количество строк в cscart_bm_blocks с полученными кодами. Ну и все получилось.

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

Но пока до этого не зашел, собираю запросы, и пробую.

Возможно это можно делать через API - но мне показалось, что с базой я быстрее разберусь. Хотя, если бы у меня были готовые фрагменты кода взаимодествия с АПИ, то возможно я бы использовал API через PHP.


#8

После изменений кэш почистили? Все схемы хранятся в кэше, поэтому нужно почистить после внесения изменений, для верности лучше удалить папку var/cache

Ну и самая частая ошибка - модуль Мои изменения выключен или не активирован

Я попробую, не помню. Скорее всего - да. Но не уверен. У очень большое спасибо за ответ.