Поиск товаров в Virtuemart 2 по нескольким фильтрам

Поиск товаров в 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>&nbsp;<?php echo $results[4]; ?> </td>
<td>&nbsp;<?php echo $results[10]; ?> </td>
</tr></table></div>



Комментарии

#1 Оле 2012-09-07 13:59:56
Спасибо. А как бы сделать, чтобы список значений для каждого фильтра (помимо ALL) был бы результатом предыдущей фильтрации? Сейчас выводятся все возможные значения, а новый выбор сбрасывает предыдущую установку предыдущего фильтра.
#2 Оле 2012-09-07 16:32:21
Ага. Это потому что отчего-то в customfield вползает "_" - custom_field...
#3 Отдел разработки сайтов 2012-09-23 09:25:30
Цитата Оле
Ага. Это потому что отчего-то в customfield вползает "_" - custom_field...

Да, к сожалению, иногда при сохранении статьи бывают вот такие искажения, исправили в коде:
$value='&customfields['.$custom_id.']='.$var[ $custom_id];
#4 Денис 2012-10-01 23:37:19
Здравствуйте появлялась ошибка когда фильтр стоял на параметре "Любое". Привел его к значению null .
if($k==$value) тип (string) помогал не при всех значениях атрибута.

И сразу вопрос. Как сделать возврат строки вроде "Извините ничего не найдено и кнопка сброса фильтров" .

За хак большая благодарность очень полезный.
#5 Отдел разработки сайтов 2012-10-02 00:03:36
Цитата Денис
Как сделать возврат строки вроде "Извините ничего не найдено и кнопка сброса фильтров" .


файл \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>'; ?>
#6 Денис 2012-10-02 02:32:05
Ага спасибо больше за подсказку, не заметил что там перед выводом есть условия
#7 Nik 2012-10-28 20:19:49
Не подскажите, как сделать, что бы:

если есть значение у товара (размер: 1) - выводится фильтр, если нету - не выводится. Чтоб у разных категорий разные фильтры стояли.
#8 Отдел разработки сайтов 2012-10-28 21:11:30
Цитата Nik
если есть значение у товара (размер: 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);
}
#9 Nik 2012-10-28 21:26:23
Цитата Отдел разработки сайтов
Цитата Nik
если есть значение у товара (размер: 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,
#10 Nik 2012-10-28 21:34:32
*
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();
#11 Отдел разработки сайтов 2012-10-28 21:40:08
Цитата Nik
вставил после:
$results=array(16=>'Выбрать размер', 17=>'Выбрать цвет');
$customfields=array(16=>0, 17=>0);
Результата 0,

я лишь указал простой способ фильтрации по категории, http://2v3.su/blog/web/56.html#comment-25
Про нулевой результат не понял.
#12 Nik 2012-10-28 22:27:56
Привел пример кода, но не получается.. Не выводит вообще ничего. Сервер на локалхосте.
#13 Отдел разработки сайтов 2012-10-29 04:41:46
Цитата Nik
Не выводит вообще ничего. Сервер на локалхосте.

Так сложно угадать ошибку, почему у вас ничего не выводится, поскольку пример рабочий. Единственное, может что-то было вставлено не так. Ну и подобная конструкция if(preg_match('#/odezhda#i', $_SERVER['REQUE ST_URI'])){ будет работать только при включенном ЧПУ и при данном названии категории (odezhda).
#14 Nik 2012-10-29 08:47:39
А можете скинуть весь код с такой вставкой? Возможно ивправду что-то не там вставил.
#15 Отдел разработки сайтов 2012-10-29 09:38:32
Цитата Nik
А можете скинуть весь код с такой вставкой? Возможно ивправду что-то не там вставил.

Отправил оригинал статьи и файлы.
#16 Александр 2012-11-17 20:27:26
Полезный хак, - автору респект.
Но вот если у товаров данной категории не назначены параметры в каком-нибудь из дополнительных полей, - как можно сделать, чтоб автоматом фильтр не выводился?
#17 Отдел разработки сайтов 2012-11-17 21:37:48
Цитата Александр
Но вот если у товаров данной категории не назначены параметры в каком-нибудь из дополнительных полей, - как можно сделать, чтоб автоматом фильтр не выводился?

Если я правильно понял, если запрос в базу возвращает пустой результат, то фильтр не должен выводиться. Сейчас так и есть. Уточните?
#18 Александр 2012-11-19 14:50:24
Цитата Отдел разработки сайтов
Цитата Александр
Но вот если у товаров данной категории не назначены параметры в каком-нибудь из дополнительных полей, - как можно сделать, чтоб автоматом фильтр не выводился?

Если я правильно понял, если запрос в базу возвращает пустой результат, то фильтр не должен выводиться. Сейчас так и есть. Уточните?

Если в поле custom_value таблицы #__virtuemart_product_customfields есть хоть одна запись, - она выводится независимо от того, принадлежит ли параметр товару из категории, в которой в данный момент находится пользователь или нет. А это не желательно.
Надо, чтоб выводился список параметров только если в данной категории есть такие товары. Другими словами, связать ID категории из строки запроса, таблицу #__virtuemart_product_categories и #__virtuemart_product_customfields. И делать проверку. У меня почему-то не получилось, - мало опыта в PHP.
#19 Отдел разработки сайтов 2012-11-19 23:45:56
Цитата Александр
Другими словами, связать ID категории из строки запроса, таблицу #__virtuemart_product_categories и #__virtuemart_product_customfields.


вот запрос:
$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);
#20 Александр 2012-11-20 08:47:29
Не знаю почему, - но этот запрос не работает у меня. Там, где присутствуют товары с параметрами var_dump($res) выводит NULL, а где их нету - не выводит ничего.
И в случае $_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. уведомления о новых комментариях не приходят на почту почему-то.
#21 Отдел разработки сайтов 2012-11-20 09:06:26
Цитата Александр
Не знаю почему, - но этот запрос не работает у меня.
P.S. уведомления о новых комментариях не приходят на почту почему-то.

в запросе я пропустил ON cf.virtuemart_product_id=c.virtuemart_product_id - и еще, компонент комментариев ставит кучу пробелов, удалите их. Запрос лучше тестируйте в phpmyadmin, если есть ошибка в синтаксисе, сразу увидите.

На счет уведомлений, проверьте спам, к нам приходят.
#22 Александр 2012-11-20 10:24:02
Цитата Отдел разработки сайтов
компонент комментариев ставит кучу пробелов

Эт я заметил...
#23 Александр 2012-11-20 12:22:26
У меня в итоге получилось вот такой код:
$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
);
#24 Отдел разработки сайтов 2012-11-20 12:31:05
Цитата Александр
У меня в итоге получилось вот такой код

