Автоматическое составление сложных запросов в mapper`ах

Этот пост — совет/подсказка разработчикам, которые трудятся над модулями во имя развития проекта :)

Суть проблемы.

Работая над модулем «Объявления» я столкнулся с необходимостью сделать достаточно сложный запрос к базе данных. Сложный не в плане SQL, а в том, что мы заранее не знаем каким он получиться. Такая ситуация возникла при создании пользовательского фильтра.

Технически задача заключается в следующем — есть три таблицы: объявления, категории объявлений — отсюда мы получаем название категории, пользователи — отсюда мы «дергаем» логин пользователя. Необходимо реализовать выборку по следующим условиям:
— категория или массив категорий (дочерние),
— ID пользователя или логин,
— статус (опубликовано или нет — для администратора),
— актуально объявление или нет,
— минимальная и/или максимальная цена,
— есть привилегии или нет,
Учесть при этом составную сортировку (по одному или двум полям), а также не забывать, что результат фильтрации нужно показывать с разбивкой на страницы. Сложности в это все добавляет то, что логин пользователя тянется из другой таблицы, поэтому необходимо использовать HAVING, а не WHERE.

Решение проблемы.

Читать дальше →

Строгий и нестрогий поиск в модуле MySearch и прочие нюансы

Вообще про модуль MySearch можно читать здесь: livestreet.ru/blog/addons/2221.html

В поиске можно задавать слова, содержащие буквы (практически любых алфавитов), цифры, знак подчеркивания, знак минус и точку. Поиск идет без учета регистра, т.е. «дом», «Дом» и «ДОМ» воспринимаются одинаково. По умолчанию поиск идет по тексту и по атрибутам тегов <a ...>, <img ...>, <object ...>, <param ...>, <embed ...>. Т.е., если вы задали поиск по слову «дом», а в атрибутах изображения (тег <img ...>) стоит title=«мой дом», то топик с этим изображением тоже попадет в результаты поиска.

Если задано несколько слов, то ищется по схеме ИЛИ, т.е. в результаты поиска попадают тексты, содержащие любое из заданных слов.

С целью экономии ресурсов поиск по топикам и по комментариям идет отдельно. Т.е. если вы на вкладке «Топики», то поиск будет идти только по топикам, если на вкладке «Комментарии», то поиск только по комментариям. По умолчанию поиск идет по топикам.

Теперь я объясню немного про два режима поиска.

1) Нестрогий поиск
Он был сделан изначально. Работает так: если вы указали в строке поиска слово «дом», то будут искаться все слова, в которых встречается это сочетание букв: «дом», «дома», «рядом», «домовой» и т.д.

2) Строгий поиск
Допускает использование символа «звездочка».
В этом режиме, если задать поиск по слову «дом», то модуль будет искать именно это слово, и проигнорирует такие слова, как «дома» и «задом», и т.д.

А вот запросу «дом*» уже будут соответствовать слова «дома», «домовой» и т.д. Соотвественно запрос "*дом" найдет топики со словами «задом», «передом», а с запросом "*дом*" совпадет слово «рандомный».

Какой режим вам устанавливать у себя на сайте — смотрите сами. Переключение режимов — в файле config/modules/mysearch/config.php.

Чтобы задать «строгий» режим:
define('MYSEARCH_STRICT', true);

Нестрогий режим:
define('MYSEARCH_STRICT', false);


Результаты поиска выдаются по умолчанию в виде сниппетов — небольших текстовых блоков, содержащих фрагменты с искомыми словами. Число в фрагментов в одном сниппете (также, как и размер сниппетов) можно регулировать через параметры файла конфигурации config/modules/mysearch/config.php (там все подробно закомментирвано — разберетесь).

Планируется позже вывести настройки модуля в Админпанели, но пока так — кому надо, тот правит ручками в файле.

Модернизация модуля Message - жизнь после редиректа

Описание проблемы.

Создавая новый модуль или экшн, очень часто прибегаю к использованию сообщений Message_AddNotice() и Message_AddError(). Штука очень симпатичная и удобная. Но. Всегда есть одно но. И заключается оно в том, что модуль выводит сообщения только на «текущей» странице. Если же где-то в экшене выполняется редирект, то наше сообщение теряется.

Почему это неудобно? Давайте посмотрим конкретный пример. Я разрабатываю модуль «Гараж». По адресу /garage/user_login можно увидеть список машин пользователя, если просматривающий пользователь = текущему авторизированному, то у каждого автомобиля есть ссылка «Удалить». Эта ссылка указывает на /garage/user_login/del/car_id, где происходит обработка удаления. За это отвечает EventDeleteCar() и именно здесь удобно сказать пользователю «Парень, твоя машина успешно удалена», ну или «Сорри, не получается». Для этого используем стандартное Message_AddNotice(), Message_AddError().

Но, мы не можем оставить пользователя на этой страничке, и в конце реализации event`а перекидываем его назад к списку с помощью func_header_location(). И все. Никакого сообщения пользователь не увидит!

Идея решения.

В Zend Framework есть action-плагин FlashMessenger, который для тех же целей использует сессию. Мы поступим аналогично.


Читать дальше →

Подключение кастомных стилей и скриптов

Пример: сейчас в Админпанели много всего выводится на экран. Вывод надо как-то оформлять, и приходится либо в шаблоны встраивать объявления стилей, либо вообще инлайнить. Что совсем не есть гуд. Хотелось бы вынести все это хозяйство в отдельный файл и подключать на тех страницах, которые модуль выводит.

Например, так:

$this->Viewer_AddHeadCss('admin.css');// в заголовке хтмл-страницы будет подключен 
                                      // файл admin.css из активного скина - все пути и
                                      // оформление тега, как положено по спецификации,
                                      // Viewer задаст автоматом

$this->Viewer_AddHeadJs('admin.js'); // в заголовке хтмл-страницы будет подключен 
                                     // файл admin.js из активного скина

$this->Viewer_AddHead($text);      // в заголовок хтмл-страницы будет вставлен текст,
                                   // это может быть css-объявление, код javascript, 
                                   // ссылка на js-файл из гугловского репозиария и 
                                   // т.д. - т.е. любой текст; и тут, конечно, уже
                                   // правильность оформления тегов и проч. - на 
                                   // программере модуля

MySearch - простой поиск без Sphinx'а

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


Читать дальше →

Куда пропал модуль/хак генерации случайных аватарок?

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

Заранее спасибо.

Реализация кукисов

Как реализуются кукисы в LS в своих модулях???

Столкнулся с проблемой:
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\test1.ru\www\templates\compiled\%%F7^F7F^F7F34188%%header.tpl.php:8) in


Не работают кукисы в своих модулях. Как бороться?