Также хочу поделиться своими доработками.
Многие наверняка пользовали "фильтр многоуровневой навигации". При задействовании любого из фильтров или переход на следующую страницу в категории при включенном модуле навигации пропадали чекбоксы для выбора товаров для сравнения.
А дело все в том, что в шаблонах product-list.tpl эти чекбоксы выводятся при условии
Код:
{if isset($comparator_max_item) && $comparator_max_item}
.
Соответственно есть два решения этого вопроса:
1) убрать в шаблоне это условие, т.е. найти
Код:
{if isset($comparator_max_item) && $comparator_max_item}
<p class="compare"><input type="checkbox" onclick="checkForComparison({$comparator_max_item})" class="comparator" id="comparator_item_{$product.id_product}" value="{$product.id_product}" /> <label for="comparator_item_{$product.id_product}">{l s='Select to compare'}</label></p>
{/if}
и заменить на
Код:
<p class="compare"><input type="checkbox" onclick="checkForComparison({$comparator_max_item})" class="comparator" id="comparator_item_{$product.id_product}" value="{$product.id_product}" /> <label for="comparator_item_{$product.id_product}">{l s='Select to compare'}</label></p>
и 2 решение - это объявить непосредственно в классе данную переменную.
Открываем свою папку с модулями и находим там blocklayered/blocklayered.php
За вывод данных после действий пользователя отвечает метод ajaxCall()
Соответственно для объявления переменной $comparator_max_item необходимо найти в данном методе место, где объявляются переменные для вывода в шаблон.
Я добавил строку
Код:
$smarty->assign('comparator_max_item', (int)(Configuration::get('PS_COMPARATOR_MAX_ITEM')));
после
Код:
$smarty->assign('products', $products);
В моем коде это находится где-то на 910 строке.
Теперь все должно работать.
Добавлено через 40 минут
Еще, возможно, кому-то будет полезно.
При выводе в фильтре многоуровневой навигации (blocklayered.php) значения характеристик и атрибутов внутри соответствующей группы фильтров никак не сортируются.
Для удобочитаемого вида блока необходимо добавить в запросы сортировку по наименованию характеристик и атрибутов.
Соответственно для сортировки характеристик необходимо:
Код:
$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT fvl.id_feature_value, fvl.value
FROM '._DB_PREFIX_.'feature_value fv
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fv.id_feature_value)
WHERE (fv.custom IS NULL OR fv.custom = 0) AND fv.id_feature = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND fvl.id_lang = '.(int)$id_lang);
заменить на:
Код:
$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance()->ExecuteS('
SELECT fvl.id_feature_value, fvl.value
FROM '._DB_PREFIX_.'feature_value fv
LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = fv.id_feature_value)
WHERE (fv.custom IS NULL OR fv.custom = 0) AND fv.id_feature = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND fvl.id_lang = '.(int)$id_lang.'
ORDER BY `fvl`.`value` ASC');
для сортировки атрибутов:
Код:
$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
SELECT al.id_attribute, al.name, a.color
FROM '._DB_PREFIX_.'attribute a
LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute)
WHERE a.id_attribute_group = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND al.id_lang = '.(int)$id_lang);
заменить на:
Код:
$filterBlocks[(int)$filter['position']]['SQLvalues'] = Db::getInstance()->ExecuteS('
SELECT al.id_attribute, al.name, a.color
FROM '._DB_PREFIX_.'attribute a
LEFT JOIN '._DB_PREFIX_.'attribute_lang al ON (al.id_attribute = a.id_attribute)
WHERE a.id_attribute_group = '.(int)$filterBlocks[(int)$filter['position']]['id_key'].' AND al.id_lang = '.(int)$id_lang.'
ORDER BY `al`.`name` ASC');
Это все хозяйство находится в методе generateFiltersBlock
В моем варианте данного модуля данные запросы расположены между строками 584 и 601