On March 26, 2019 we launched new MODX Forums. Please join us at the new MODX Community Forums.
Subscribe: RSS
  • 0. Похоже, это не тот случай, где можно быстро передать конечный результат другому, дабы он не трахался столько времени smiley То, что я написал для себя вообще ужасно выглядит со стороны + заточено под конкретику, посему попробую передать суть на абстрактном примере. Возможно, у кого-то дойдут руки сделать что-то универсальное по похожему принципу.

    Кривой способ сделать сортировку по нужным параметрам. Как сделать лучше - пока не ведаю.

    1. Для примера возьму 4ре переменных:
    $p = цена. Значения: любые, заданные в соотв. ТВ
    $t = товар. Значения: любые, заданные в соотв. ТВ
    $b = "сортировать ПО". Значения: pagetitle, id и прочий стандарт, а также ТВ
    $s = прямая или обратная сортировка. Значения: 1,2.

    Создаем сниппет, например "SortLink":
    <?php
    # Забираем нужные переменные из строки адреса
    $p=$_GET[’p’];
    $t=$_GET[’t’];
    $s=$_GET[’s’];
    $b=$_GET[’b’];

    # Задаем плэйсхолдеры для сравнения и сохранения или смены сортировки "прямая/обратная"
    $modx->setPlaceholder(’plb’,$b);
    $modx->setPlaceholder(’pls’,$s);

    # Возвращаем все значения переменных в ссылку, кроме переменных "b" и "s".
    return ’<a href=[~[*id*]~]?p=’.$p.’&t=’.$t.’&b=’;
    ?>

    2. Ссылка для сортировки по имени:
    [[SortLink]]pagetitle[+phx:if=`[+plb+]`:is=`pagetitle`:and:if=`[+pls+]`:is=`2`:then=`&s=1>ИМЯ</a> &#8593;`+][+phx:if=`[+plb+]`:is=`pagetitle`:and:if=`[+pls+]`:is=`1`:then=`&s=2>ИМЯ</a> &#8595;`:or:if=`[+plb+]`:is=`pagetitle`:and:if=`[+pls+]`:is=``:then=`&s=2>ИМЯ</a> &#8595;`+][+phx:if=`[+plb+]`:isnot=`pagetitle`:then=`&s=[+pls+]>ИМЯ</a>`+]

    Ссылка для сортировки по товару:
    [[SortLink]]tovar[+phx:if=`[+plb+]`:is=`tovar`:and:if=`[+pls+]`:is=`2`:then=`&s=1>ТОВАР</a> &#8593;`+][+phx:if=`[+plb+]`:is=`tovar`:and:if=`[+pls+]`:is=`1`:then=`&s=2>ТОВАР</a> &#8595;`:or:if=`[+plb+]`:is=`tovar`:and:if=`[+pls+]`:is=``:then=`&s=2>ТОВАР</a> &#8595;`+][+phx:if=`[+plb+]`:isnot=`tovar`:then=`&s=[+pls+]>ТОВАР</a>`+]

    Ссылка для сортировки по цене:
    [[SortLink]]price[+phx:if=`[+plb+]`:is=`price`:and:if=`[+pls+]`:is=`2`:then=`&s=1>ЦЕНА</a> &#8593;`+][+phx:if=`[+plb+]`:is=`price`:and:if=`[+pls+]`:is=`1`:then=`&s=2>ЦЕНА</a> &#8595;`:or:if=`[+plb+]`:is=`price`:and:if=`[+pls+]`:is=``:then=`&s=2>ЦЕНА</a> &#8595;`+][+phx:if=`[+plb+]`:isnot=`price`:then=`&s=[+pls+]>ЦЕНА</a>`+]
    * Проверяет порядок сортировки; если ссылка другая - сохраняет, если та же - меняет.

    3. Предполагается что в сниппете вывода результатов поиска есть все для перехвата и обработки этих переменных. Как пример:
    # если 2, то сортировка обратная, иначе прямая
    if ($s == ’2’) { $s = ’DESC’; } else { $s = ’ASC’; }

    # если "сортировать по" не задано - сортировать по заголовку страницы
    if ($b == ’’) { $b = ’pagetitle’; }

    # Задаем значения для поиска дитто
    # Можно описать хоть 50 категорий товара
    if ($t == ’elka’) { $elka = ’tovar,elka,1|’; }
    if ($t == ’pihta’) { $pihta = ’tovar,pihta,1|’; }
    if ($t == ’sosna’) { $sosna = ’tovar,sosna,1|’; }
    # Задаем точное значение цены для поиска дитто, например "5000-10000"
    $pr = ’price,$p,1|’;

    # Склеиваем значения для поиска дитто (если нам нужен был поиск сразу по всем параметрам, например, магазина со всеми этими товарами)
    $filter = $pr.$elka.$pihta.$sosna;
    # Если поиск нужен только по одному из значений можно сделать проще:
    # $to = ’tovar,$t,1|’;
    # $filter = $pr.$to;

    # Задаем параметры для Дитто
    $params[’id’] = ’lcid’;
    $params[’startID’] = ’0’;
    $params[’sortBy’] = $b;
    $params[’sortDir’] = $s;
    $params[’hideFolders’] = ’1’;
    $params[’tpl’] = ’ditto_link’;
    $params[’language’] = ’russian’;
    $params[’dateFormat’] = ’%Y.%m.%d’;
    $params[’summarize’] = ’25’;
    $params[’paginate’] = ’1’;
    $params[’filter’] = $filter;
    $params[’debug’] = ’0’;

    # Передаем параметры Дитто
    $di = $modx->runSnippet(’Ditto’, $params);

    $style = ’Тут начало оформления.’;
    if ($b == ’pagetitle’) { $sortpo = ’
    * Сортировка по названию.’; }
    if ($b == ’price’) { $sortpo = ’
    * Сортировка по цене.’; }
    if ($b == ’tovar’) { $sortpo = ’
    * Сортировка по товару.’; }
    $textdo = $style.$sortpo;
    $textpo = ’Тут конец оформления.’;

    # Склеиаем текст-до + вызов Дитто + текст-после
    $resc = $textdo.$di.$textpo;

    # Выводим результат
    return $resc;

    P.S. Пример писал на форуме и на скорую руку, не тестил. Будут баги/вопросы - пишите, будет время - отвечу. Так же возможны орфографические и пунктуационные ошибки smiley Не придирайтесь.
    • разберитесь с tvExplorer’ом реально пригодится
        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

        Не используйте Revo для "просто сайтов". Используйте Evo

        Who can defeat the Russian bear?
      • Разобрался и использую в одном из разделов. Возможно, плохо разобрался. На сколько знаю, с помощью него можно задавать параметры для "поиска" (вывода документов по фильтру), но при этом нельзя задавать параметры для разной сортировки одного и того же вывода. А в данном случае требовалось дать юзеру возможность самому задавать прямую или обратную сортировку по любому из параметров. Например, чтобы юзер мог вывести все товары данного типа, но по возрастающей цене, или по названию товара, начиная с буквы "Я". В tvExplorer я этого не нашел, а чем переделывать его - в данном случае мне было проще написать свое. Долго тормозил над логикой PHx, чтобы сделать автогенерацию ссылок "если вывод сделан по этому параметру - то меняем порядок сортировки в ссылке, иначе - сохраняем" - поэтому решил создать эту тему smiley Но один PHx в данном случае не объяснил бы затеи, поэтому пришлось немного уйти в оффтоп...
        • Очень интересно!
          Давно ищу реализацию такой сортировки.
          Покажите, пожалуйста, вывод всего этого.
          Как пример: необходимо получить такое
          [!Ditto? &sortBy=`pagetitle`!] <!-- По наименованию asc|desc -->
          [!Ditto? &sortBy=`price`!] <!-- По цене asc|desc -->
          [!Ditto? &sortBy=`artikul`!] <!-- По артикулу asc|desc -->

          Спасибо
          • Quote from: designtorg at Jul 16, 2010, 01:32 PM

            Очень интересно!
            Давно ищу реализацию такой сортировки.
            Покажите, пожалуйста, вывод всего этого.
            Как пример: необходимо получить такое
            [!Ditto? &sortBy=`pagetitle`!] <!-- По наименованию asc|desc -->
            [!Ditto? &sortBy=`price`!] <!-- По цене asc|desc -->
            [!Ditto? &sortBy=`artikul`!] <!-- По артикулу asc|desc -->

            Спасибо
            Передавать через $_POST