Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Сортировка по цене товара

Следить
Главная
11:46
03 сен
#
?
Владимир написал:

у меня есть код:

{* <!-- по цене товара увеличение --> *}
{$temp = $smarty.const.SORT_PRODUCTS_MODE_BY_PRICE|default:''}
{$temp_selected = ($temp == $sort_form_field|default:'') ? 'selected' : ''}
<option {$temp_selected} value="{$temp|escape}">
    по цене
</option>

Нужно сделать в таком же виде два поля выбора сортировки: по цене увеличение, сортировку по цене уменьшение.

Вверху файла sort написано:

$sort_form_descending = булевой признак "сортировка в обратном порядке"

Я вставлял его вместо $sort_form_field - не работает


От разработчика: Кому не понятно, речь идет о таком блоке на странице списка товаров.


Картинка кликабельная.
22:24
03 сен
#
?
Макс написал:

Импера видать софт шпионов. Как правительственую телграму пишут. Кругом коснтанты в коде. А нельзя было нписать проше?

{* <!-- по названию товара --> *}
{$s = ($sort_form_field|default:'' == 6) ? 'selected' : ''}
<option {$s} value="6">
    по названию
</option>
23:01
03 сен
#
?
Макс написал:

Смотрите как поятным стал код sort.htm после оптимизаци. За основу взят код из шблона Furniture.

{* ================================================================================
  Блок сортировки товаров                                                         |
                                                                                  |
  Принимает во входных переменных:                                                |
    нет                                                                           |
                                                                                  |
  Использует другие переменные:                                                   |
    $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:''}

            {* состояние селекта *}
            {function selected v=0}
                {if $field == $v}
                    selected
                {/if}
            {/function}

            <form method="post">
                <div class="sort">
                    <b> Порядок </b>
                    <select name="by_field_sort" onchange="do_sort(this)">

                        {* как задано в настройках админпанели *}
                        <option {selected v=-1} value="-1">
                            как предложил менеджер
                        </option>

                        {* по названию товара *}
                        <option {selected v=6} value="6">
                            по названию
                        </option>

                        {* по цене товара *}
                        <option {selected v=1} value="1">
                            по цене
                        </option>

                        {* по наличию на складе *}
                        <option {selected v=2} value="2">
                            по наличию
                        </option>
                    </select>
                </div>

                {* если выбран не "как расставлены в админпанели" *}
                {if $field != 0}

                    {* обезопасили и упростили *}
                    {$descending = $sort_form_descending|default:''}
                    {$laconical = $sort_form_laconical|default:''}

                    {* состояние чекбокса *}
                    {function checked v=0}
                        {if $v == 1}
                            checked
                        {/if}
                    {/function}

                    <div class="limit">

                        {* направление сортировки *}
                        <label>
                            <input {checked v=$descending} name="descending_sort" onclick="do_sort(this)" type="checkbox" value="1" />
                            наоборот
                        </label>

                        {* лаконичность сортировки *}
                        <label>
                            <input {checked v=$laconical} name="laconical_sort" onclick="do_sort(this)" type="checkbox" value="1" />
                            лаконично
                        </label>
                    </div>
                {/if}
            </form>
        {/if}

        {* переключение вида карточек *}
        <div class="display">
            <div id="list_b" title="Списком"></div>

            <a id="grid_a" onclick="display('grid'); return false;" title="Блоками">
                Блоками
            </a>
        </div>

        <script>
            ...
            ...

            function do_sort(el) {
                jQuery(el).closest('form').submit();
            }
        </script>
    </div>
{/strip}

Читается ж намого приятнее. И думать легчекак сделать в селекте сорт туда сюда по цене.

05:42
04 сен
#
?
evGenius написал:

Wow Макс, ты просто супер! Решение теперь напрашивается само.

{* ================================================================================
  Блок сортировки товаров                                                         |
                                                                                  |
  Принимает во входных переменных:                                                |
    нет                                                                           |
                                                                                  |
  Использует другие переменные:                                                   |
    $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=1}
                {if $field == $f && $d == 1}
                    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} value="6">
                            по названию
                        </option>

                        {* по названию наоборот *}
                        <option {selected f=6 d=$descending} value="6" value2="1">
                            по названию наоборот
                        </option>

                        {* по цене товара *}
                        <option {selected f=1} value="1">
                            по цене
                        </option>

                        {* по цене товара наоборот *}
                        <option {selected f=1 d=$descending} value="1" value2="1">
                            по цене наоборот
                        </option>

                        {* по наличию на складе *}
                        <option {selected f=2} value="2">
                            по наличию
                        </option>

                        {* по наличию наоборот *}
                        <option {selected f=2 d=$descending} value="2" value2="1">
                            по наличию наоборот
                        </option>
                    </select>
                </div>

                {* направление сортировки *}
                <input name="descending_sort" type="hidden" value="0" />
            </form>
        {/if}

        {* переключение вида карточек *}
        <div class="display">
            <div id="list_b" title="Списком"></div>

            <a id="grid_a" onclick="display('grid'); return false;" title="Блоками">
                Блоками
            </a>
        </div>

        <script>
            ...
            ...

            function do_sort(el) {
                var $form = jQuery(el).closest('form');
                if (jQuery(el).attr('value2')) $form.find('input[name="descending_sort"]').val(1);
                $form.submit();
            }
        </script>
    </div>
{/strip}
08:49
04 сен
#
Разработчик написал:

Спасибо Максу за столь качественную оптимизацию модуля 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}
08:22
08 сен
#
?
Владимир написал:

Спасибо за поддержку, подскажите если у меня не работает селектор "наоборот" тут, в чем может быть косяк?

12:20
08 сен
#
Разработчик написал:

Введите ссылку заново.
Движок форума обновили, и выплыл косяк "проглатывание тега ссылки".
Теперь все исправлено.

20:03
08 сен
#
?
Владимир написал:

Написание ответа

Перед публикацией рекомендуется использовать Предпросмотр, чтобы увидеть конечный вид сообщения.


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.


Хостинг для сайта

Хостинг для интернет магазина

Svai.net

Украина
г. Черкассы
5+ Заказать

TutHost.ua

Украина
г. Киев
Заказать

Mirohost.net

Украина
г. Киев
? Заказать

HyperHosting.com.ua

Украина
г. Винница
i подробнее Заказать

Agava.ru

Россия
г. Москва
Заказать

Ukraine.com.ua

Украина
г. Киев
5 Заказать
Импераготовасотрудничатьс провайдерами Важно Учтите Этот список перечисляет лишь некоторых хостинг-провайдеров, у которых существуют специальные тарифные планы для интернет магазинов, а сам список не означает, что другие провайдеры чем-то хуже.

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

Демо Главная Хронология Соглашение Материалы Контакты