[EVO] Ditto request - сортировка.

Всем доброго времени суток)
Немного в продолжение предыдущей темы.
Я перешёл на get запросы, захотел сделать сортировку по цене и по названию.
<a href="[~[*id*]~]&ditto_sortBy=pagetitle&ditto_sortDir=ASC">возрастанию цены</a>

Такие ссылки тут не подойдут, тоесть мне нужно записать в конец всей строки Get, и ещё учитывать что нужно сделать следующие ссылки


&ditto_sortBy=pagetitle&ditto_sortDir=ASC
&ditto_sortBy=pagetitle&ditto_sortDir=DESC
&ditto_sortBy=price&ditto_sortDir=ASC
&ditto_sortBy=price&ditto_sortDir=DESC
&ditto_display=10..

Я написал сниппет, понимаю что в чужом коде разбираться сложно (прокомментировал как смог) просто может быть есть способ попроще всё это сделать?)
Если не сложно посмотрите что «навоял»(я ещё только учусь сильно не ругайте).">

<?php
$url=$_SERVER['REQUEST_URI']; //получаем GET строку
preg_match('/(.*?)&Submit/i',$url, $url);   //сохраняем что изначально
$url=$url[1]."&Submit=Просмотр";              // ввёл пользователь
		$theme = array(        //создаём массив значений
	    "1" => "&prams[]=1&ditto_display=",      //  &prams[] - создаём массив для отслеживания уже выбранных параметров
	    "2" => "&prams[]=2&ditto_sortBy=price&ditto_sortDir=",	    
	    "3" => "&prams[]=3&ditto_sortBy=pagetitle&ditto_sortDir=",
		);
if(isset($_GET['prams'])){ 
	foreach($_GET['prams'] as $value){	   // циклом дописываем те параметры которыеуже натыкал пользователь
    if($value==$id) $url.=$theme[$value].$num;   //работа с активным параметром
    else {
      $str=preg_replace("/\[]/", "\[]", $theme[$value]);  //вывод остальных параметров выбранных пользователем
preg_match('/'.$str.'(.*?)($|&)/i', html_entity_decode($_SERVER['REQUEST_URI']), $dir);
      $url.=$theme[$value].$dir[1];
         }
}
 if (!in_array($id, $_GET['prams'])) { $url.=$theme[$id].=$num;}  //если ещё ниразу не выбирался записываем параметр
}
else{ 
  $url.=$theme[$id].=$num; //если воообще ещё никаких параметров не было записываем
}
 ($modx->config['xhtml_urls']) ? $url : str_replace("&","&",$url);
return '<a class="'.$class.'" href="'.$url.'">'.$title.'</a>';    //выводим ссылку
?>

Вызов сниппета:

 echo $modx->runSnippet('ssilkido', array('num'=>'10','id'=>'1','class'=>'all','title'=>'10'));
 echo $modx->runSnippet('ssilkido', array('num'=>'20','id'=>'1','class'=>'all','title'=>'20'));
 echo $modx->runSnippet('ssilkido', array('num'=>'all','id'=>'1','class'=>'all','title'=>'показать все'));
echo $modx->runSnippet('ssilkido', array('num'=>'ASC','id'=>'2','class'=>'pron','title'=>'по цене')); 
echo $modx->runSnippet('ssilkido', array('num'=>'DESC','id'=>'2','class'=>'proff','title'=>'по цене')); 
echo $modx->runSnippet('ssilkido', array('num'=>'ASC','id'=>'3','class'=>'maron','title'=>'по марке')); 
echo $modx->runSnippet('ssilkido', array('num'=>'DESC','id'=>'3','class'=>'maroff','title'=>'по марке'));

Смысл снипетта: Сохраняем изначальную строку запроса пользователя, потом если есть какие то уже выбранные параметры- накладываем их и дописываем если нужно ещё, либо при наложении меняем на те значения которые нам нужны.

7 комментариев

avatar
написать по проще можно но логика правильная смотрим что есть в url и в зависимости от этого генерим ссылку
я правlа делел отдельно снипет
<a href="[!url? &exclude=`ditto_sort`!]ditto_sortBy=price">сортировать по цене </a> 
avatar
Я вот тоже думал так сделать-тогда нужно будет всего два вызова и вопрос скрытия одной из cсылок будет снят)Вот правда сейчас появилась одна мисль-попробую воплотить в жизнь)Спасибо)
avatar
avatar
Вот странно беру пример с сайта вставляю в сниппет выводится белый экран? Почему так может быть?
код примера:

<?php
echo http_build_url("http://user@www.example.com/pub/index.php?a=b#files",
    array(
        "scheme" => "ftp",
        "host" => "ftp.example.com",
        "path" => "files/current/",
        "query" => "a=c"
    ),
    HTTP_URL_STRIP_AUTH | HTTP_URL_JOIN_PATH | HTTP_URL_JOIN_QUERY | HTTP_URL_STRIP_FRAGMENT
);
?>
avatar
А я делал как здесь написано:
i--gu.ru/sortirovka-ditto
Комментарий отредактирован 2012-12-13 22:29:44 пользователем tiptop
avatar
Ухх спасибо)Помню что у дитто можно вводить id-шники но не помнил как)Сейчас кое что под черпну оттуда)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.