Поиск страниц по параметрам

Обсуждение модулей, устанавливаемых по-умолчанию в cms concrete5

Поиск страниц по параметрам

Сообщение iDom » 18 ноя 2012, 11:41 ,  »  Сообщение:#1

Приветствую!
Пытаюсь запилить модуль поиска по параметрам для версии 5.5.2.1
судя по содержимому функции do_search в файле controller.php он там по умолчанию должен быть, но что то меня он напрягает он ведёт себя как-то странно. Насколько я понял он собирает данные из форм в массив, потом склеивает его в одну строку и отправляет запрос на обычный текстовый поиск.
Попытался сделать вот-так:
Код: Выделить всё
foreach ($res as  $r){
         $oPage = Page::getById($r['cID']);
         $stock = $oPage->getAttribute('stock');
         $type = $oPage->getAttribute('new_type');
         $level = $oPage->getAttribute('level');
         $origin = $oPage->getAttribute('origin');
         if(!empty($qa[0])) {if ($origin != $qa[0]) {continue;}}
         if(!empty($qa[1])) {if ($stock != $qa[1]) {continue;}}
         if(!empty($qa[2])) {if ($type != $qa[2]){continue;}}
         if(!empty($qa[3])) {if ($level != $qa[3]){continue;}}
         $results[] = new IndexedSearchResult($r['cID'], $r['cName'], $r['cDescription'], $r['score'], $r['cPath'], $r['content']);
      }

Но что-то не работает.
Так пытался сделать потому что функция filterByAttribute описанная в документации разработчика на оф.сайте, не пашет....
Подскажите пожалуйста что-нужно исправить?
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение iDom » 18 ноя 2012, 11:56 ,  »  Сообщение:#2

хотя нет работает, но пагинацию надо настроить и разграничить от обычного поиска...
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение Count_Raven » 19 ноя 2012, 14:30 ,  »  Сообщение:#3

Что случилось-то?
filterByAttribute прекрасно работает.
Постраничная навигация тоже имеется.
Код: Выделить всё
Loader::model('page_list');
Loader::model('attribute/categories/collection');

$pl = new PageList();
$pl->setItemsPerPage(10);

$handle = 'bla-bla-bla-attribute';
$value = 'bla-value';

$key = CollectionAttributeKey::getByHandle($handle);
if (is_object($key)) {
   $pl->filterByAttribute($handle, $value, '=');
}

$page = $pl->getPage();
$paginator = $pl->getPagination();
Country Amiant - Regno All Rianto
Аватара пользователя
Count_Raven
Супермодератор
 
Сообщения: 1156
Зарегистрирован: 06 окт 2010, 15:00
Откуда: Country Amiant

Re: Поиск страниц по параметрам

Сообщение iDom » 20 ноя 2012, 11:52 ,  »  Сообщение:#4

Тогда вопрос. По логике механизма наследования оно должно работать и для класса IndexedPageList. Но в файле controller.php блока search вызов этой функции неалё, вернее алё, но такое, что мало не покажется - любой её вызов обнуляет результаты поиска. Может ли быть такой результат не правильной работы с русскими символами?

П.С. я вообще не php-программист, хотел спросить есть ли какой нибудь отладчик, а то пока, что программирование на php напоминает программирование на Erlang: Придумай, напиши, сломай голову, найди ошибку методом, пофиксь, радуйся.
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение cmsservice » 20 ноя 2012, 14:54 ,  »  Сообщение:#5

iDom писал(а):Тогда вопрос. По логике механизма наследования оно должно работать и для класса IndexedPageList. Но в файле controller.php блока search вызов этой функции неалё, вернее алё, но такое, что мало не покажется - любой её вызов обнуляет результаты поиска. Может ли быть такой результат не правильной работы с русскими символами?

Не понятно что значит "не aлё". Если Вы про тот код, который в первом сообщении приведен, где Вы в цикле пытаетесь анализировать атрибуты, то просто не правильно сделано. Достаточно спокойно сесть проанализировать метод do_search класса Concrete5_Controller_Block_Search и сразу станет очевидно что проще сделать 4 вызова, что-то типа:
Код: Выделить всё
$ipl->filterByStock(...);
$ipl->filterByNewType(...);
...

до вызова $res = $ipl->getPage(); и в $res вернется уже готовый список отфильтрованных страниц, или пустой список, если удовлетворяющих условия страниц нет.