Ну если все работает, то хорошо.
#25 Александр 2012-11-20 12:49:20
Цитата Отдел разработки сайтов

Ну если все работает, то хорошо.

Работает.
Ну и хотелось бы добавить для посетителей, что файл default.php желательно вынести в папку html/com_virtuemart/category/ шаблона сайта (дабы избежать сноса при обновлении). А вот с product.php как поступить в этом случае, - не знаю. Думаю, тут в плагин выносить надо и переопределять class VirtueMartModelProduct.
#26 eXereS 2012-11-20 16:17:12
Добрый день! Сделал все как выше описано, ошибок нет но и фильтра собственно нету тоже :( Где он должен появиться? на каком месте? надо что то включать?

Я сделал 2 настраиваемых поля Рост и Размер прописал их ID в код. Но ничего не изменилось.
Помогите пожалуйста с этим вопросом, может что я недоглядел.

Еще хотелось бы задать вопрос, я смотрю вы ковыряли category/default.php. Я мозг сломал но вывел в категории настраиваемые поля, но возникла проблема: значение он берет из бызы, а имя я вручную в диве воткнул. и получается что на всех товарах он дает имя рост и вес, даже там где не надо... Как задать условие, да и вообще как правильно вывести настраиваемые поля в категории, c названиями полей, что бы было условие что если не заполнены то и не показываются. и фильтрацию по ним. Вирту уже 5 лет а на самые важные моменты разработчики забили....

Я буду очень признателен Вам если вы поможете решить данную проблему, я имею ввиду про финансовое поощрение.
Заранее спасибо.
#27 Александр 2012-11-20 18:09:08
eXereS, лично у меня впечатление, что вы говорите о Вирте версии 1.1.х под Джумлу 1.5, раз речь идет о 5-тилетней давности. А здесь Вирт 2.0.х под Джумлу 2.5. Или я не прав?
#28 Отдел разработки сайтов 2012-11-20 19:12:34
Цитата eXereS
Сделал все как выше описано, ошибок нет но и фильтра собственно нету тоже

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

Цитата 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
Вирту уже 5 лет а на самые важные моменты разработчики забили....

Тут имелось в виду, что допиливать много чего приходится самостоятельно.
#29 ole 2012-11-21 13:13:14
Снова здравствуйте.
Подскажите, пожалуйста, где копать. При выборе одного фильтра, в другом выводятся все значения (а не только отфильтрованные). Все остальное работает. Например создаю товар со значениями customfields[8]=888 и customfields[9]=999. Выбираю во втором фильтре 999. В первом вижу не только 888, а все возможные значения. $value при выводе первого фильтра хранит значение &customfields[9]=999
Получается, sql-запрос как-то не очень работает? Тестирую на Денвере.
#30 ole 2012-11-21 16:41:10
ааааа... эээээ... тут это какбы и не предусмотрено. туплю.
#31 Отдел разработки сайтов 2012-11-21 20:23:19
Цитата ole
Например создаю товар со значениями customfields[8]=888 и customfields[9]=999. Выбираю во втором фильтре 999. В первом вижу не только 888, а все возможные значения.


если я правильно понял, то вот, не тестировал, но копать в эту сторону:


$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
);
#32 ole 2012-11-22 07:53:50
Ура! Работает. Спасибо!
#33 ole 2012-11-23 08:13:14
Теперь другая засада: "Третий лишний". Я добавил третий фильтр. По одному они работают отменно, при выборе двух любых фильтров (любые значения, кроме All) третий вообще пропадает.
#34 Отдел разработки сайтов 2012-11-23 09:05:05
Цитата ole
при выборе двух любых фильтров (любые значения, кроме All) третий вообще пропадает.

возможно, что просто нет элементов, удовлетворяющих сразу 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 вручную, какие элементы он будет выдавать.
#35 ole 2012-11-23 11:23:22
Элементы есть - в "нединамической", изначальной версии все работает,
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
#36 Отдел разработки сайтов 2012-11-23 13:42:39
Цитата ole
По одному они работают отменно, при выборе двух любых фильтров (любые значения, кроме All) третий вообще пропадает.

я к чему клонил-то, что есть ли такие элементы (товары) в базе, которые бы заранее удовлетворяли 3-м фильтрам, например, рубашка: цвет=1;размер=2;материал=3.

и вообще, странные слова в поиске: "шкафы" и "открыт." (еще и с точкой) - скиньте хоть один пример товара с заполненными доп. полями, из админки виртумарта, т.е. что вписано в значения, если исходить из ваших, то получается:
тип: шкафы
вид: открыт.
что третье?
#37 ole 2012-11-23 19:14:08
Третье ещё круче :) Вот, например, такой набор фильтров в изначальной версии выводит 5 товаров:
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

Та же картина...
#38 Отдел разработки сайтов 2012-11-23 19:44:54
Цитата ole
Третье ещё круче

К сожалению, в данном случае, без доступа к сайту, сложновато протестировать результат, я лишь мог указать направление действий. А так, могу лишь предложить наши услуги.
#39 Александр 2012-11-24 16:15:42
Не плохо было бы выбранные параметры товара в корзине вывести. А еще лучше и в информации о заказе...
#40 Александр 2012-11-24 16:33:00
Цитата Александр
Не плохо было бы выбранные параметры товара в корзине вывести. А еще лучше и в информации о заказе...

прошу прощения, - выводится, - не заметил :roll:
#41 Дарья 2012-11-30 08:04:14
Добрый день! У меня так и не получилось найти необходимые коды для замены в файлах product.php и default.php. :( Установлена joomla 2.5.7, virtuemart 2.0.14
#42 Отдел разработки сайтов 2012-11-30 17:05:08
Цитата Дарья
У меня так и не получилось найти необходимые коды для замены в файлах product.php и default.php. :( Установлена joomla 2.5.7, virtuemart 2.0.14

Могу только прикрепить измененные файлы, чтобы посмотреть: http://2v3.su/src/blog/web/blog72.zip
#43 Сергей 2012-12-05 12:47:53
Цитата Отдел разработки сайтов
Цитата Nik
Не выводит вообще ничего. Сервер на локалхосте.


Так сложно угадать ошибку, почему у вас ничего не выводится, поскольку пример рабочий. Единственное, может что-то было вставлено не так.


Та же проблема, ничего не выводит.
#44 Отдел разработки сайтов 2012-12-05 13:08:56
Цитата Сергей
Та же проблема, ничего не выводит.

Проблемы явно индивидуальные, поскольку, иначе бы вообще не у кого, включая меня, не работал код.
На расстояние могу только дать общие рекомендации:
Скачайте http://2v3.su/src/blog/web/blog72.zip посмотрите расположение кода
Проверьте, возвращает ли база разультат, вставить var_export($res); после $res=$db->loadObjectList();
#45 Сергей 2012-12-05 14:03:37
Как раз пользуюсь Вашим кодом. Если заменять оба файла, то идет ошибка в строке 124 файла product.php. Что то сделал появилось, ну очень криво и был результат с базы, поменял настраиваемые поля, и снова все исчезло.
#46 Отдел разработки сайтов 2012-12-05 14:42:30
Цитата Сергей
Если заменять оба файла, то идет ошибка в строке 124 файла product.php. Что то сделал появилось, ну очень криво и был результат с базы, поменял настраиваемые поля, и снова все исчезло.

Заменять ничего не нужно, поскольку могут быть не стыковки в версиях виртумарта, файлы в архиве для примера, расположения вставок. Строка 124 мной не правилась, это виртумарт, и скорее всего, ошибка из-за не стыковки в версиях. И если уж беретесь за код самостоятельно, то тут нужно домозговывать многие моменты, без этого никак в нашем деле, всех нюансов в статье не передашь. И не видя конкретной ситуации, я могу лишь что-то подсказать, направить, а экспериментировать уж вам дальше.
#47 Сергей 2012-12-05 14:56:31
Поставил новую jooml'у новый virtuemart 2.0.14 закидываю ваши файлы и вновь ошибка в строке 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 ( )

И есть такой вопрос, возможно ли сделать на отдельной странице сайта таким же макаром выборкой из БД с таблицы настраиваемых полей как бы расширенный поиск ?
#48 Дарья 2012-12-05 15:13:04
Добрый день, спасибо за высланные файл, я разобралось как в своих файлах все сделать, но фильтр все равно не отображается! Как он вообще должен выглядеть, или может его как нибудь нужно через joomly запустить?
#49 Отдел разработки сайтов 2012-12-05 15:33:42
Цитата Сергей
Поставил новую jooml'у новый virtuemart 2.0.14 закидываю ваши файлы и вновь ошибка в строке 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

Как уже и сказал, это не стыковка в версиях, поэтому нужно править файлы самостоятельно.

Цитата Сергей
Вставляю 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
#50 Сергей 2012-12-10 11:39:07
Добрый день, не могли бы Вы подсказать по предыдущему вопросу, так ли я делаю. Сделал к примеру таблицу поиска отдельную, поставил sabmit на отправку в components\com_virtuemart\views\category\tmpl\default.php

По идеи должно же выдавать результат поиска из выборки таблицы доп. полей
#51 Отдел разработки сайтов 2012-12-10 13:33:24
Цитата Сергей
поставил sabmit на отправку в components\com_virtuemart\views\category\tmpl\default.php

Если используется 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
#52 Сергей 2012-12-10 14:31:47
Вы меня простите, очень сложно когда не знаешь php.
Взять Ваш код:


Черный
Красный








Вы не могли бы подсказать, как к этой таблице прикрутить сам код на выборку из БД доп полей ?
#53 Сергей 2012-12-10 15:06:30
Цитата Отдел разработки сайтов
Цитата Сергей
поставил sabmit на отправку в components\com_virtuemart\views\category\tmpl\default.php

Если используется 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, поиск работает, на любые другие цифры не работает.
#54 Отдел разработки сайтов 2012-12-10 19:25:41
Цитата Сергей
Вы меня простите, очень сложно когда не знаешь php.

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

Цитата Сергей
Подскажите пожалуйста, что такое цифра 9 в customfields[9] если меняю на 4, поиск работает, на любые другие цифры не работает.

Тут тоже указал, что этот код для примера. Разъяснение было в статье. Цифра: Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» и «Цвет», тип поля «Атрибут корзины».
#55 Александр 2012-12-11 12:07:43
Все получилось спасибо... но когда добавил третье поле то сам зоголовок выводится а самого выпадабщего списка нет.. нок огда я наважу на зоголовок то появляется выпадающий список и если я выбираю какой то из него критерий то при фильтрации появлятеся список
#56 Александр 2012-12-11 12:12:17
Цитата Александр
Все получилось спасибо... но когда добавил третье поле то сам зоголовок выводится а самого выпадабщего списка нет.. нок огда я наважу на зоголовок то появляется выпадающий список и если я выбираю какой то из него критерий то при фильтрации появлятеся список

заметил что не появляется блок activeOrder
#57 Отдел разработки сайтов 2012-12-12 08:07:03
Цитата Александр
заметил что не появляется блок activeOrder

activeOrder - должен быть.Нужна отладочная информация.
В коде, перед комментарием: //Создаем фильтр
добавить:
var_export($value);
var_export($a);
#58 Александр 2012-12-12 11:41:33
Цитата Отдел разработки сайтов
Цитата Александр
заметил что не появляется блок 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 => 'Любой', )
#59 Отдел разработки сайтов 2012-12-12 12:55:59
Цитата Александр
вывел такой код

Можно тогда попробовать убрать из кода "$value && ":
if($value && isset($a[$value])){
$x=array( $value=>'' );
foreach($a as $k => $v) $x[$k]=$v;
$a=$x;
}else $value=0;
#60 Александр 2012-12-13 14:30:59
Цитата Отдел разработки сайтов
Цитата Александр
вывел такой код

Можно тогда попробовать убрать из кода "$value && ":
if($value && isset($a[$value])){
$x=array( $value=>'' );
foreach($a as $k => $v) $x[$k]=$v;
$a=$x;
}else $value=0;

оно как то странно создает... у еня же 3 фильра было соданно и третий фильтр каряво отображался... я создал еще один он нормально отображается... потом решил перепроверить создал еще один он каряво опять начал отображаться.
#61 Александр 2012-12-13 14:40:15
Цитата Александр
Цитата Отдел разработки сайтов
Цитата Александр
вывел такой код

Можно тогда попробовать убрать из кода "$value && ":
if($value && isset($a[$value])){
$x=array( $value=>'' );
foreach($a as $k => $v) $x[$k]=$v;
$a=$x;
}else $value=0;

оно как то странно создает... у еня же 3 фильра было соданно и третий фильтр каряво отображался... я создал еще один он нормально отображается... потом решил перепроверить создал еще один он каряво опять начал отображаться.

Хоят удалил то тчо вы сказали.. кеш почистил и нормально заработало!! Спасибо большое
#62 Сергей 2012-12-23 16:33:04
Добрый вечер, есть такой вопрос не совсем конечно по теме ну все же.

Можно ли каким нибудь способом присвоить id для в:


Тест
Тест2


Чтобы при наведении курсора на Тест2 могла поменяться картинка в отдельном div'е по обнаружению id у

Все получается с checkbox, ну ничего не выходит с
#63 Сергей 2012-12-23 16:36:28
Не показываются html теги ((( id для < op ti on>

< se lec ted>
Тест
Тест2
< /se lec ted>
#64 Отдел разработки сайтов 2012-12-24 02:27:32
Цитата Сергей
Чтобы при наведении курсора на Тест2 могла поменяться картинка в отдельном div'е по обнаружению id


<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>
#65 Сергей 2013-01-11 16:47:26
Здравствуйте!
Подскажите пожалуйста, сделал 3 селекта: 1. Цвет 2.Размер 3.Категория.
Поиск отлично работает по цвету и категории, а размер просто игнорится, даже если просто выбрать любой размер без цвета и категории, все равно игнорится. Подскажите, как это исправить ?
#66 Отдел разработки сайтов 2013-01-11 17:46:48
Цитата Сергей
Поиск отлично работает по цвету и категории, а размер просто игнорится, даже если просто выбрать любой размер без цвета и категории, все равно игнорится. Подскажите, как это исправить ?

Недостаточно информации для ответа. Нужно открыть файл \administrator\components\com_virtuemart\models\product.php и перед строкой return $product_ids добавить echo $whereString; потом выбрать в фильтре размер, и прислать сюда отладочную информацию.
#67 Сергей 2013-01-12 07:18:51
Вот такая инфа получается
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 ) )
#68 Отдел разработки сайтов 2013-01-12 10:34:57
Цитата Сергей
Вот такая инфа получается

Поиск почему-то идет по пустому параметру pf.`custom_value` like "%%"

Нужна еще отладочная информация, вставить var_export($res); после $res=$db->loadObjectList(); в \components\com_virtuemart\views\category\tmpl\default.php
#69 Сергей 2013-01-12 12:37:33
Цитата Отдел разработки сайтов
Цитата Сергей
Вот такая инфа получается

Поиск почему-то идет по пустому параметру 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%" ну по нему поиск не осуществляется
#70 Сергей 2013-01-12 13:01:03
Заметил следующее, если закомментировать размер, поиск по цвету работает отлично, при рабочем параметре размера, поиск по цвету работает не верно, даже если размер не выбирать.
При выбранном красном цвете выдает так же и черный цвет товара у которого есть в доп полях размер.
#71 Отдел разработки сайтов 2013-01-12 15:01:50
Цитата Сергей
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 )
#72 Сергей 2013-01-12 15:12:47
Вот что получилось:
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
#73 Отдел разработки сайтов 2013-01-12 15:28:47
Цитата Сергей
Вот что получилось:

С этим запросом нужно идти в phpmyadmin.

И еще раз, поиск по нескольким полям описан тут http://2v3.su/blog/web/72.html, а судя по запросу, код взяли отсюда http://2v3.su/blog/web/56.html. Т.е. нужно все сделать так, как описано в этой статье.
#74 Сергей 2013-01-12 15:54:40
Изменил, получилось так, что размер стал работать отменно, а вот параметр цвет теперь не работает.
Подскажите, как правильно создать до поля для такого поиска, каждому параметру отдельное доп поле на атрибут корзины или же одно доп поле ну с разными значениями ?
#75 Отдел разработки сайтов 2013-01-12 16:14:03
Цитата Сергей
получилось так, что размер стал работать отменно, а вот параметр цвет теперь не работает.

Что значит не работает, вообще не выдает в фильтре цвета или же товары не находит, если выбрать только цвет.

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


Нужно сначала создать атрибут корзины в настраиваемых полях, а потом посмотреть ID:
Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку, это ID записи, в нашем случаи это «Размер» (ID 4) и «Цвет» (ID 10), тип поля «Атрибут корзины».

$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет', 11=>'Другой параметр'); //и т.д.
$customfields=array(4=>0, 10=>0, 11=>0); //и т.д.

4, 10 и 11 - из этого примера, нужно заменить на ID из виртумарта.
#76 VicUp 2013-01-24 18:20:13
Здравствуйте!
А можно с помощью данного кода вывести сортировку по производителям?
Спасибо
#77 Отдел разработки сайтов 2013-01-24 22:25:17
Цитата VicUp
А можно с помощью данного кода вывести сортировку по производителям?

Сортировка по производителю, это стандартный функционал виртумарта. Виртумарт - Настройки - вкладка Настройки заказ - поставить галочку на Производитель.
#78 VicUp 2013-01-24 23:45:32
Цитата Отдел разработки сайтов
Цитата VicUp
А можно с помощью данного кода вывести сортировку по производителям?

Сортировка по производителю, это стандартный функционал виртумарта. Виртумарт - Настройки - вкладка Настройки заказ - поставить галочку на Производитель.

я имела в виду сортировку товара по наименованию производителя, точно так же как в примере с размером товара, только при клике разворачивался список производителей
#79 VicUp 2013-01-25 13:46:50
Цитата VicUp
Цитата Отдел разработки сайтов
Цитата VicUp
А можно с помощью данного кода вывести сортировку по производителям?

Сортировка по производителю, это стандартный функционал виртумарта. Виртумарт - Настройки - вкладка Настройки заказ - поставить галочку на Производитель.


я имела в виду сортировку товара по наименованию производителя, точно так же как в примере с размером товара, только при клике разворачивался список производителей

Дико извиняюсь, мне попался шаблон джумлы с виртумартом, в котором не было этой строки
почему-то О_о, в дефолтном шаблоне она присутствует, еще раз извиняюсь за беспокойство
#80 VicUp 2013-01-25 13:47:59
echo $this->orderByList['manufacturer']; - этой строки*
#81 VicUp 2013-01-29 21:11:57
Доброго времени суток!
Такая проблема - есть дефолтный фильтр по производителям и есть новосозданный фильтр "Год выпуска". Года выпуска указаны только по ОДНОМУ производителю, как сделать, чтобы при выборе в фильтре других производителей, фильтр "Год выпуска" не отображал список годов или вообще не отображался как таковой? За ранее спасибо
#82 Отдел разработки сайтов 2013-01-29 23:49:52
Цитата VicUp
Такая проблема - есть дефолтный фильтр по производителям и есть новосозданный фильтр "Год выпуска". Года выпуска указаны только по ОДНОМУ производителю, как сделать, чтобы при выборе в фильтре других производителей, фильтр "Год выпуска" не отображал список годов или вообще не отображался как таковой?

например, год есть только у производителя с ID 1, то:
$man_id=JRequest::getvar('manufacturer_id', null);
if($man_id==1){
тут код "Год выпуска"
}
#83 VicUp 2013-01-30 15:05:09
Цитата Отдел разработки сайтов
Цитата VicUp
Такая проблема - есть дефолтный фильтр по производителям и есть новосозданный фильтр "Год выпуска". Года выпуска указаны только по ОДНОМУ производителю, как сделать, чтобы при выборе в фильтре других производителей, фильтр "Год выпуска" не отображал список годов или вообще не отображался как таковой?

например, год есть только у производителя с ID 1, то:
$man_id=JRequest::getvar('manufacturer_id', null);
if($man_id==1){
тут код "Год выпуска"
}

А можно поподробней про "тут код года выпуска"? пожалуйста! не въеду, что конкретно там прописывается
#84 Отдел разработки сайтов 2013-01-30 22:21:03
Цитата VicUp
и есть новосозданный фильтр "Год выпуска".

Как я понял, был создан новый фильтр "Год выпуска" на основе статьи, внесены правки в файл \components\com_virtuemart\views\category\tmpl\default.php - этот код из статьи нужно поместить в условие, тем самым фильтр будет появляться только тогда, когда выбран нужный производитель:

$man_id=JRequest::getvar('manufacturer_id', null);
if($man_id==1){
тут весь код "Год выпуска", в статье это был Размер и Цвет
начало отсюда
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
...........
$result.=''; } и досюда
}
#85 VicUp 2013-01-30 23:08:58
Цитата Отдел разработки сайтов
Цитата VicUp
и есть новосозданный фильтр "Год выпуска".

Как я понял, был создан новый фильтр "Год выпуска" на основе статьи, внесены правки в файл \components\com_virtuemart\views\category\tmpl\default.php - этот код из статьи нужно поместить в условие, тем самым фильтр будет появляться только тогда, когда выбран нужный производитель:

$man_id=JRequest::getvar('manufacturer_id', null);
if($man_id==1){
тут весь код "Год выпуска", в статье это был Размер и Цвет
начало отсюда
$results=array(4=>'Выбрать размер', 10=>'Выбрать цвет');
...........
$result.=''; } и досюда
}


все дошло, спасибо большое, сейчас буду тестить
#86 Ирина 2013-02-11 14:07:54
Здравствуйте! У меня фильтр срабатывает только один раз почему то. Когда переходишь в категорию и выбираешь, он отбирает, но дальше все , даже на "Любой" не возвращает.
#87 Отдел разработки сайтов 2013-02-12 07:41:48
Цитата Ирина
У меня фильтр срабатывает только один раз почему то. Когда переходишь в категорию и выбираешь, он отбирает, но дальше все , даже на "Любой" не возвращает.

Попробуйте прислать отладочную информацию.
после $db=JFactory::getDbo(); вставьте var_export($_REQUEST);
и после $res=$db->loadObjectList(); это var_export($res);
#88 Ирина 2013-02-12 10:03:27
array ( 'option' => 'com_virtuemart', 'view' => 'category', 'limitstart' => '0', 'virtuemart_category_id' => '2', 'customfields' => array ( 19 => 'Розетки электрические', ), 'Itemid' => NULL, )array ( 0 => stdClass::__set_state(array( 'value' => 'Розетки электрические', )), 1 => stdClass::__set_state(array( 'value' => 'Выключатели', )), 2 => stdClass::__set_state(array( 'value' => 'Аксессуары', )), )array ( 0 => stdClass::__set_state(array( 'value' => 'Красный', )), 1 => stdClass::__set_state(array( 'value' => 'зеленый', )), 2 => stdClass::__set_state(array( 'value' => 'синий', )), )

http://xn--80aeybodcb.net/index.php?option=com_virtuemart&view=category&virtuemart_category_id=2&Itemid=446
#89 Отдел разработки сайтов 2013-02-12 10:33:33
Цитата Ирина
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
#90 Ирина 2013-02-12 13:04:00
Цитата Отдел разработки сайтов

заменить $a=array(0=>'Любой'); на $a=array();
после ksort($a); вставить $a=array_merge(array(0=>'Любой'), $a);
Пример кода можно посмотреть тут: http://2v3.su/src/blog/web/blog72.zip

Цитата Отдел разработки сайтов
Цитата Ирина
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

Не помогло
#91 Отдел разработки сайтов 2013-02-12 13:49:03
Цитата Ирина
Не помогло

На сколько я вижу, теперь Механизмы и Цвет отображаются верно. А то что фильтр исчезает когда в категории нет товаров, то все модификации можно посмотреть тут http://2v3.su/src/blog/web/blog72.zip \components\com_virtuemart\views\category\tmpl\default.php обратить внимание на это:
// Show child categories
if (true /*!empty($this->products)*/) {
#92 Денис 2013-02-13 11:36:36
Попробуйте заменить 0 на null. У меня тоже была такая проблема, причем при некоторых типах атрибута и названиях.
#93 Сергей 2013-02-18 11:55:13
Добрый день, и снова я к Вам за помощью.
Вопрос в следующем:
1. Есть 3 параметра поиска: Цвет, Размер и Категория. Если по одной галочке ставить на каждый параметр, поиск работает превосходно, но как только поставить 2 галочки к примеру на параметр "Цвет" поиск осуществляется по последней галочке, игнорируя первую галочку. Так же и с остальными параметрами.
То есть если необходимо найти "Красный" и "Черный" цвета в категории "Авто" поиск осуществится по параметру "Черный" в категории "Авто". Если даже не выбирать категорию, а выбрать лишь 2 цвета все равно поиск пойдет по последнему параметру.
Можно ли исправить это ?
#94 Отдел разработки сайтов 2013-02-18 14:43:40
Цитата Сергей
Можно ли исправить это ?

В данном фильтре такой функционал и не предусматривался, написать, конечно, могу, но это уже платно, поскольку отнимает время. Как компромисс, оставляйте как есть фильтр, и такого функционала вполне достаточно для начала, если вы собственник сайта, если фрилансер, то самостоятельное решение задачи оправдается в дальнейшем.
#95 Сергей 2013-02-18 16:37:56
//Для других браузеров срабатывает только в случаи выбора элемента
$('#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); тут выводится текст, а как вместо этого картинку вывести ?
#96 Отдел разработки сайтов 2013-02-18 16:44:28
Цитата Сергей

$('#mydiv').html('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+'" />');
#97 Сергей 2013-02-20 08:08:23
Добрый день.
Появился такой вопрос: Если в поиске фигурирует категория и под категория , каким способом можно указать в value id категории и под категорий, чтобы поиск работал на все под категории.
#98 Отдел разработки сайтов 2013-02-20 16:25:39
Цитата Сергей
Появился такой вопрос: Если в поиске фигурирует категория и под категория , каким способом можно указать в value id категории и под категорий, чтобы поиск работал на все под категории.

Это вопрос относится к виртумарту? Уточните?
#99 Сергей 2013-02-20 17:01:00
Цитата Отдел разработки сайтов
Цитата Сергей
Появился такой вопрос: Если в поиске фигурирует категория и под категория , каким способом можно указать в 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;
}
Вы не могли бы помочь в этом вопросе?) я знаю, я сильно Вас утомил, но кроме Вас никто не поможет.
#100 Сергей 2013-02-20 17:04:57
Сорри, но теги не появились.
#101 Отдел разработки сайтов 2013-02-20 19:50:35
Цитата Сергей
Notice: Undefined variable custom_search

\administrator\components\com_virtuemart\models\product.php - перед или после $joinCustom = true; (это там же где ошибка) вставьте $custom_search=array();

Цитата Сергей
Если указывать id 1, то поиск не будет искать в под категориях лишь только в id1

В виртумарте, при добавлении товара можно указывать несколько категорий, включая все вложенные, или найти строку в файле \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. А забесплатно, нужно надеяться только на свои мозги. Первая задача может даваться трудно, но с каждой последующей будет легче.
#102 Отдел разработки сайтов 2013-02-21 14:54:33
Цитата Сергей
Но так же есть под категория с ID 2 и 3 у категории "авто" Если указывать id 1, то поиск не будет искать в под категориях лишь только в id1.

Ответ по поиску в подкатегориях помог? На случай если у кого будет подобная проблема.
#103 Сергей 2013-02-21 16:51:36
Цитата Отдел разработки сайтов
Цитата Сергей
Notice: Undefined variable custom_search

\administrator\components\com_virtuemart\models\product.php - перед или после $joinCustom = true; (это там же где ошибка) вставьте $custom_search=array();



Есть только $joinCustom = false;
Но проблема по прежнему существует, ничего не меняется.
Закралась у меня мысль, что поиск так же затрагивает селект который не относится к поиску и пытается искать по value тем самым вызываю эту ошибку. Т.к. в этом селекте стоят value=1, 2, 3 а в customfields[99] таких просто нет.
#104 Сергей 2013-02-21 17:04:40
Я был не внимателен, не заметил $joinCustom = true;
Все получилось, ошибка пропала за что вам БОЛЬШОЕ человеческое СПАСИБО.
А на счет помощи в крайних случаях по php и возможность отблагодарить Вас за работу в виде денежных взносов, пожалуйста, скиньте мне на Email свой email адресок для контакта.
#105 Отдел разработки сайтов 2013-02-21 17:32:29
Цитата Сергей
Есть только $joinCustom = false;

нужно посмотреть начало этой статьи, там есть $joinCustom = true

Цитата Сергей
Закралась у меня мысль, что поиск так же затрагивает селект который не относится к поиску и пытается искать по value тем самым вызываю эту ошибку. Т.к. в этом селекте стоят value=1, 2, 3 а в customfields[99] таких просто нет.

Признаться не могу уловить, что вы там нагромоздили.

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.') ';
#106 Отдел разработки сайтов 2013-02-21 17:34:38
Цитата Сергей
Я был не внимателен, не заметил $joinCustom = true;
Все получилось, ошибка пропала за что вам БОЛЬШОЕ человеческое СПАСИБО.
А на счет помощи в крайних случаях по php и возможность отблагодарить Вас за работу в виде денежных взносов, пожалуйста, скиньте мне на Email свой email адресок для контакта.

Пока писал, вы уже ответили, контакты в разделе "Контакты"
#107 Юрий 2013-04-26 11:51:05
Подскажите пытался все сделать как написано но после редактирования файлов выходит белая страница подскажите вот мои файлы что и где там нужно менять может я что то не правильно делаю файлы эти не менялись просто чтоб не напортачить первый файл
administratorcomponentscom_virtuemartmodelsproduct.php
сайт http://elena-rukodelie.com.ua/
#108 Отдел разработки сайтов 2013-04-26 12:16:16
Цитата Юрий
Подскажите пытался все сделать как написано но после редактирования файлов выходит белая страница подскажите вот мои файлы что и где там нужно менять может я что то не правильно делаю файлы эти не менялись просто чтоб не напортачить первый файл
\administrator\components\com_virtuemart\models\product.php

Скорее всего, где-то допустили ошибку, так угадать сложно. И на вашем сайте я вообще не увидел фильтра по товарам. Если на хостинге отключен вывод php-ошибок, то проверьте log-файл в корне сайта.
#109 Юрий 2013-04-26 13:26:46
а скрин посмотреть можно как выглядеть сам фильтр поиска что примерно знать на что он похож
#110 Отдел разработки сайтов 2013-04-26 13:29:47
Цитата Юрий
а скрин посмотреть можно как выглядеть сам фильтр поиска что примерно знать на что он похож

http://mama-dama.com/magazin/10/odezhda-dlya-kormyashchikh-mam/futbolki-dlya-kormleniya.html
#111 Юрий 2013-04-26 13:45:19
да увидел но на моем сайте есть тоже но только указаны

Сортировать по Производитель:

хотелось бы сделать По составу за место размера

вот страница где он работает
http://elena-rukodelie.com.ua/magazin/pryazha/pryazha-100-sherst/cashmira/orderDesc/by,product_price.html


а лучше сделать так
#112 Отдел разработки сайтов 2013-04-26 16:01:19
Цитата Юрий
вот страница где он работает
http://elena-rukodelie.com.ua/magazin/pryazha/pryazha-100-sherst/cashmira/orderDesc/by,product_price.html

Опять же по внешнему виду страницы трудно угадать, почему не выводится фильтр. Единственное, еще раз все внимательно проверьте, или я могу сделать это за вас, но уже платно.
#113 Юрий 2013-04-26 19:52:17
я прописал но дополнительные поля не появились
elena-rukodelie.com.ua/magazin/pryazha/pryazha-100-sherst/cashmira/orderDesc/by,product_price.html
#114 Юрий 2013-04-26 19:56:00
вы писали что сможете сделать за деньги а сколько такой фильтр будет стоить
http://www.sotvorchestvo.biz/product/cashmira-fine-214
левый блок сайта
#115 Отдел разработки сайтов 2013-04-26 20:27:37
Цитата Юрий
я прописал но дополнительные поля не появились

по всей видимости, вам сложно ориентироваться в коде, я вижу, что сайт делала веб-студия, почему бы вам не обратиться к ним по настройке. Вот модифицированные файлы http://2v3.su/src/blog/web/blog72.zip только для того чтобы посмотреть, поверх копировать не нужно, поскольку могут быть нестыковки в версиях Виртумарта.

Цитата Юрий
вы писали что сможете сделать за деньги а сколько такой фильтр будет стоить
sotvorchestvo.biz

тут не Виртумарт, поэтому разработка с нуля будет стоить дороже, нежели настройка уже готового. Сделать, конечно, сделаем, но в Украине, то же самое будет несколько дешевле, чем в Сибири, просто сравните наши цены на создание сайтов.
#116 Юрий 2013-04-26 20:33:22
хорошо я понял код я вставил я переименовал

По составу а как заставить чтоб фильтр работал не по размеру а по составу допустим
Вискоза и шелк
Из искусств. волокон
Лён и бамбук
Полушерстяная пряжа
С металликом
С мохером или ангорой
Стрейчевая пряжа
Хлопок
Шерстяная пряжа
#117 Отдел разработки сайтов 2013-04-26 20:46:04
Цитата Юрий
По составу а как заставить чтоб фильтр работал не по размеру а по составу допустим

Точно также как и размер, допустим под ID 10 (Virtuemart -> Товары -> Настраиваемые поля -> смотрим первую колонку) указан Материал, ну и соответственно, в дополнительных полях к товару должен быть указан конкретный Материал (шелк, хлопок и т.д.).
$results=array(4=>'Выбрать размер', 10=>'Выбрать материал');
$customfields=array(4=>0, 10=>0);
#118 Юрий 2013-04-26 20:48:46
хорошо а сколько будет стоить чтоб вы настроили
#119 Отдел разработки сайтов 2013-04-26 20:57:59
Цитата Юрий
хорошо а сколько будет стоить чтоб вы настроили

500 руб., но у вас уже получается, попробуйте сделать так: заменить $a=array(0=>'Любой'); на $a=array();
после ksort($a); вставить $a=array_merge(array(0=>'Любой'), $a);
Еще внимательней посмотрите код: http://2v3.su/src/blog/web/blog72.zip
#120 Валентина 2013-05-20 15:51:33
СПАСИБО БОЛЬШОЕ! Очень помог ваш код, собиралась сама писать и случайно сразу попала на эту страницу, всё работает. Был недочет, но удаление $value && из if($value && isset($a[$value])){ помогло!
#121 Ольга 2013-05-22 12:33:08
а на joomla 1.5.26 это будет работать? (Виртумарт 2.0.4)
#122 Отдел разработки сайтов 2013-05-22 12:53:06
Цитата Ольга
а на joomla 1.5.26 это будет работать? (Виртумарт 2.0.4)

Да, на любой джумле, на которой установлен виртумарт 2.
#123 Ольга 2013-05-22 13:03:30
Цитата Отдел разработки сайтов
Цитата Ольга
а на joomla 1.5.26 это будет работать? (Виртумарт 2.0.4)

Да, на любой джумле, на которой установлен виртумарт 2.

спасибо, да у меня вроде работало, а сейчас перестало, не выводит товаров. Вроде уже все откатила назад, а всё равно товаров 0. Буду искать что ещё поменяла.
#124 Отдел разработки сайтов 2013-05-22 13:10:04
Цитата Ольга
да у меня вроде работало, а сейчас перестало, не выводит товаров. Вроде уже все откатила назад, а всё равно товаров 0. Буду искать что ещё поменяла.

Т.е. работал этот код, или работало все до установки кода? Если с кодом, то вспомните, что изменили? Если же без кода, то вернуть оригинальные файлы всегда можно.
#125 xaoc 2013-11-28 09:54:56
Здравствуйте!

спасибо огромное за код! (и за работу в комментариях! благодаря им почти настроила то, что нужно)

остались вопросы, на которые не хватает уже сил... -)
подскажите, пожалуйста
1. почему не появляется слово Любой в рамочке как Производитель
http://gyazo.com/2e789a3277701bc59bb6866777999878

2. зачем исчезает фильтр, если по данному параметру нет товаров? как сделать так, чтоб не исчезал?

3. и как вставить этот фильтр в шаблон categories/ (мне нужно, чтобы в одной из категорий магазина была фильтрация по настраиваемому полю).


мой код














СПАСИБО!
#126 xaoc 2013-11-28 09:56:11
/*
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.='';
}
?>
#127 xaoc 2013-11-28 10:00:31
с пунктом первым разобралась
заменила все же
//Сортируем
ksort($a);
$a=array_merge(array(null=>'Любой'), $a); на
//Сортируем
ksort($a);
$a=array_merge(array(0=>'Выбрать'), $a

и все ОК и рамочка и слово Выбрать.

остались два вопроса -)
#128 Отдел разработки сайтов 2013-11-28 13:47:57
Цитата xaoc
остались два вопроса -)

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);
#129 xaoc 2013-11-29 06:56:32
Спасибо! п.2 решен, теперь не исчезает.

но с п.3 не все понятно.
дело в том, если я подключаю default.php с этим кодом к общей категории, в которой содержатся подкатегории с товарами, то поскольку в данной общей категории товаров-то нет (все по подкатегориям), то соответственно и фильтр ничего не показывает и не ищет по подкатегориям.

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

а так, этот код просто ничего не показывает (т.к. товара в общей категории нет).
вообще это с некоторой стороны неудобство ВМ, когда он не показывает сколько всего товаров в общей категории, а показывает товары, только в подкатегориях (дерево прайслиста-то может быть очень многоуровневым, и иногда в админке хочется открыть все товары именно главных категорий одним списком, а не залезать внутрь подкатегорий скажем 4 уровня вложенности).
#130 xaoc 2013-11-29 06:57:25
да, и где взять php-модуль? у меня когда стояла джумла 1.5, то такой был, а теперь 2.5 и такого найти не могу -(
спасибо!
#131 xaoc 2013-11-29 07:06:09
php-модуль я вроде бы нашла (flexi custom module)
но вот со вставкой кода... -)
могли бы полный код привести, чтоб уж точно вставить и заработало (а то у меня parse error, а в программировании я совсем не очень).
#132 xaoc 2013-11-29 07:14:14
Parse error: syntax error, unexpected $end
#133 xaoc 2013-11-29 08:39:14
и вот еще такой вопрос.
для подкатегорий это актуально.
Например, сортировка по производителю представляет собой список только тех производителей, товары которых представлены именно в данной подкатегории.
А вот сортировка по настраиваемому полю представляет собой список вообще всех значений данного поля для всех товаров.
может быть как-то можно добавить условие, чтобы не весь список выпадал, а только те значения, которые есть у товаров в данной подкатегории.
#134 Отдел разработки сайтов 2013-11-29 09:10:38
Цитата xaoc
а так, этот код просто ничего не показывает (т.к. товара в общей категории нет).

Для этого в вирутамарте можно указывать несколько категорий для товара в админке.

Цитата xaoc
в программировании я совсем не очень)

Дело в том, что мои ответы больше носят справочный характер для тех, кто хоть как-то разбирается, чтобы они могли реализовать задуманное самостоятельно. Я не даю полностью готовых решений на каждый вопрос, поскольку для этого нужно затратить кучу времени, чтобы даже написать развернутый ответ. В связи с этим у меня вопрос, в чем проблема реализовать ваши задумки платно? Неужто ваша коммерческая тематика совсем убыточная.
#135 xaoc 2013-11-29 10:17:02
Цитата Отдел разработки сайтов

Для этого в вирутамарте можно указывать несколько категорий для товара в админке.


тогда товары будут отражаться в этой главной категории, а это совсем лишнее.

Цитата Отдел разработки сайтов

В связи с этим у меня вопрос, в чем проблема реализовать ваши задумки платно?


реализовать платно не сильно большая проблема. просто это задумки сиюминутного возникновения так сказать, и видите, часть я смогла решить самостоятельно при помощи данной статьи и комментариев к ней плюс Ваша подсказка.

если ответ на вопрос о том, как реализовать сортировку по товарам из подкатегорий в главной категории, сложен, не укладывается в рамки справочного, и следовательно платный, то тут проблема у меня именно в том, чтобы найти адекватного платного исполнителя.
#136 Отдел разработки сайтов 2013-11-29 11:22:07
Цитата 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);
#137 Отдел разработки сайтов 2013-11-29 12:15:29
В предыдущем комментарии поправьте (я уже исправил в нем), если уже делаете, это $a=$this->_db->loadAssocList(); на это $a=$db->loadAssocList(); Просто сам я этот код не тестировал, так написал. Ну и отпишите потом, что получилось.
#138 Morfiys 2013-12-11 00:21:35
Доброго времени суток!
Ктонибудь пробовал тестить на Joomla! 2.5.14 и VM 2.0.24? Оч полезная статья, но на указаных версиях не получается настроить, отпишитесь если у кого получилось или кто может помочь.
#139 Отдел разработки сайтов 2013-12-11 07:21:51
Цитата Morfiys
Ктонибудь пробовал тестить на Joomla! 2.5.14 и VM 2.0.24?

На VM 2.0.24 не тестировал, но должно работать. Внимательнее вносите корректировки. Для просмотра вставок, вот пример http://2v3.su/src/blog/web/blog72.zip (поверх копировать не нужно).
#140 Morfiys 2013-12-11 11:16:41
Отдел разработки сайтов

Благодарю за ссылку, попробую разобраться.
Интересует такой вопрос, если все же не получится есть ли возможность обратиться к Вам на платной основе?
#141 Отдел разработки сайтов 2013-12-11 11:50:03
Цитата Morfiys
Интересует такой вопрос, если все же не получится есть ли возможность обратиться к Вам на платной основе?

Конечно, можно.
#142 Юленька 2014-05-30 20:52:55
Цитата Оле
Спасибо. А как бы сделать, чтобы список значений для каждого фильтра (помимо ALL) был бы результатом предыдущей фильтрации? Сейчас выводятся все возможные значения, а новый выбор сбрасывает предыдущую установку предыдущего фильтра.

Добрый день! Большое спасибо за решение! одно на миллион!
Вопрос уже поднимался, но я не поняла, есть ли такая возможность. Можно ли сделать так, чтобы поля были взаимосвязаны между собой? Каждый фильтр показывал только значения, которые соответствуют предыдущему выбранному фильтру. Спасибо большое! :sigh:
#143 Отдел разработки сайтов 2014-06-01 11:17:47
Цитата Юленька
Вопрос уже поднимался, но я не поняла, есть ли такая возможность. Можно ли сделать так, чтобы поля были взаимосвязаны между собой? Каждый фильтр показывал только значения, которые соответствуют предыдущему выбранному фильтру.

Вот, нечто подобное делали для этого сайта.
Пример в архиве, только поверх заменять файлы не нужно, могут быть нестыковки в версиях виртумарта.
#144 Юленька 2014-06-02 08:54:47
Цитата Отдел разработки сайтов
Цитата Юленька
Вопрос уже поднимался, но я не поняла, есть ли такая возможность. Можно ли сделать так, чтобы поля были взаимосвязаны между собой? Каждый фильтр показывал только значения, которые соответствуют предыдущему выбранному фильтру.

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

Огромное спасибо! Буду пробовать!
#145 Павел 2014-10-14 12:53:26
Не могу никак разобраться, фильтр поставил но товары не выводит если по нему сортировать. Уже замучился :sigh:
Вот ссылка на сайт http://moda-skonti.ru/index.php/katalog
#146 Отдел разработки сайтов 2014-10-17 16:25:25
Цитата Павел
Не могу никак разобраться, фильтр поставил но товары не выводит если по нему сортировать. Уже замучился :sigh:
Вот ссылка на сайт http://moda-skonti.ru/index.php/katalog

Ошибку помогли исправить. Обращаем внимание, что для новых версий виртумарта, в скрипте \administrator\components\com_virtuemart\models\product.php вместо "$joinedTables.=" пишем "$joinedTables[]="
#147 gavric_ 2014-10-18 12:08:45
Цитата Отдел разработки сайтов
Цитата Павел
Не могу никак разобраться, фильтр поставил но товары не выводит если по нему сортировать. Уже замучился :sigh:
Вот ссылка на сайт http://moda-skonti.ru/index.php/katalog

Ошибку помогли исправить. Обращаем внимание, что для новых версий виртумарта, в скрипте \administrator\components\com_virtuemart\models\product.php вместо "$joinedTables.=" пишем "$joinedTables[]="

А что еще изменилось у меня перестал работать этот фильтр после обновления до 2.6.6. Когда выбираешь одно значение из фильтра сразу пишет " Товар не найден" Куда копать ума не приложу. И пример не работает который в архиве blog72.zip !
#148 gavric_ 2014-10-20 07:15:45
Цитата gavric_
Цитата Отдел разработки сайтов
Цитата Павел
Не могу никак разобраться, фильтр поставил но товары не выводит если по нему сортировать. Уже замучился :sigh:
Вот ссылка на сайт http://moda-skonti.ru/index.php/katalog

Ошибку помогли исправить. Обращаем внимание, что для новых версий виртумарта, в скрипте \administrator\components\com_virtuemart\models\product.php вместо "$joinedTables.=" пишем "$joinedTables[]="

А что еще изменилось у меня перестал работать этот фильтр после обновления до 2.6.6. Когда выбираешь одно значение из фильтра сразу пишет " Товар не найден" Куда копать ума не приложу. И пример не работает который в архиве blog72.zip !

Вопрос решился почему то после обновление стояла галочка "Отключить SEO" убрал и все заработало!

Специалист по видео

8 (929) 264 1523 (Константин)

cashara@bk.ru

Специалист по фото

8 (929) 261 3062 (Дмитрий)

Мультимедиа-студия «Два в кубе» © 2011 - 2015