Спасибо Максу за столь качественную оптимизацию модуля sort.htm - блок сортировки товаров, применявшегося в шаблоне Furniture, а также некоторых других шаблонах с той же страницы (Catholic, Cosmetics, Electronics, FeminineLU, PCgames, PetStore - в каждом случае модуль sort.htm может чуть отличаться согласно особенностям html-верстки шаблона, в основном это другие классы и идентификаторы отдельных элементов блока и наличие или отсутствие в теле блока скриптов переключения внешнего вида карточек товаров).
Единственное, с чем я не согласен, это отказ от констант в оптимизированном коде. Обсуждая модуль в этой ветке форума, мы еще помним, откуда в оптимизированном коде появилось, например число -1 в конструкции <option {selected v=-1} value="-1">. Вне ветки будет сложно понимать, что это за число, почему создатель модуля в этом месте написал -1, а скажем не -2. Константа же, хоть и усложняет чтение кода, зато однозначно указывает суть параметра.
Спасибо также evGenius за элегантное решение переноса флажка "наоборот" в опции селектора. Ниже привожу окончательный код решения, где добавлен скрытый флажок "лаконично", чтобы работа модуля точно соответствовала всем нюансам, плюс скрипт обработки формы сортировки перенесен к самой форме, плюс w3c-невалидный атрибут value2 заменен атрибутом data-checkbox. Скрипт переключения вида карточек оставил обозначенным троеточием, так как в одних шаблонах он есть, в других нет. Числа на костанты не менял, чтобы вам легче было читать код.
Суть оптимизации Макса:
- один раз вначале упрощаем часто используемые переменные, чтобы дать им имена короче и ниже по коду избавиться от нечитабельных |default:''
- создаем функцию selected, эквивалентную частым действиям по генерации атрибута состояния в опциях селектора
- в тегах опций просто вызываем эту функцию, сообщая соответствующий тегу номер способа сортировки
Суть решения evGenius:
- флажки "наоборот" и "лаконично" не удаляем, а скрываем, чтобы форма все-таки передавала полный набор параметров
- скрытые флажки изначально настроены на передачу значения 0 (флажок не пометили)
- в опции селектора, где требуется одновременная установка связанного флажка, устанавливаем вымышленный атрибут data-checkbox="1"
- дополняем скрипт отправки формы проверкой необходимости принудительной установки связанного флажка на основании того, что в выбранной опции селектора присутствует атрибут data-checkbox
- дополняем функцию selected, генерирующую атрибут состояния опции селектора, проверкой того, что опция может быть связана с флажком
- в тегах нужных опций дополнительно передаем в функцию selected текущее состояние связанного флажка
{* ================================================================================
Блок сортировки товаров |
|
Принимает во входных переменных: |
нет |
|
Использует другие переменные: |
$sort_form_field = номер выбранного режима сортировки (по какому полю) |
$sort_form_descending = булевой признак "сортировка в обратном порядке" |
$sort_form_laconical = булевой признак "сортировка в лаконичном режиме" |
$settings = объект настроек сайта |
================================================================================ *}{strip}
<div class="product-filter">
{* если сортировка разрешена *}
{if $settings->sort_form_enabled|default:false}
{* обезопасили и упростили *}
{$field = $sort_form_field|default:''}
{$descending = $sort_form_descending|default:''}
{* состояние селекта и связанного чекбокса *}
{function selected f=0 d=true}
{if $field == $f && $d}
selected
{/if}
{/function}
<form method="post">
<div class="sort">
<b> Порядок </b>
<select name="by_field_sort" onchange="do_sort(this)">
{* как задано в настройках админпанели *}
<option {selected f=-1} value="-1">
как предложил менеджер
</option>
{* по названию товара *}
<option {selected f=6 d=!$descending} value="6">
по названию
</option>
{* по названию наоборот *}
<option {selected f=6 d=$descending} value="6" data-checkbox="1">
по названию наоборот
</option>
{* по цене товара *}
<option {selected f=1 d=!$descending} value="1">
по цене
</option>
{* по цене товара наоборот *}
<option {selected f=1 d=$descending} value="1" data-checkbox="1">
по цене наоборот
</option>
{* по наличию на складе *}
<option {selected f=2 d=!$descending} value="2">
по наличию
</option>
{* по наличию наоборот *}
<option {selected f=2 d=$descending} value="2" data-checkbox="1">
по наличию наоборот
</option>
</select>
</div>
{* направление сортировки *}
<input name="descending_sort" type="hidden" value="0" />
{* лаконичность сортировки *}
<input name="laconical_sort" type="hidden" value="0" />
</form>
{* скрипт отправки формы сортировки *}
<script>
function do_sort(el) {
var form = jQuery(el).closest('form');
if (jQuery(el).attr('data-checkbox')) {
jQuery(form).find('input[name="descending_sort"]').val(1);
}
jQuery(form).submit();
}
</script>
{/if}
{* переключение вида карточек *}
<div class="display">
<div id="list_b" title="Списком"></div>
<a id="grid_a" onclick="display('grid'); return false;" title="Блоками">
Блоками
</a>
</div>
{* скрипт переключения вида карточек *}
<script>
...
...
</script>
</div>
{/strip}