Поиск товаров в Virtuemart 2 по нескольким фильтрам
Задача: создать для Виртумарта 2 (Joomla 2.5) поисковый фильтр, учитывающий сразу несколько параметров товара. Предыстория обсуждения.
Решение:
1) Открываем файл \administrator\components\com_virtuemart\models\product.php
Находим в нем следующий код:
if (!empty($this->searchcustoms)){
$joinCustom = true ;
....
}
и заменяем его:
if (!empty($this->searchcustoms)){
$joinCustom = true;
foreach ($this->searchcustoms as $key => $searchcustom) {
if($searchcustom=trim($searchcustom)){
$key=intval($key);
$custom_search[$key] = '(pf'.$key.'.`virtuemart_custom_id`="'.$key.'" and pf'.$key.'.`custom_value` like "' . $this->_db->getEscaped( $searchcustom, true ) . '")';
}
}
if(count($custom_search)) $where[] = " ( ".implode(' AND ', $custom_search )." ) ";
else{
$joinCustom=false;
$this->searchcustoms=false;
}
}
2) ниже находим строку if ($this->searchcustoms) { и тоже заменяем:
if ($this->searchcustoms) {
foreach (array_keys($this->searchcustoms) as $key) {
$joinedTables .= ' LEFT JOIN `#__virtuemart_product_customfields` as pf'.$key.' ON p.`virtuemart_product_id` = pf'.$key.'.`virtuemart_product_id` ';
}
}
3) открываем файл \components\com_virtuemart\views\category\tmpl\default.php
Находим строку <div class="orderby-displaynumber"> и после нее заменяем этот код
<div class="width70 floatleft">...</div> на этот:
<?php
/*
Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» и «Цвет», тип поля «Атрибут корзины».
*/
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
$customfields=array(4=>0, 10=>0);
$var=JRequest::getvar('customfields', null);
foreach($customfields as $custom_id => &$value){
if($var && !empty($var[$custom_id]))
$value='&customfields['.$custom_id.']='.$var[ $custom_id];
else unset($customfields[$custom_id]);
}
$db=JFactory::getDbo();
foreach($results as $custom_id => &$result){
$ff=$customfields;
unset($ff[$custom_id]);
$ff=implode('', $ff);
$title=$result;
$result='';
$db->setQuery('SELECT DISTINCT(custom_value) AS value FROM #__virtuemart_product_customfields WHERE virtuemart_custom_id='.$custom_id);
$res=$db->loadObjectList();
if(!is_array($res) || !count($res)) continue;
//Массив значений
$a=array(0=>'Любой');
//Заносим данные из таблицы в массив значений
foreach($res as $v) $a[$v->value]=$v->value;
//Сортируем
ksort($a);
//Получаем значение выбранного фильтра из запроса пользователя
$value=JRequest::getvar('customfields', null);
$value=(isset($value[$custom_id])) ? $value[$custom_id] : 0;
//Это значение помещаем в начало массива
if($value && isset($a[$value])){
$x=array( $value=>'' );
foreach($a as $k => $v) $x[$k]=$v;
$a=$x;
}else $value=0;
//Создаем фильтр
$result='<div class="orderlistcontainer"><div class="title">'.$title.'</div>';
$flag=false;
foreach($a as $k => $v){
if((string)$k==(string)$value) $x='<div class="activeOrder">';
else{
if(!$flag){
$x='<div class="orderlist"><div>';
$flag=true;
}else $x='<div>';
}
$result.=$x.'<a href="'.JRoute::_('index.php?option=com_virtuemart&view=category&limitstart=0&virtuemart_category_id='.$this->category->virtuemart_category_id.$ff.(($k) ? '&customfields['.$custom_id.']='.$k : '')).'">'.$v.'</a></div>';
}
$result.='</div></div>';
}
?>
<div class="width70 floatleft">
<table border=0 cellpadding="0" cellspacing="0" style="margin:0;padding:0">
<tr><td>
<?php echo $this->orderByList['orderby']; ?>
<?php echo $this->orderByList['manufacturer']; ?>
</td>
<td> <?php echo $results[4]; ?> </td>
<td> <?php echo $results[10]; ?> </td>
</tr></table></div>
Комментарии
Да, к сожалению, иногда при сохранении статьи бывают вот такие искажения, исправили в коде:
$value='&customfields['.$custom_id.']='.$var[ $custom_id];
if($k==$value) тип (string) помогал не при всех значениях атрибута.
И сразу вопрос. Как сделать возврат строки вроде "Извините ничего не найдено и кнопка сброса фильтров" .
За хак большая благодарность очень полезный.
файл \components\com_virtuemart\views\category\tmpl\default.php
//добавить в нужно место
echo '<a href="'.preg_replace('/\?.+$/i', '', $_SERVER['REQUEST_URI']).'">Сбросить фильтр</a>';
заменить
if (!empty($this->products)) {
на
if (true) {
заменить
<h1><?php echo $this->category->category_name; ?></h1>
на
<?php if(!count($this->products)) echo '<center>Товаров не найдено</center>'; ?>
если есть значение у товара (размер: 1) - выводится фильтр, если нету - не выводится. Чтоб у разных категорий разные фильтры стояли.
Сейчас так и есть, если значений нет, то фильтра тоже нет. if(!is_array($res) || !count($res)) continue;
Цитата Nik
например, по адресу станицы, если есть слово одежда, один фильтр, есть - обувь, то второй:
if(preg_match('#/odezhda#i', $_SERVER['REQUEST_URI'])){
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
$customfields=array(4=>0, 10=>0);
}elseif(preg_match('#/obuv#i', $_SERVER['REQUEST_URI'])){
$results=array(5=>'Выбрать размер обуви');
$customfields=array(5=>0);
}
вставил после:
$results=array(16=>'Выбрать размер', 17=>'Выбрать цвет');
$customfields=array(16=>0, 17=>0);
Результата 0,
Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» и «Цвет», тип поля «Атрибут корзины».
*/
if(preg_match('#/test1#i', $_SERVER['REQUE ST_URI'])){
$results=array(16=>'Выбрать размер');
$customfields=array(16=>0);
}elseif(preg_match('#/test2#i', $_SERVER['REQUE ST_URI'])){
$results=array(17=>'Выбрать цвет');
$customfields=array(17=>0);
}
$var=JRequest::getvar('customfields', null);
foreach($customfields as $custom_id => &$value){
if($var && !empty($var[$custom_id]))
$value='&customfields['.$custom_id.']='.$var[ $custom_id];
else unset($customfields[$custom_id]);
}
$db=JFactory::getDbo();
я лишь указал простой способ фильтрации по категории, http://2v3.su/blog/web/56.html#comment-25
Про нулевой результат не понял.
Так сложно угадать ошибку, почему у вас ничего не выводится, поскольку пример рабочий. Единственное, может что-то было вставлено не так. Ну и подобная конструкция if(preg_match('#/odezhda#i', $_SERVER['REQUE ST_URI'])){ будет работать только при включенном ЧПУ и при данном названии категории (odezhda).
Отправил оригинал статьи и файлы.
Но вот если у товаров данной категории не назначены параметры в каком-нибудь из дополнительных полей, - как можно сделать, чтоб автоматом фильтр не выводился?
Если я правильно понял, если запрос в базу возвращает пустой результат, то фильтр не должен выводиться. Сейчас так и есть. Уточните?
Если в поле custom_value таблицы #__virtuemart_product_customfields есть хоть одна запись, - она выводится независимо от того, принадлежит ли параметр товару из категории, в которой в данный момент находится пользователь или нет. А это не желательно.
Надо, чтоб выводился список параметров только если в данной категории есть такие товары. Другими словами, связать ID категории из строки запроса, таблицу #__virtuemart_product_categories и #__virtuemart_product_customfields. И делать проверку. У меня почему-то не получилось, - мало опыта в PHP.
вот запрос:
$db->setQuery('SELECT DISTINCT(cf.custom_value) AS value FROM #__virtuemart_product_customfields AS cf JOIN #__virtuemart_product_categories AS c ON cf.virtuemart_product_id=c.virtuemart_product_id WHERE c.virtuemart_category_id="'.intval($_REQUEST['virtuemart_category_id']).'" AND cf.virtuemart_custom_id='.$custom_id);
И в случае $_REQUEST[ 'virtuemart_cat egory_id'] у меня тоже ничего не выводит. Я таким макаром это значение вытаскиваю:
$cat=JRequest::getvar('virtuemart_category_id', null);
$cat=intval($cat);
Тогда запрос получается вида:
$db->setQuery('SELECT DISTINCT(cf.custom_value) AS value FROM #__virtuemart_product_customfields AS cf JOIN #__virtuemart_product_categories AS c cf.virtuemart_product_id=c.virtuemart_product_id WHERE c.virtuemart_product_id="'.$cat.'" AND cf.virtuemart_custom_id='.$custom_id);
Но повторюсь, не работает.
P.S. уведомления о новых комментариях не приходят на почту почему-то.
в запросе я пропустил ON cf.virtuemart_product_id=c.virtuemart_product_id - и еще, компонент комментариев ставит кучу пробелов, удалите их. Запрос лучше тестируйте в phpmyadmin, если есть ошибка в синтаксисе, сразу увидите.
На счет уведомлений, проверьте спам, к нам приходят.
Эт я заметил...
$cat=JRequest::getvar('virtuemart_category_id', null);
$cat=intval($cat);
$db->setQuery(
'SELECT DISTINCT (cf.custom_value) AS value
FROM #__virtuemart_product_customfields AS cf
JOIN #__virtuemart_product_categories AS c
ON cf.virtuemart_product_id = c.virtuemart_product_id
WHERE c.virtuemart_category_id ="'.$cat.'"
AND cf.virtuemart_custom_id ='.$custom_id
);
Ну если все работает, то хорошо.
Работает.
Ну и хотелось бы добавить для посетителей, что файл default.php желательно вынести в папку html/com_virtuemart/category/ шаблона сайта (дабы избежать сноса при обновлении). А вот с product.php как поступить в этом случае, - не знаю. Думаю, тут в плагин выносить надо и переопределять class VirtueMartModelProduct.
Я сделал 2 настраиваемых поля Рост и Размер прописал их ID в код. Но ничего не изменилось.
Помогите пожалуйста с этим вопросом, может что я недоглядел.
Еще хотелось бы задать вопрос, я смотрю вы ковыряли category/default.php. Я мозг сломал но вывел в категории настраиваемые поля, но возникла проблема: значение он берет из бызы, а имя я вручную в диве воткнул. и получается что на всех товарах он дает имя рост и вес, даже там где не надо... Как задать условие, да и вообще как правильно вывести настраиваемые поля в категории, c названиями полей, что бы было условие что если не заполнены то и не показываются. и фильтрацию по ним. Вирту уже 5 лет а на самые важные моменты разработчики забили....
Я буду очень признателен Вам если вы поможете решить данную проблему, я имею ввиду про финансовое поощрение.
Заранее спасибо.
Пример рабочий, еще раз все проверьте, тут пробелы вкрадываются.
Цитата eXereS
об этом вроде писали выше, фильтруем по категории так:
$cat=intval(JRequest::getvar('virtuemart_category_id', 0));
$db->setQuery(
'SELECT DISTINCT (cf.custom_valu e) AS value
FROM #__virtuemart_p roduct_customfi elds AS cf
JOIN #__virtuemart_p roduct_categori es AS c
ON cf.virtuemart_p roduct_id = c.virtuemart_pr oduct_id
WHERE c.virtuemart_ca tegory_id ="'.$cat.'"
AND cf.virtuemart_c ustom_id ='.$custom_id
);
можно еще и в начале добавить:
$cat=intval(JRequest::getvar('virtuemart_category_id', 0));
$results=$customfields=0;
if(in_array($cat, array(1,2))){
$results[4]='Выбрать размер';
$customfields[4]=0;
}
if(in_array($cat, array(3))){
$results[10]='Выбрать цвет';
$customfields[10]=0;
}
это <td> <?php echo $results[4-10]; ?> </td> можно заменить на:
foreach($results as $v) echo '<td>'.$v.'</td>';
Цитата eXereS
Тут имелось в виду, что допиливать много чего приходится самостоятельно.
Подскажите, пожалуйста, где копать. При выборе одного фильтра, в другом выводятся все значения (а не только отфильтрованные). Все остальное работает. Например создаю товар со значениями customfields[8]=888 и customfields[9]=999. Выбираю во втором фильтре 999. В первом вижу не только 888, а все возможные значения. $value при выводе первого фильтра хранит значение &customfields[9]=999
Получается, sql-запрос как-то не очень работает? Тестирую на Денвере.
если я правильно понял, то вот, не тестировал, но копать в эту сторону:
$sql='';
if($var){
foreach($customfields as $custom_id2 => $value){
if($custom_id!=$custom_id2 && !empty($var[$custom_id2])){
$sql.=' JOIN (SELECT virtuemart_product_id FROM #__virtuemart_product_customfields WHERE virtuemart_custom_id="'.$custom_id2.'" AND custom_value="'.$var[ $custom_id2].'") AS p
ON cf.virtuemart_product_id=p.virtuemart_product_id ';
}
}
}
$db->setQuery(
'SELECT DISTINCT (cf.custom_value) AS value
FROM #__virtuemart_product_customfields AS cf
JOIN #__virtuemart_product_categories AS c
ON cf.virtuemart_product_id = c.virtuemart_product_id
'.$sql.'
WHERE c.virtuemart_category_id ="'.$cat.'"
AND cf.virtuemart_custom_id ='.$custom_id
);
возможно, что просто нет элементов, удовлетворяющих сразу 3 фильтрам.
http://2v3.su/blog/web/56.html#comment-113
в файле \administrator\components\com_virtuemart\models\product.php, перед строкой:
return $product_ids;
добавьте:
echo $select . $joinedTables . $whereString . $groupBy . $orderBy; (потом убрать)
с этим запросом можно поэкспериментировать в phpmyadmin вручную, какие элементы он будет выдавать.
echo одинаков для обоих версий - модифицировааной (JOIN (SELECT virtuemart_product_id...) и изначальной:
l.`virtuemart_product_id` FROM `#__virtuemart_products_ru_ru` as l JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`) LEFT JOIN `#__virtuemart_product_categories` ON p.`virtuemart_product_id` = `#__virtuemart_product_categories`.`virtuemart_product_id` LEFT JOIN `#__virtuemart_categories_ru_ru` as c ON c.`virtuemart_category_id` = `#__virtuemart_product_categories`.`virtuemart_category_id` LEFT JOIN `#__virtuemart_product_customfields` as pf8 ON p.`virtuemart_product_id` = pf8.`virtuemart_product_id` LEFT JOIN `#__virtuemart_product_customfields` as pf9 ON p.`virtuemart_product_id` = pf9.`virtuemart_product_id` LEFT JOIN `#__virtuemart_product_shoppergroups` ON p.`virtuemart_product_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_product_id` LEFT OUTER JOIN `#__virtuemart_shoppergroups` as s ON s.`virtuemart_shoppergroup_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_shoppergroup_id` WHERE ( ( (pf8.`virtuemart_custom_id`="8" and pf8.`custom_value` like "шкафы") AND (pf9.`virtuemart_custom_id`="9" and pf9.`custom_value` like "открыт.") ) AND p.`published`="1" AND `#__virtuemart_product_categories`.`virtuemart_category_id` = 68 AND ( s.`virtuemart_shoppergroup_id`= "1" OR s.`virtuemart_shoppergroup_id` IS NULL ) ) group by p.`virtuemart_product_id` ORDER BY product_name
я к чему клонил-то, что есть ли такие элементы (товары) в базе, которые бы заранее удовлетворяли 3-м фильтрам, например, рубашка: цвет=1;размер=2;материал=3.
и вообще, странные слова в поиске: "шкафы" и "открыт." (еще и с точкой) - скиньте хоть один пример товара с заполненными доп. полями, из админки виртумарта, т.е. что вписано в значения, если исходить из ваших, то получается:
тип: шкафы
вид: открыт.
что третье?
l.`virtuemart_product_id` FROM `#__virtuemart_products_ru_ru` as l JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`) LEFT JOIN `#__virtuemart_product_categories` ON p.`virtuemart_product_id` = `#__virtuemart_product_categories`.`virtuemart_product_id` LEFT JOIN `#__virtuemart_categories_ru_ru` as c ON c.`virtuemart_category_id` = `#__virtuemart_product_categories`.`virtuemart_category_id` LEFT JOIN `#__virtuemart_product_customfields` as pf8 ON p.`virtuemart_product_id` = pf8.`virtuemart_product_id` LEFT JOIN `#__virtuemart_product_customfields` as pf9 ON p.`virtuemart_product_id` = pf9.`virtuemart_product_id` LEFT JOIN `#__virtuemart_product_customfields` as pf10 ON p.`virtuemart_product_id` = pf10.`virtuemart_product_id` LEFT JOIN `#__virtuemart_product_shoppergroups` ON p.`virtuemart_product_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_product_id` LEFT OUTER JOIN `#__virtuemart_shoppergroups` as s ON s.`virtuemart_shoppergroup_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_shoppergroup_id` WHERE ( ( (pf8.`virtuemart_custom_id`="8" and pf8.`custom_value` like "шкафы") AND (pf9.`virtuemart_custom_id`="9" and pf9.`custom_value` like "открыт.") AND (pf10.`virtuemart_custom_id`="10" and pf10.`custom_value` like "до 9 авт.") ) AND p.`published`="1" AND `#__virtuemart_product_categories`.`virtuemart_category_id` = 68 AND ( s.`virtuemart_shoppergroup_id`= "1" OR s.`virtuemart_shoppergroup_id` IS NULL ) ) group by p.`virtuemart_product_id` ORDER BY product_name
Навсякслуч ввел товар со значениями допполей
8888
9999
1010
Та же картина...
К сожалению, в данном случае, без доступа к сайту, сложновато протестировать результат, я лишь мог указать направление действий. А так, могу лишь предложить наши услуги.
прошу прощения, - выводится, - не заметил :roll:
Могу только прикрепить измененные файлы, чтобы посмотреть: http://2v3.su/src/blog/web/blog72.zip
Та же проблема, ничего не выводит.
Проблемы явно индивидуальные, поскольку, иначе бы вообще не у кого, включая меня, не работал код.
На расстояние могу только дать общие рекомендации:
Скачайте http://2v3.su/src/blog/web/blog72.zip посмотрите расположение кода
Проверьте, возвращает ли база разультат, вставить var_export($res); после $res=$db->loadObjectList();
Заменять ничего не нужно, поскольку могут быть не стыковки в версиях виртумарта, файлы в архиве для примера, расположения вставок. Строка 124 мной не правилась, это виртумарт, и скорее всего, ошибка из-за не стыковки в версиях. И если уж беретесь за код самостоятельно, то тут нужно домозговывать многие моменты, без этого никак в нашем деле, всех нюансов в статье не передашь. И не видя конкретной ситуации, я могу лишь что-то подсказать, направить, а экспериментировать уж вам дальше.
Fatal error: Call to undefined method VirtueMartModelProduct::getValidFilterOrdering() in Z:\home\localhost\www\pp\administrator\components\com_virtuemart\models\product.php on line 124
Как только возвращаю стандартный файл product.php все пашет, но не появляется выбор.
Вставляю var_export($res); как вы говорили приходит ответ array ( )array ( )
И есть такой вопрос, возможно ли сделать на отдельной странице сайта таким же макаром выборкой из БД с таблицы настраиваемых полей как бы расширенный поиск ?
Как уже и сказал, это не стыковка в версиях, поэтому нужно править файлы самостоятельно.
Цитата Сергей
Цитата Дарья
Если база возвращает пустой результат, то и фильтр тоже не появится.
ID полей точно парвильно вставлены: Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи.
вместо: 4 и 10 - должны быть ваши ID
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
$customfields=array(4=>0, 10=>0);
Цитата Сергей
Если кратко, то да. Если нужен такой же вывод, то еще нужно добавлять на страницу из файла \components\com_virtuemart\views\category\tmpl\default.php это:
$js = "
jQuery(document).ready(function () {
jQuery('.orderlistcontainer').hover(
function() { jQuery(this).find('.orderlist').stop().show()},
function() { jQuery(this).find('.orderlist').stop().hide()}
)
});";
$document = JFactory::getDocument();
$document->addScriptDeclaration($js);
Цитата Дарья
выглядит вот так http://mama-dama.com/magazin/1/odezhda-dlya-kormyashchikh-mam.html
По идеи должно же выдавать результат поиска из выборки таблицы доп. полей
Если используется form для отправки данных, то примерно вот так:
<form action="index.php" method="get">
<select name="customfields[9]">
<option value="1">Test</option>
</select>
<input type="hidden" name="limitstart" value="0" />
<input type="hidden" name="option" value="com_virtuemart" />
<input type="hidden" name="view" value="category" />
<input type="hidden" name="category" value="1" />
<input type="submit" value="Send" />
</form>
Формируется подобный запрос:
/index.php?option=com_virtuemart&view=category&category_id=1&limitstart=0&customfields[9]=1
Взять Ваш код:
Черный
Красный
Вы не могли бы подсказать, как к этой таблице прикрутить сам код на выборку из БД доп полей ?
Подскажите пожалуйста, что такое цифра 9 в customfields[9] если меняю на 4, поиск работает, на любые другие цифры не работает.
Признаться, тоже сложно объяснять все совсем досконально, поскольку мои ответы идут не в форме обучения, а при помощи подсказок, которые предполагают небольшие знания или же самостоятельные эксперименты с кодом, хотя бы методом тыка.
Цитата Сергей
Тут тоже указал, что этот код для примера. Разъяснение было в статье. Цифра: Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» и «Цвет», тип поля «Атрибут корзины».
заметил что не появляется блок activeOrder
activeOrder - должен быть.Нужна отладочная информация.
В коде, перед комментарием: //Создаем фильтр
добавить:
var_export($value);
var_export($a);
вывел такой код:
0array ( 0 => 'Любой', '1кг' => '1кг', '2кг' => '2кг', '3кг' => '3кг', )0array ( 0 => 'Любой', 'Высокий' => 'Высокий', 'Низкий' => 'Низкий', )0array ( 0 => 'Любой', 'проверка1' => 'проверка1', 'проверка2' => 'проверка2', )0array ( 'аминокислота' => 'аминокислота', 'протеин' => 'протеин', 0 => 'Любой', )
Можно тогда попробовать убрать из кода "$value && ":
if($value && isset($a[$value])){
$x=array( $value=>'' );
foreach($a as $k => $v) $x[$k]=$v;
$a=$x;
}else $value=0;
оно как то странно создает... у еня же 3 фильра было соданно и третий фильтр каряво отображался... я создал еще один он нормально отображается... потом решил перепроверить создал еще один он каряво опять начал отображаться.
Хоят удалил то тчо вы сказали.. кеш почистил и нормально заработало!! Спасибо большое
Можно ли каким нибудь способом присвоить id для в:
Тест
Тест2
Чтобы при наведении курсора на Тест2 могла поменяться картинка в отдельном div'е по обнаружению id у
Все получается с checkbox, ну ничего не выходит с
< se lec ted>
Тест
Тест2
< /se lec ted>
<div id="mydiv"></div>
<select id="mysel">
<option id="t1" value="t1">Test 1</option>
<option id="t2" value="t2">Test 2</option>
<option id="t3" value="t3">Test 3</option>
</select>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script type="text/javascript">
(function($){
$(document).ready(function(){
//Наведение мышкой на элемент select'а работает только FireFox
$('#mysel OPTION').mouseover(function(){
var id=$(this).attr('id');
var val=$(this).val();
$('#mydiv').html('MouseOver: '+id+' '+val);
});
//Для других браузеров срабатывает только в случаи выбора элемента
$('#mysel').change(function(){
var id=$(this)[0].options[$(this)[0].selectedIndex].id;
var val=$(this)[0].options[$(this)[0].selectedIndex].value;
$('#mydiv').html('Change: '+id+' '+val);
});
});
})(jQuery);
</script>
Подскажите пожалуйста, сделал 3 селекта: 1. Цвет 2.Размер 3.Категория.
Поиск отлично работает по цвету и категории, а размер просто игнорится, даже если просто выбрать любой размер без цвета и категории, все равно игнорится. Подскажите, как это исправить ?
Недостаточно информации для ответа. Нужно открыть файл \administrator\components\com_virtuemart\models\product.php и перед строкой return $product_ids добавить echo $whereString; потом выбрать в фильтре размер, и прислать сюда отладочную информацию.
WHERE ( ( (pf.`virtuemart_custom_id`="18" and pf.`custom_value` like "%%") OR (pf.`virtuemart_custom_id`="22" and pf.`custom_value` like "%555%") ) AND p.`published`="1" AND `pc`.`virtuemart_category_id` > 0 AND ( s.`virtuemart_shoppergroup_id`= "1" OR s.`virtuemart_shoppergroup_id` IS NULL ) )
Поиск почему-то идет по пустому параметру pf.`custom_value` like "%%"
Нужна еще отладочная информация, вставить var_export($res); после $res=$db->loadObjectList(); в \components\com_virtuemart\views\category\tmpl\default.php
Нет нет, pf.`custom_value` like "%%" - это цвет я его не выбирал, а вот и сам размер pf.`custom_value` like "%555%" ну по нему поиск не осуществляется
При выбранном красном цвете выдает так же и черный цвет товара у которого есть в доп полях размер.
Вообще странно, что пустое значение прошло (pf.`custom_value` like "%%"
), его не должно быть в запросе, поскольку эта строка if($searchcustom=trim($searchcustom)){ должна удалять пустые значения. Если в поиске фигурирую одни цифры, то предыдущую строку можно заменить на эту: if($searchcustom=intval($searchcustom)){
И почему в запросе стоит OR, тут должен быть AND
( ( (pf.`virtuemart_custom_id`="18" and pf.`custom_value` like "%%") OR (pf.`virtuemart_custom_id`="22" and pf.`custom_value` like "%555%") )
вот строка в коде
if(count($custom_search)) $where[] = " ( ".implode(' AND ', $custom_search )." ) ";
Еще раз для теста, перед строкой return $product_ids (\administrator\components\com_virtuemart\models\product.php ) добавить echo $select . $joinedTables . $whereString . $groupBy . $orderBy; Будет выдан полный запрос в базу, вот с ним можно поэкспериментировать в phpmyadmin. Например, будут ли по данному условию выдаваться записи: WHERE (pf.`virtuemart_custom_id`="22" and pf.`custom_value` like "%555%" ) AND p.`published`="1" AND `pc`.`virtuemart_category_id` > 0 AND ( s.`virtuemart_shoppergroup_id`= "1" OR s.`virtuemart_shoppergroup_id` IS NULL )
WHERE ( ( (pf.`virtuemart_custom_id`="18" and pf.`custom_value` like "%red%") OR (pf.`virtuemart_custom_id`="22" and pf.`custom_value` like "%555%") ) AND p.`published`="1" AND `pc`.`virtuemart_category_id` > 0 AND ( s.`virtuemart_shoppergroup_id`= "1" OR s.`virtuemart_shoppergroup_id` IS NULL ) ) l.`virtuemart_product_id` FROM `#__virtuemart_products_ru_ru` as l JOIN `#__virtuemart_products` AS p using (`virtuemart_product_id`) LEFT JOIN `#__virtuemart_product_categories` as pc ON p.`virtuemart_product_id` = `pc`.`virtuemart_product_id` LEFT JOIN `#__virtuemart_categories_ru_ru` as c ON c.`virtuemart_category_id` = `pc`.`virtuemart_category_id` LEFT JOIN `#__virtuemart_product_customfields` as pf ON p.`virtuemart_product_id` = pf.`virtuemart_product_id` LEFT JOIN `#__virtuemart_product_shoppergroups` ON p.`virtuemart_product_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_product_id` LEFT OUTER JOIN `#__virtuemart_shoppergroups` as s ON s.`virtuemart_shoppergroup_id` = `#__virtuemart_product_shoppergroups`.`virtuemart_shoppergroup_id` WHERE ( ( (pf.`virtuemart_custom_id`="18" and pf.`custom_value` like "%red%") OR (pf.`virtuemart_custom_id`="22" and pf.`custom_value` like "%555%") ) AND p.`published`="1" AND `pc`.`virtuemart_category_id` > 0 AND ( s.`virtuemart_shoppergroup_id`= "1" OR s.`virtuemart_shoppergroup_id` IS NULL ) ) group by p.`virtuemart_product_id` ORDER BY product_name
С этим запросом нужно идти в phpmyadmin.
И еще раз, поиск по нескольким полям описан тут http://2v3.su/blog/web/72.html, а судя по запросу, код взяли отсюда http://2v3.su/blog/web/56.html. Т.е. нужно все сделать так, как описано в этой статье.
Подскажите, как правильно создать до поля для такого поиска, каждому параметру отдельное доп поле на атрибут корзины или же одно доп поле ну с разными значениями ?
Что значит не работает, вообще не выдает в фильтре цвета или же товары не находит, если выбрать только цвет.
Цитата Сергей
Нужно сначала создать атрибут корзины в настраиваемых полях, а потом посмотреть ID:
Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» (ID 4) и «Цвет» (ID 10), тип поля «Атрибут корзины».
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет', 11=>'Другой параметр'); //и т.д.
$customfields=array(4=>0, 10=>0, 11=>0); //и т.д.
4, 10 и 11 - из этого примера, нужно заменить на ID из виртумарта.
А можно с помощью данного кода вывести сортировку по производителям?
Спасибо
Сортировка по производителю, это стандартный функционал виртумарта. Виртумарт - Настройки - вкладка Настройки заказ - поставить галочку на Производитель.
я имела в виду сортировку товара по наименованию производителя, точно так же как в примере с размером товара, только при клике разворачивался список производителей
Дико извиняюсь, мне попался шаблон джумлы с виртумартом, в котором не было этой строки
почему-то О_о, в дефолтном шаблоне она присутствует, еще раз извиняюсь за беспокойство
Такая проблема - есть дефолтный фильтр по производителям и есть новосозданный фильтр "Год выпуска". Года выпуска указаны только по ОДНОМУ производителю, как сделать, чтобы при выборе в фильтре других производителей, фильтр "Год выпуска" не отображал список годов или вообще не отображался как таковой? За ранее спасибо
например, год есть только у производителя с ID 1, то:
$man_id=JRequest::getvar('manufacturer_id', null);
if($man_id==1){
тут код "Год выпуска"
}
А можно поподробней про "тут код года выпуска"? пожалуйста! не въеду, что конкретно там прописывается
Как я понял, был создан новый фильтр "Год выпуска" на основе статьи, внесены правки в файл \components\com_virtuemart\views\category\tmpl\default.php - этот код из статьи нужно поместить в условие, тем самым фильтр будет появляться только тогда, когда выбран нужный производитель:
$man_id=JRequest::getvar('manufacturer_id', null);
if($man_id==1){
тут весь код "Год выпуска", в статье это был Размер и Цвет
начало отсюда
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
...........
$result.=''; } и досюда
}
все дошло, спасибо большое, сейчас буду тестить
Попробуйте прислать отладочную информацию.
после $db=JFactory::getDbo(); вставьте var_export($_REQUEST);
и после $res=$db->loadObjectList(); это var_export($res);
http://xn--80aeybodcb.net/index.php?option=com_virtuemart&view=category&virtuemart_category_id=2&Itemid=446
заменить $a=array(0=>'Любой'); на $a=array();
после ksort($a); вставить $a=array_merge(array(0=>'Любой'), $a);
Пример кода можно посмотреть тут: http://2v3.su/src/blog/web/blog72.zip
Цитата Отдел разработки сайтов
Не помогло
На сколько я вижу, теперь Механизмы и Цвет отображаются верно. А то что фильтр исчезает когда в категории нет товаров, то все модификации можно посмотреть тут http://2v3.su/src/blog/web/blog72.zip \components\com_virtuemart\views\category\tmpl\default.php обратить внимание на это:
// Show child categories
if (true /*!empty($this->products)*/) {
Вопрос в следующем:
1. Есть 3 параметра поиска: Цвет, Размер и Категория. Если по одной галочке ставить на каждый параметр, поиск работает превосходно, но как только поставить 2 галочки к примеру на параметр "Цвет" поиск осуществляется по последней галочке, игнорируя первую галочку. Так же и с остальными параметрами.
То есть если необходимо найти "Красный" и "Черный" цвета в категории "Авто" поиск осуществится по параметру "Черный" в категории "Авто". Если даже не выбирать категорию, а выбрать лишь 2 цвета все равно поиск пойдет по последнему параметру.
Можно ли исправить это ?
В данном фильтре такой функционал и не предусматривался, написать, конечно, могу, но это уже платно, поскольку отнимает время. Как компромисс, оставляйте как есть фильтр, и такого функционала вполне достаточно для начала, если вы собственник сайта, если фрилансер, то самостоятельное решение задачи оправдается в дальнейшем.
$('#mysel').change(function(){
var id=$(this)[0].options[$(this)[0].selectedIndex].id;
var val=$(this)[0].options[$(this)[0].selectedIndex].value;
$('#mydiv').html('Change: '+id+' '+val);
});
Я почти не понимаю этих языков, помогите плиз. ('Change: '+id+' '+val); тут выводится текст, а как вместо этого картинку вывести ?
Предположим, что val содержит название файла, тогда
$('#mydiv').html('<img border=0 src="/images/'+val+'.jpg" />');
или
var file;
if(id==1) file='1.jpg';
else if(id==2) file='2.jpg';
$('#mydiv').html('<img border=0 src="/images/'+file+'" />');
Появился такой вопрос: Если в поиске фигурирует категория и под категория , каким способом можно указать в value id категории и под категорий, чтобы поиск работал на все под категории.
Это вопрос относится к виртумарту? Уточните?
Авто
Двухкамерный
Но так же есть под категория с ID 2 и 3 у категории "авто" Если указывать id 1, то поиск не будет искать в под категориях лишь только в id1.
Так же появилась проблемка. Если id вообще не существует, то выдается надпись Notice: Undefined variable: custom_search in /var/www/***/data/***/***/administrator/components/com_virtuemart/models/product.php on line 280
в этой самой строке находится Ваш код, а именно if(count($custom_search)) $where[] = " ( ".implode(' AND ', $custom_search )." ) ";
else{
$joinCustom=false;
$this->searchcustoms=false;
}
Вы не могли бы помочь в этом вопросе?) я знаю, я сильно Вас утомил, но кроме Вас никто не поможет.
\administrator\components\com_virtuemart\models\product.php - перед или после $joinCustom = true; (это там же где ошибка) вставьте $custom_search=array();
Цитата Сергей
В виртумарте, при добавлении товара можно указывать несколько категорий, включая все вложенные, или найти строку в файле \administrator\components\com_virtuemart\models\product.php
$where[] = ' `#__virtuemart_product_categories`.`virtuemart_category_id` = '.$virtuemart_category_id;
и заменить ее на этот код (не тестировал, но должен работать):
$cat=$tmp=array();
$this->_db->setQuery('SELECT * FROM `#__virtuemart_category_categories` ORDER BY category_parent_id');
$a=$this->_db->loadAssocList();
if(is_array($a)){
foreach($a as $v){
if(!empty($v['category_parent_id'])){
$x=$v['category_parent_id'];
$cat[$x][]=$v['category_child_id'];
$tmp[ $v['category_child_id'] ]=$x;
while(isset($tmp[$x]) && $tmp[$x]!=$v['category_child_id']){
$cat[$tmp[$x]]=array_merge($cat[$tmp[$x]], $cat[ $v['category_parent_id'] ]);
$x=$tmp[$x];
}
}
}
}
if(isset($cat[$virtuemart_category_id]))
$where[] = ' `#__virtuemart_product_categories`.`virtuemart_category_id` IN ('.implode(',', $cat[$virtuemart_category_id]).','.$virtuemart_category_id.') ';
Else $where[] = ' `#__virtuemart_product_categories`.`virtuemart_category_id` = '.$virtuemart_category_id;
Цитата Сергей
Почему никто, поможет любой, кому нужны деньги и он знаком с php. А забесплатно, нужно надеяться только на свои мозги. Первая задача может даваться трудно, но с каждой последующей будет легче.
Ответ по поиску в подкатегориях помог? На случай если у кого будет подобная проблема.
Есть только $joinCustom = false;
Но проблема по прежнему существует, ничего не меняется.
Закралась у меня мысль, что поиск так же затрагивает селект который не относится к поиску и пытается искать по value тем самым вызываю эту ошибку. Т.к. в этом селекте стоят value=1, 2, 3 а в customfields[99] таких просто нет.
Все получилось, ошибка пропала за что вам БОЛЬШОЕ человеческое СПАСИБО.
А на счет помощи в крайних случаях по php и возможность отблагодарить Вас за работу в виде денежных взносов, пожалуйста, скиньте мне на Email свой email адресок для контакта.
нужно посмотреть начало этой статьи, там есть $joinCustom = true
Цитата Сергей
Признаться не могу уловить, что вы там нагромоздили.
1) В select, если там находятся категории, атрибуту name нужно присвоить имя virtuemart_category_id
2) Найти в \administrator\components\com_virtuemart\models\product.php строку if ($virtuemart_category_id>0){ заменить ее:
if(!$virtuemart_category_id){
$x=JRequest::getInt('virtuemart_category_id',0);
if($x) $virtuemart_category_id=str_replace(' ', '', $x);
}
if($virtuemart_category_id) $virtuemart_category_id=explode(',', $virtuemart_category_id);
if ($virtuemart_category_id){
3) Найти строку $where[] = ' `#__virtuemart_product_categories`.`virtuemart_category_id` = '.$virtuemart_category_id; заменить:
$cat=$tmp=array();
$this->_db->setQuery('SELECT * FROM `#__virtuemart_category_categories` ORDER BY category_parent_id');
$a=$this->_db->loadAssocList();
if(is_array($a)){
foreach($a as $v){
if(!empty($v['category_parent_id'])){
$x=$v['category_parent_id'];
$cat[$x][]=$v['category_child_id'];
$tmp[ $v['category_child_id'] ]=$x;
while(isset($tmp[$x]) && $tmp[$x]!=$v['category_child_id']){
$cat[$tmp[$x]]=array_merge($cat[$tmp[$x]], $cat[ $v['category_parent_id'] ]);
$x=$tmp[$x];
}
}
}
}
$s='';
foreach($virtuemart_category_id as $v){
$v=intval($v);
$s.=($s) ? ','.$v : $v;
if(isset($cat[$v])) $s.=','.implode(',', $cat[$v]);
}
$where[] = ' `#__virtuemart_product_categories`.`virtuemart_category_id` IN ('.$s.') ';
Пока писал, вы уже ответили, контакты в разделе "Контакты"
administratorcomponentscom_virtuemartmodelsproduct.php
сайт http://elena-rukodelie.com.ua/
Скорее всего, где-то допустили ошибку, так угадать сложно. И на вашем сайте я вообще не увидел фильтра по товарам. Если на хостинге отключен вывод php-ошибок, то проверьте log-файл в корне сайта.
http://mama-dama.com/magazin/10/odezhda-dlya-kormyashchikh-mam/futbolki-dlya-kormleniya.html
Сортировать по Производитель:
хотелось бы сделать По составу за место размера
вот страница где он работает
http://elena-rukodelie.com.ua/magazin/pryazha/pryazha-100-sherst/cashmira/orderDesc/by,product_price.html
а лучше сделать так
Опять же по внешнему виду страницы трудно угадать, почему не выводится фильтр. Единственное, еще раз все внимательно проверьте, или я могу сделать это за вас, но уже платно.
elena-rukodelie.com.ua/magazin/pryazha/pryazha-100-sherst/cashmira/orderDesc/by,product_price.html
http://www.sotvorchestvo.biz/product/cashmira-fine-214
левый блок сайта
по всей видимости, вам сложно ориентироваться в коде, я вижу, что сайт делала веб-студия, почему бы вам не обратиться к ним по настройке. Вот модифицированные файлы http://2v3.su/src/blog/web/blog72.zip только для того чтобы посмотреть, поверх копировать не нужно, поскольку могут быть нестыковки в версиях Виртумарта.
Цитата Юрий
тут не Виртумарт, поэтому разработка с нуля будет стоить дороже, нежели настройка уже готового. Сделать, конечно, сделаем, но в Украине, то же самое будет несколько дешевле, чем в Сибири, просто сравните наши цены на создание сайтов.
По составу а как заставить чтоб фильтр работал не по размеру а по составу допустим
Вискоза и шелк
Из искусств. волокон
Лён и бамбук
Полушерстяная пряжа
С металликом
С мохером или ангорой
Стрейчевая пряжа
Хлопок
Шерстяная пряжа
Точно также как и размер, допустим под ID 10 (Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку) указан Материал, ну и соответственно, в дополнительных полях к товару должен быть указан конкретный Материал (шелк, хлопок и т.д.).
$results=array(4=>'Выбрать размер', 10=>'Выбрать материал');
$customfields=array(4=>0, 10=>0);
500 руб., но у вас уже получается, попробуйте сделать так: заменить $a=array(0=>'Любой'); на $a=array();
после ksort($a); вставить $a=array_merge(array(0=>'Любой'), $a);
Еще внимательней посмотрите код: http://2v3.su/src/blog/web/blog72.zip
Да, на любой джумле, на которой установлен виртумарт 2.
спасибо, да у меня вроде работало, а сейчас перестало, не выводит товаров. Вроде уже все откатила назад, а всё равно товаров 0. Буду искать что ещё поменяла.
Т.е. работал этот код, или работало все до установки кода? Если с кодом, то вспомните, что изменили? Если же без кода, то вернуть оригинальные файлы всегда можно.
спасибо огромное за код! (и за работу в комментариях! благодаря им почти настроила то, что нужно)
остались вопросы, на которые не хватает уже сил... -)
подскажите, пожалуйста
1. почему не появляется слово Любой в рамочке как Производитель
http://gyazo.com/2e789a3277701bc59bb6866777999878
2. зачем исчезает фильтр, если по данному параметру нет товаров? как сделать так, чтоб не исчезал?
3. и как вставить этот фильтр в шаблон categories/ (мне нужно, чтобы в одной из категорий магазина была фильтрация по настраиваемому полю).
мой код
СПАСИБО!
Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» и «Цвет», тип поля «Атрибут корзины».
*/
$results=array(5=>'Применение');
$customfields=array(5=>0);
$var=JRequest::getvar('customfields', null);
foreach($customfields as $custom_id => &$value){
if($var && !empty($var[$custom_id]))
$value='&customfields['.$custom_id.']='.$var[ $custom_id];
else unset($customfields[$custom_id]);
}
$db=JFactory::getDbo();
foreach($results as $custom_id => &$result){
$ff=$customfields;
unset($ff[$custom_id]);
$ff=implode('', $ff);
$title=$result;
$result='';
$db->setQuery('SELECT DISTINCT(custom_value) AS value FROM #__virtuemart_product_customfields WHERE virtuemart_custom_id='.$custom_id);
$res=$db->loadObjectList();
if(!is_array($res) || !count($res)) continue;
//Массив значений
// $a=array(0=>'Любой'); - так не работало
$a=array();
//Заносим данные из таблицы в массив значений
foreach($res as $v) $a[$v->value]=$v->value;
//Сортируем
ksort($a);
$a=array_merge(array(null=>'Любой'), $a);
//Получаем значение выбранного фильтра из запроса пользователя
$value=JRequest::getvar('customfields', null);
$value=(isset($value[$custom_id])) ? $value[$custom_id] : 0;
//Это значение помещаем в начало массива
if($value && isset($a[$value])){
$x=array( $value=>'' );
foreach($a as $k => $v) $x[$k]=$v;
$a=$x;
}else $value=0;
//Создаем фильтр
$result=''.$title.'';
$flag=false;
foreach($a as $k => $v){
if((string)$k==(string)$value) $x='';
else{
if(!$flag){
$x='';
$flag=true;
}else $x='';
}
$result.=$x.''.$v.'';
}
$result.='';
}
?>
заменила все же
//Сортируем
ksort($a);
$a=array_merge(array(null=>'Любой'), $a); на
//Сортируем
ksort($a);
$a=array_merge(array(0=>'Выбрать'), $a
и все ОК и рамочка и слово Выбрать.
остались два вопроса -)
2) в \components\com_virtuemart\views\category\tmpl\default.php
Замените "if (!empty($this->products)) {" на " if (true) {"
Вот тут пример можно посмотреть: http://2v3.su/src/blog/web/blog72.zip
3) Собственно, код из статьи для \components\com_virtuemart\views\category\tmpl\default.php можно вставить куда угодно (например, в php-модуль), заменив это "$this->category->virtuemart_category_id" на "intval($_REQUEST ['virtuemart_category_id'])". И это удалить: "echo $this->orderByList['orderby'];", " echo $this->orderByList['manufacturer'];".
Также это добавить перед кодом:
$js = "jQuery(document).ready(function () {
jQuery('.orderlistcontainer').hover(
function() { jQuery(this).find('.orderlist').stop().show()},
function() { jQuery(this).find('.orderlist').stop().hide()}
)
});";
$document = JFactory::getDocument();
$document->addScriptDeclaration($js);
но с п.3 не все понятно.
дело в том, если я подключаю default.php с этим кодом к общей категории, в которой содержатся подкатегории с товарами, то поскольку в данной общей категории товаров-то нет (все по подкатегориям), то соответственно и фильтр ничего не показывает и не ищет по подкатегориям.
а мне-то как раз надо бы, чтоб фильтрация была возможна сразу из общей категории.
просто общая категория делится на подкатегории, но каждый товар еще кроме принадлежности к категории имеет и дополнительное назначение (настраиваемое поле) и вот по нему-то хорошо бы получать список, сортируя из общей категории.
а так, этот код просто ничего не показывает (т.к. товара в общей категории нет).
вообще это с некоторой стороны неудобство ВМ, когда он не показывает сколько всего товаров в общей категории, а показывает товары, только в подкатегориях (дерево прайслиста-то может быть очень многоуровневым, и иногда в админке хочется открыть все товары именно главных категорий одним списком, а не залезать внутрь подкатегорий скажем 4 уровня вложенности).
спасибо!
но вот со вставкой кода... -)
могли бы полный код привести, чтоб уж точно вставить и заработало (а то у меня parse error, а в программировании я совсем не очень).
для подкатегорий это актуально.
Например, сортировка по производителю представляет собой список только тех производителей, товары которых представлены именно в данной подкатегории.
А вот сортировка по настраиваемому полю представляет собой список вообще всех значений данного поля для всех товаров.
может быть как-то можно добавить условие, чтобы не весь список выпадал, а только те значения, которые есть у товаров в данной подкатегории.
Для этого в вирутамарте можно указывать несколько категорий для товара в админке.
Цитата xaoc
Дело в том, что мои ответы больше носят справочный характер для тех, кто хоть как-то разбирается, чтобы они могли реализовать задуманное самостоятельно. Я не даю полностью готовых решений на каждый вопрос, поскольку для этого нужно затратить кучу времени, чтобы даже написать развернутый ответ. В связи с этим у меня вопрос, в чем проблема реализовать ваши задумки платно? Неужто ваша коммерческая тематика совсем убыточная.
тогда товары будут отражаться в этой главной категории, а это совсем лишнее.
Цитата Отдел разработки сайтов
реализовать платно не сильно большая проблема. просто это задумки сиюминутного возникновения так сказать, и видите, часть я смогла решить самостоятельно при помощи данной статьи и комментариев к ней плюс Ваша подсказка.
если ответ на вопрос о том, как реализовать сортировку по товарам из подкатегорий в главной категории, сложен, не укладывается в рамки справочного, и следовательно платный, то тут проблема у меня именно в том, чтобы найти адекватного платного исполнителя.
Минимальная сумма у нас идет от 500 руб. Также, есть еще один вариант оплаты, в виде перехода на наш хостинг, в сумму которого включена подобная помощь.
Цитата xaoc
Цитата xaoc
Тут сложный ответ, в котором неподготовленному человеку трудно разобраться, мне фактически нужно вас учить программированию.
1) После $db=JFactory::getDbo(); вставляем это, где берем все подкатегории, выбранной категории, если таковы имеются, и помещаем их в переменную $cat_id.
$cat=$tmp=array();
$db->setQuery('SELECT * FROM `#__virtuemart_category_categories` ORDER BY category_parent_id');
$a=$db->loadAssocList();
if(is_array($a)){
foreach($a as $v){
if(!empty($v['category_parent_id'])){
$x=$v['category_parent_id'];
$cat[$x][]=$v['category_child_id'];
$tmp[ $v['category_child_id'] ]=$x;
while(isset($tmp[$x]) && $tmp[$x]!=$v['category_child_id']){
$cat[$tmp[$x]]=array_merge($cat[$tmp[$x]], $cat[ $v['category_parent_id'] ]);
$x=$tmp[$x];
}
}
}
}
$cat_id=intval($_REQUEST['virtuemart_category_id']);
if(isset($cat[$cat_id])) $cat_id=implode(',', $cat[$cat_id])
2) Потом нужно заменить запрос $db->setQuery('SELECT DISTINCT(custom_value) AS value FROM #__virtuemart_product_customfields WHERE virtuemart_custom_id='.$custom_id); из статьи на этот:
$db->setQuery(
'SELECT DISTINCT (cf.custom_value) AS value
FROM #__virtuemart_product_customfields AS cf
JOIN #__virtuemart_product_categories AS c
ON cf.virtuemart_product_id = c.virtuemart_product_id
JOIN #__virtuemart_products AS p
ON p.virtuemart_product_id=cf.virtuemart_product_id
WHERE c.virtuemart_category_id IN ('.$cat_id.')
AND cf.virtuemart_custom_id ='.$custom_id.'
AND p.published=1 '
);
3) Дальше делаем это http://2v3.su/blog/web/72.html#comment-271
4) Это делаем в случае вставки в php-модуль или другой файл. Заменить это "$this->category->virtuemart_category_id" на это "intval($_REQUEST ['virtuemart_category_id'])", и удалить это: "echo $this->orderByList['orderby'];", " echo $this->orderByList['manufacturer'];".
И также добавить код, например, перед $db=JFactory::getDbo(); или выше.
$js = "jQuery(document).ready(function () {
jQuery('.orderlistcontainer').hover(
function() { jQuery(this).find('.orderlist').stop().show()},
function() { jQuery(this).find('.orderlist').stop().hide()}
)
});";
$document = JFactory::getDocument();
$document->addScriptDeclaration($js);
Ктонибудь пробовал тестить на Joomla! 2.5.14 и VM 2.0.24? Оч полезная статья, но на указаных версиях не получается настроить, отпишитесь если у кого получилось или кто может помочь.
На VM 2.0.24 не тестировал, но должно работать. Внимательнее вносите корректировки. Для просмотра вставок, вот пример http://2v3.su/src/blog/web/blog72.zip (поверх копировать не нужно).
Благодарю за ссылку, попробую разобраться.
Интересует такой вопрос, если все же не получится есть ли возможность обратиться к Вам на платной основе?
Конечно, можно.
Добрый день! Большое спасибо за решение! одно на миллион!
Вопрос уже поднимался, но я не поняла, есть ли такая возможность. Можно ли сделать так, чтобы поля были взаимосвязаны между собой? Каждый фильтр показывал только значения, которые соответствуют предыдущему выбранному фильтру. Спасибо большое! :sigh:
Вот, нечто подобное делали для этого сайта.
Пример в архиве, только поверх заменять файлы не нужно, могут быть нестыковки в версиях виртумарта.
Огромное спасибо! Буду пробовать!
Вот ссылка на сайт http://moda-skonti.ru/index.php/katalog
Ошибку помогли исправить. Обращаем внимание, что для новых версий виртумарта, в скрипте \administrator\components\com_virtuemart\models\product.php вместо "$joinedTables.=" пишем "$joinedTables[]="
А что еще изменилось у меня перестал работать этот фильтр после обновления до 2.6.6. Когда выбираешь одно значение из фильтра сразу пишет " Товар не найден" Куда копать ума не приложу. И пример не работает который в архиве blog72.zip !
Вопрос решился почему то после обновление стояла галочка "Отключить SEO" убрал и все заработало!