iDom писал(а):П.С. я вообще не php-программист, хотел спросить есть ли какой нибудь отладчик, а то пока, что программирование на php напоминает программирование на Erlang: Придумай, напиши, сломай голову, найди ошибку методом, пофиксь, радуйся.

Есть, мы например используем связку xdebug на сервере + NetBeans 7 как IDE и соответственно интерфейс к xdebug. Есть еще варианты как для серверной, так и для клиентской стороны. Самое простое - отладочная выдача и запись в лог.
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Поиск страниц по параметрам

Сообщение iDom » 20 ноя 2012, 18:56 ,  »  Сообщение:#6

cmsservice писал(а):
iDom писал(а):Тогда вопрос. По логике механизма наследования оно должно работать и для класса IndexedPageList. Но в файле controller.php блока search вызов этой функции неалё, вернее алё, но такое, что мало не покажется - любой её вызов обнуляет результаты поиска. Может ли быть такой результат не правильной работы с русскими символами?

Не понятно что значит "не aлё". Если Вы про тот код, который в первом сообщении приведен, где Вы в цикле пытаетесь анализировать атрибуты, то просто не правильно сделано. Достаточно спокойно сесть проанализировать метод do_search класса Concrete5_Controller_Block_Search и сразу станет очевидно что проще сделать 4 вызова, что-то типа:
Код: Выделить всё
$ipl->filterByStock(...);
$ipl->filterByNewType(...);
...

Не как раз таки мой код работает, только пришлось откзаться от пагинации и выводить весь список страниц.
А вот такой код:
Код: Выделить всё
$ipl->filterByAttribute('stock', $value, '=');
Возвращает мне пустой список, не смотря на то, что удовлетворяющие значения есть. Может ли проблема заключаться в кодировках, то есть: Из формы на странице в функцию передаётся значение в другой кодировке и сравнение через filterByAttribute не срабатывает?
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение cmsservice » 20 ноя 2012, 19:19 ,  »  Сообщение:#7

iDom писал(а):Не как раз таки мой код работает, только пришлось откзаться от пагинации и выводить весь список страниц.

А если использовать фильтрацию по правилам, то от пагинации не придется отказываться.

iDom писал(а):Может ли проблема заключаться в кодировках, то есть: Из формы на странице в функцию передаётся значение в другой кодировке и сравнение через filterByAttribute не срабатывает?

Ну, а как она может быть другой? Если Вы через интерфейс сайта заполняли атрибуты и в таблицах БД кодировка таблиц установлена в utf8, то кодировка правильная.

Вообще, что-то странное у Вас там, мы используем различные фильтрации в пейджлистах довольно активно и все работает корректно при использовании метода filterBy...
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Поиск страниц по параметрам

Сообщение iDom » 20 ноя 2012, 19:29 ,  »  Сообщение:#8

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

Попробовал метод filterBylevel результаты не верны. Такая же история с filterByorigin
Форма состоит из селектов, значения которых берутся из базы, затем передаются в виде массива в do_search. делаю вызовы:
Код: Выделить всё
$ipl->filterByorigin($q[0], '=');
$ipl->filterBylevel($q[3],'=');

По параметру "Германия" мне вместе с германией вываливается ещё и Чехия и Япония.... Как-то после такого не верится что это работает.
Такаяже история происходит, если делаю вызовы:
Код: Выделить всё
$ipl->filterByAttribute('origin',$q[0],'=');


По этому и спрашиваю про работу с русскими буквами.
Последний раз редактировалось iDom 20 ноя 2012, 19:45, всего редактировалось 1 раз.
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение iDom » 20 ноя 2012, 19:44 ,  »  Сообщение:#9

А то что моё решение корявое я и сам предполагаю, ибо такая сортировка массива довольно много времени занимает, на мой взгляд.
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение cmsservice » 21 ноя 2012, 12:25 ,  »  Сообщение:#10

iDom писал(а):По этому и спрашиваю про работу с русскими буквами.

Надо смотреть на базу данных и на то, какой запрос генерируется пейджлистом. Я полагаю, что если бы были проблемы с русскими буквами, то и Ваш вариант не работал бы.
С уважением, Константин
http://Переделка-сайтов.РФ
Индивидуальные решения на платформе Concrete5 для театров и производственно-торговых компаний.
Аватара пользователя
cmsservice
 
