Форум русской поддержки Joomla!® CMS
09.12.2016, 02:09:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Проблема с поиском Serach и Advanced Search модулях

 (Прочитано 211 раз)
0 Пользователей и 1 Гость смотрят эту тему.
orsy
Давно я тут
****

Репутация: +19/-1
Offline Offline

Пол: Мужской
Сообщений: 331


Web-Factor Ukraine


« : 13.05.2016, 15:52:28 »

Ну точнее проблема не в них, а непосредственно в поиска по полям типа multicheckbox и multiselect.

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

Так вот проблема в том что они в той части компонента, которая отвечает за поиск объявлений, обрабатываются как-то неправильно.

Подробнее:
поле имеет значение rus, en, ua
пытаюсь искать по значению rus
включил отладку в Joomla и в запросе вижу вот такую вот картину:

Код:
SELECT adext.*, a.*, p.name as parent, p.id as parentid, c.name as cat, c.id as catid,u.username as user,u.name as fullname  
  FROM acatf_adsmanager_ads as a
  LEFT JOIN acatf_paidsystem_ads as adext
  ON a.id = adext.id  
  INNER JOIN acatf_adsmanager_adcat as adcat
  ON adcat.adid = a.id  
  LEFT JOIN acatf_users as u
  ON a.userid = u.id  
  INNER JOIN acatf_adsmanager_categories as c
  ON adcat.catid = c.id  
  LEFT JOIN acatf_adsmanager_categories as p
  ON c.parent = p.id  
  WHERE  1  
  [b]AND (a.ad_poliglot LIKE '%,r,%' )[/b]
  AND  a.published = 1
  AND c.published = TRUE  
  AND c.id IN (10,1,2,3,4,5,6,7,8,9)  
  GROUP BY a.id
  ORDER BY a.date_created DESC ,a.id  DESC
  LIMIT 0, 20

 AND (a.ad_poliglot LIKE '%,r,%' )
почему то в запросе нет запрошенyого значения rus, а только буковка r

полез разбираться, нашел место где формируется этот запрос
находиться это счастье в файле /administrator/components/com_adsmanager/models/field.php
и выглядит этот участок кода вот так:

Код:
foreach($fields as $fsearch){
switch($fsearch->type)
{
case 'multicheckbox':
case 'multiselect':
$value = JRequest::getVar( $fsearch->name, array() );
for($i = 0,$nb=count($value);$i < $nb;$i++)
{
if ($i == 0)
$search .= " AND (";
if (version_compare(JVERSION,'1.7.0','<')) {
                            $search .= "a.$fsearch->name LIKE '%,".$this->_db->getEscaped($value[$i],true).",%'";
                        }else{
                            $search .= "a.$fsearch->name LIKE '%,".$this->_db->escape($value[$i],true).",%'";
                        }
if ($i < $nb - 1)
$search .= " OR ";
else
$search .= " )";
}
break;
            ...

Может кто пояснит мне, почему в запрос не попадает значение, выбранное в выпадающем списке, а на его месте оказывается буковка r?

Забивал приведенный выше запрос непосредственно в phpMyAdmin, и если буковку r заменить на rus то все норм ищется.

В чем проблема? Помогите! !
« Последнее редактирование: 13.05.2016, 17:28:08 от orsy » Записан
orsy
Давно я тут
****

Репутация: +19/-1
Offline Offline

Пол: Мужской
Сообщений: 331


Web-Factor Ukraine


« Ответ #1 : 13.05.2016, 17:15:59 »

ПОБЕДИЛ!

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

Теперь все заработало!

Для тех кому интересно вот исправленный код

Код:

foreach($fields as $fsearch){
$searchTypeVal = json_decode(JRequest::getVar( $fsearch->name, array() ));
//switch($fsearch->type)
switch($searchTypeVal->searchtype_render)
{
case 'multicheckbox':
case 'multiselect':
$value = JRequest::getVar( $fsearch->name, array() );
for($i = 0,$nb=count($value);$i < $nb;$i++)
{
if ($i == 0)
$search .= " AND (";
if (version_compare(JVERSION,'1.7.0','<')) {
                            $search .= "a.$fsearch->name LIKE '%,".$this->_db->getEscaped($value[$i],true).",%'";
                        }else{
                            $search .= "a.$fsearch->name LIKE '%,".$this->_db->escape($value[$i],true).",%'";
                        }
if ($i < $nb - 1)
$search .= " OR ";
else
$search .= " )";
}
break;
...

Записан
orsy
Давно я тут
****

Репутация: +19/-1
Offline Offline

Пол: Мужской
Сообщений: 331


Web-Factor Ukraine


« Ответ #2 : 17.05.2016, 13:59:58 »

Фигню я какую-то намутил (( не работает пока поиск, копаю дальше, ибо получить тип поля не получилось пока что...
Записан
orsy
Давно я тут
****

Репутация: +19/-1
Offline Offline

Пол: Мужской
Сообщений: 331


Web-Factor Ukraine


« Ответ #3 : 17.05.2016, 18:17:43 »

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

Код:

function getSearchFieldsSql($fields)
    {
    if (isset($this->searchSQL)&&($this->searchSQL != ""))
    return $this->searchSQL;
   
    $search = "";
$plugins = $this->getPlugins();
foreach($fields as $fsearch){
$searchTypeRender = $fsearch->options->searchtype_render;
if($fsearch->type == 'multicheckbox' || $fsearch->type == 'multiselect'){
if($searchTypeRender == 'select'){
$searchTypeRender = 'selecttosheck';
}
}
if(!$searchTypeRender){
$searchTypeRender = $fsearch->type;
}
//switch($fsearch->type)
switch($searchTypeRender)
{
case 'multicheckbox':
case 'multiselect':
$value = JRequest::getVar( $fsearch->name, array() );
for($i = 0,$nb=count($value);$i < $nb;$i++)
{
if ($i == 0)
$search .= " AND (";
if (version_compare(JVERSION,'1.7.0','<')) {
                            $search .= "a.$fsearch->name LIKE '%,".$this->_db->getEscaped($value[$i],true).",%'";
                        }else{
                            $search .= "a.$fsearch->name LIKE '%,".$this->_db->escape($value[$i],true).",%'";
                        }
if ($i < $nb - 1)
$search .= " OR ";
else
$search .= " )";
}
break;

case 'selecttosheck':
$value = JRequest::getVar( $fsearch->name, "");
if ($value != ""){
if (version_compare(JVERSION,'1.7.0','<')) {
$search .= " AND ( a.$fsearch->name LIKE '%,".$this->_db->getEscaped($value,true).",%' )";
}else{
$search .= " AND ( a.$fsearch->name LIKE '%,".$this->_db->escape($value,true).",%' )";
}
}
break;
...

« Последнее редактирование: 18.05.2016, 00:29:00 от orsy » Записан
Ramil8009
Осваиваюсь на форуме
***

Репутация: +1/-1
Offline Offline

Сообщений: 124


« Ответ #4 : 09.11.2016, 11:00:46 »

У меня тоже не работает поиск, указанный код проблему не решил. У вас работает?
Записан
moonaway
Захожу иногда
**

Репутация: +0/-0
Offline Offline

Сообщений: 21


« Ответ #5 : 17.11.2016, 15:49:43 »

Указывайте версию, пожалуйста...
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet