Проблемы при выборе сортировки товара, его производителя, и дополнительных параметров

Гриша К.

Новичок
Проблемы при выборе сортировки товара, его производителя, и дополнительных параметров

Здравствуйте.
Прошу ваших советов по решеению следующей задачи.

На странице каталога товаров, необходимо выводить товары в соответствии
- с выбранной сортировкой,
- выбранным производителем,
- выбранным значением типа дополнительных параметров товара (например: Жесткость, Обивка и т.д.)

Например на странице каталога (catid) выбрана сортировка по цене (sort) по убыванию (desc):
/catalog/?catid=59&sort=price&desc=1

-----------------------------
Дальше например пользователь хочет вывести товары по одному производителю (firmid) из списка производителей,
уже выбранные параметры сортировки должны сохраниться, для этого я использую переменную $QUERY_STRING = $_SERVER['QUERY_STRING'].
Ссылка на производителя выглядит так:
$QUERY_STRING&firmid=1 (/catalog/?catid=59&sort=price&desc=1&firmid=1)

Проблема возникает в том что, если производитель уже выбран и пользователь хочет выбрать другого производителя,
то ссылка будет выглядит следующим образом (дублируется $firmid):

$QUERY_STRING&firmid=2 (/catalog/?catid=59&sort=price&desc=1&firmid=1&firmid=2)
-----------------------------
Эту проблему решил так:
В шаблоне Smarty, использую поиск и замену строки, функция PHP preg_replace("firmid=(.*)&", "", $QUERY_STRING)
{assign var="QUERY_STRING_FIRM" value=$QUERY_STRING|regex_replace:"/firmid=(.*)&/":""}
{assign var="QUERY_STRING_FIRM" value=$QUERY_STRING_FIRM|regex_replace:"/&firmid=(.*)/":""}

В итоге "firmid=$firmid" не дублируется.
Как это делаете вы? правильный ли подход?




-----------------
Следующая проблема возникает в том, когда например выводится список параметров в виде ссылок:

Т.е к примеру из жесткости пользователь может выбрать один параметр.
Из обивки пользователь может выбрать тоже только один параметр.
Но одновременно могут быть выбраны одно значение Жесткости и Обивки,
и также должны сохраниться значения выбранного производителя и сортировки (ну это QUERY_STRING)/
Вот как сделать у меня не получается. Подскажите пожалуйста как это можно сделать?
Каким образом вы делаете возможность выбора значений из множества параметров?


Я пробовал делать ссылки так, но у меня не получается в итоге сделать так, как я описал выше:

Жесткость
- Средняя /?$QUERY_STRING&par1=1
- Большая /?$QUERY_STRING&par1=2
- Все /?$QUERY_STRING

Обивка
- Обычная /?$QUERY_STRING&par2=2
- Люкс /?$QUERY_STRING&par2=3
- Все /?$QUERY_STRING
 

Igor aka TiGR

Новичок
Используй форму. Они для этого и нужны. Если нужно, чтобы параметры были в адресной строке - используй метод GET, если это не важно - POST.
 

Гриша К.

Новичок
Igor aka TiGR, спасибо за ответ.
Я хотел бы всетаки сделать так, как я описал выше.
Вот пример похожей реализации: http://www.amazon.com/b/ref=amb_link_3401592_3/002-0296310-9409612?ie=UTF8&node=565098

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

Igor aka TiGR

Новичок
Да, кстати, если используешь php5, можно использовать функцию http_build_query. Там же в комментариях есть аналог функции для php4.
 

Гриша К.

Новичок
Igor aka TiGR, спасибо за функцию. У меня PHP4, но там есть исходник и для нее. Эта функция навела меня на одну мысль, возможно она поможет мне в моей реализации.
А с формой у меня все получилось, но ненравится мне с ней.


Ссылки на дополнительные параметры товаров я вывожу следующим образом:
PHP:
Жесткость
- Средняя	/?$QUERY_STRING&par[1]=1
- Большая	/?$QUERY_STRING&par[1]=2
- Все		/?$QUERY_STRING

Обивка
- Обычная	/?$QUERY_STRING&par[2]=2
- Люкс		/?$QUERY_STRING&par[2]=3
- Все		/?$QUERY_STRING
Дублирование например параметра par[1], я предотвращаю следующим образом:
PHP:
$QUERY_STRING = preg_replace("/par\[1\]=(.*)&/", "", $_SERVER['QUERY_STRING']);
$QUERY_STRING = preg_replace("/&par\[1\]=(.*)/", "", $_SERVER['QUERY_STRING']);
Конда строка url например такого вида:
/catalog/?catid=59&firmid=2&par[2]=4&par[1]=1
то все обрабатывается нормально.

Но если строка url например такого вида (в конце доьавлена $sort):
/catalog/?catid=59&firmid=2&par[2]=4&par[1]=1&sort=name,
то ссылка /?$QUERY_STRING&par[2]=2 принимает вид:
/catalog/?catid=59&firmid=2&sort=price&par[2]=6

Никак немогу разобраться с тем, почему заменяются обе переменных и par[1] и par[2], если они стоят не в конце Url строки. Возможно кто-то увидет ошибку в обработке переменных функцией preg_replace, или напишет еще вариант решения?
 

Igor aka TiGR

Новичок
В регулярных выражениях нужно заменить (.*) на [^&]*. Но это тупиковый путь. Будешь писать правила для всех возможных вариантов? Лучше или используй форму, или делай разборку/генерацию ссылки.
 

Igor aka TiGR

Новичок
Hint: Только не разбирай запрос регулярными выражениями ;) Не надо придумывать велосипед.
 

Гриша К.

Новичок
Сделал функцию для Smarty (легко переделывается на обычную) удаляющую переменные из запроса:
PHP:
// Функция удаления переменных из-запроса
function smarty_function_rewrite_query_without_var($params)
{
	$query = '';
	foreach($_GET as $key => $value)
	{
		
		if(!is_array($value))
		{
			if(!stristr($params['var'], $key))
				$query .= (!$query) ? $key.'='.$value : '&'.$key.'='.$value;
		}
		else
		{
			foreach($value as $key2 => $value2)
			{			
				if(!stristr($params['var'], $key.'['.$key2.']'))
					$query .= (!$query) ? $key.'['.$key2.']='.$value2 : '&'.$key.'['.$key2.']='.$value2;

			}
		}
	}
	
	return $query;
}
Пример

Запрос: /catalog/?catid=59&firmid=13&par[2]=4

Нужно удалить $firmid и $par[2] из запроса, чтобы сгенерировать ссылку с новыми значениями этих переменных.
PHP:
<a href="/catalog/?{rewrite_query_without_var var="firmid,par[2]"}&firmid=29&par[2]=17">Ссылка 59/29/17</a>
Результат: /catalog/?catid=59&firmid=29&par[2]=17


Как вы думаете нормально ли реализована функция? И нормален такой подход?
При тестировании (PECL :: APD), сокрость выполнения срипта уменьшилась на 0,02 - 0,03 ms, функция запускалась в 19 местах, думаю это нормально?
 

SiMM

Новичок
Igor aka TiGR> Если нужно, чтобы параметры были в адресной строке - используй метод GET, если это не важно - POST.
Не курите больше эту траву.
http://phpfaq.ru/na_tanke#http
 

Igor aka TiGR

Новичок
Хм... Спасибо за ссылочку, впредь буду на неё ссылаться. Просто влом было описывать ситуации в которых нужно использовать POST, а в которых GET. Посторался сформулировать короче... :D
 
Сверху