Сообщения: 763
Зарегистрирован: 10 окт 2010, 00:10
Откуда: Москва

Re: Поиск страниц по параметрам

Сообщение iDom » 21 ноя 2012, 15:00 ,  »  Сообщение:#11

cmsservice писал(а):
iDom писал(а):По этому и спрашиваю про работу с русскими буквами.

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

Спасибо. Посмотрим что к чему.
Интересует один момент.
Полагаю возможны вызовы функций типа
Код: Выделить всё
$pl->filterBy[%attribute_handle%]($value, $comparsion);

и обеспечены они с помощью метода __call() описанного в классе PageList. Так?
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение Count_Raven » 21 ноя 2012, 17:00 ,  »  Сообщение:#12

Да, такое возможно.
Чтобы отсортировать по атрибуту my_attribute можно использовать
Код: Выделить всё
filterByMyAttribute(123);


Подобное возможно и с пользователями.
Например, чтобы получить у пользователя значение атрибута postal_address можно воспользоваться методом getUserPostalAddress() у объекта пользователя.

Но этот метод ограничен тем, что ему нельзя указать comparison, а в случае с filterByAttribute можно сделать более гибкие конструкции, типа:
Код: Выделить всё
$pl->filterByAttribute('my_attribute', '%bla-bla%', 'LIKE');

или
Код: Выделить всё
$pl->filterByAttribute('my_attribute', '30', '>');


Впрочем, в 3-й параметр (comparison) можно вписать и более сложные SQL конструкции.
Country Amiant - Regno All Rianto
Аватара пользователя
Count_Raven
Супермодератор
 
Сообщения: 1156
Зарегистрирован: 06 окт 2010, 15:00
Откуда: Country Amiant

Re: Поиск страниц по параметрам

Сообщение Count_Raven » 21 ноя 2012, 17:07 ,  »  Сообщение:#13

Не, не слушайте меня =) с версии 5.3.3 все можно, т.е. comparison там есть. :D
Затупляю :roll:
Country Amiant - Regno All Rianto
Аватара пользователя
Count_Raven
Супермодератор
 
Сообщения: 1156
Зарегистрирован: 06 окт 2010, 15:00
Откуда: Country Amiant

Re: Поиск страниц по параметрам

Сообщение iDom » 21 ноя 2012, 22:05 ,  »  Сообщение:#14

Count_Raven писал(а):Да, такое возможно.
Чтобы отсортировать по атрибуту my_attribute можно использовать
Код: Выделить всё
filterByMyAttribute(123);


Подобное возможно и с пользователями.
Например, чтобы получить у пользователя значение атрибута postal_address можно воспользоваться методом getUserPostalAddress() у объекта пользователя.

Но этот метод ограничен тем, что ему нельзя указать comparison, а в случае с filterByAttribute можно сделать более гибкие конструкции, типа:
Код: Выделить всё
$pl->filterByAttribute('my_attribute', '%bla-bla%', 'LIKE');

или
Код: Выделить всё
$pl->filterByAttribute('my_attribute', '30', '>');


Впрочем, в 3-й параметр (comparison) можно вписать и более сложные SQL конструкции.

Чёрт возьми тогда какого ежа ничего не работает....

И да я ещё сума не сошёл, база в UTF-8
Принудительное кодирование страницы тоже UTF-8...
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

Re: Поиск страниц по параметрам

Сообщение iDom » 21 ноя 2012, 22:17 ,  »  Сообщение:#15

Можно ещё справку что вот этот участок кода делает?
Код: Выделить всё
      $aksearch = false;
      if (is_array($_REQUEST['akID'])) {
         Loader::model('attribute/categories/collection');
         foreach($_REQUEST['akID'] as $akID => $req) {
            $fak = CollectionAttributeKey::getByID($akID);
            if (is_object($fak)) {
               $type = $fak->getAttributeType();
               $cnt = $type->getController();
               $cnt->setAttributeKey($fak);
               $cnt->searchForm($ipl);
               $aksearch = true;
            }
         }
      }


На сколько я понял именно он и реализует поиск по параметрам по умолчанию... но как-то не работал он изначально...
iDom
 
Сообщения: 31
Зарегистрирован: 18 ноя 2012, 11:12

След.

Вернуться в Стандартные модули concrete5

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron