Урок. Расширяем функционал компонента ПОИСК. Вывод изображений

+38
2.85K
Долго отсутствовал, точнее не имел возможности. Поэтому рад снова вернуться к Вам!
И так, этот пост о доработке поиска. А именно — мы добавим вывод изображения.

Приступим.
Шаг 1. База данных.
Для начала мы добавим новое поле imageurl в таблицу cms_search:
Используем phpmyadmin. Выполняем SQL запрос в базу данных:
  1. ALTER TABLE `cms_search` ADD `imageurl` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ;
Шаг 2. Работа с компонентом "поиск".
2.1 Функция в модели.
Файл:
components/search/model.php
Заменяем:
  1. private $default_array_result = array('session_id'=>'','pubdate'=>'','title'=>'','description'=>'','link'=>'','place'=>'','placelink'=>'');
На:
  1. private $default_array_result = array('session_id'=>'','pubdate'=>'','title'=>'','description'=>'','link'=>'','place'=>'','placelink'=>'','imageurl'=>'');
Заменяем:
  1. $sql = "SELECT pubdate, title, description, link, place, placelink
На:
  1. $sql = "SELECT pubdate, title, description, link, place, placelink, imageurl
2.2 Шаблон.
Файл: templates/ваш шаблон/components/com_search_text.tpl
Вывод изображения в поиске. Тут уж каждый сам под себя делает.
Выводим изображение вот так:
  1. <img src="{$item.imageurl}">
Пример.
Добавил в стили для выравнивания изображения:
  1. .search_result_img{
  2. float:left; /* Выравнивание по левому краю */
  3. margin: 5px 10px 3px 0; /* Отступы вокруг картинки */
  4. }
В файле templates/ваш шаблон/components/com_search_text.tpl
Заменил:
  1.  
  2. {if $item.description}
  3. <p>{$item.description}</p>
  4. {/if}
  5.  
На:
  1.  
  2. <p>
  3. {if $item.imageurl}
  4. <img src="{$item.imageurl}" width="75" class="search_result_img">
  5. {/if}
  6. {if $item.description}
  7. {$item.description}
  8. {/if}
  9. </p>
  10.  
Заметьте, указана ширина 75.

Шаг 3. Работа с компонентами.
Поиск по контенту компонентов разный, но все просто.

Мы будем править файл psearch.php, который находится в папке components/название компонента.
В этом файле мы внесем 2 изменения:
1. Добавим поле изображения в SQL запрос;
2. В результатах добавим вывод ссылки на изображение;

Приведу 2 примера т.к. в статьях мы сделаем немного иначе.
Первым примером послужит компонент Галерея. Поэтому открываем файл components/photos/psearch.php
Видим запрос
  1. $sql = "SELECT f.*, a.title as cat, a.id as cat_id
  2. FROM cms_photo_files f
  3.  
Т.к. селектим всё с cms_photo_files — изменения не вносим.
Теперь выводим ссылку на изображение.
Посмотрим бд cms_photo_files через phpmyadmin
Иллюстрация
Скриншот №1
Название изображений сохраняются в поле file
Но одного названия для ссылки мало. Нам нужен ещё путь к изображению.
Идем примитивным методом, чтобы "чайник" (не сочтите за оскорбление) сумел разобраться.
Иллюстрация
Скриншот №2
Мы копировали ссылку подобного вида:
www.сайт.ru/images/photos/small/38fde6623d0ad43c79c4d90a88a07009.jpg
Разбор:
38fde6623d0ad43c79c4d90a88a07009.jpg — название изображения;
/images/photos/small/ — путь к изображению;
Ближе к делу. В этом же файле (components/photos/psearch.php)
После:
  1.  
  2. $result_array['session_id'] = session_id();
  3.  
Вставим:
  1.  
  2. $result_array['imageurl'] = "/images/photos/small/".$item['file'];
  3.  
Если непонятно — мы задали переменной $result_array['imageurl'] значение "путь+название".

Пример 2. Изображения статей. Файл components/content/psearch.php
Также как и в первом примере, в SQL запросе "сдираются" все поля, и поэтому первое действие нам не нужно.
Второе действие. Почему я и привожу дополнительный пример:
В базе данных cms_content нет поля с названием изображения. Если посмотреть ссылку изображения статьи (скриншот №2), то она будет выглядеть так:
www.сайт.ru/images/photos/small/article32.jpg
Название изображения формируется так: articleID.jpg
После:
  1.  
  2. $result_array['session_id'] = session_id();
  3.  
Вставим:
  1.  
  2. $result_array['imageurl'] = (file_exists(PATH.'/images/photos/small/article'.$item['id'].'.jpg') ? '/images/photos/small/article'.$item['id'].'.jpg' : '')
  3.  
Если изображения нет, то не выводим. Кто захочет, может прикрутить "нет изображения". Хотя я не вижу в этом смысла.

Готово. Получится вот так:
Иллюстрация
Это урок, а не готовые решения под каждый компонент, включая премиум-компоненты. На основе примеров, мы сможете использовать этот хак для поиска материалов с возможностью вывода изображений в других коробочных, а также своих компонентах.
Хотя, если статья многим покажется непонятно, то возможно выложу готовые решения для компонентов.

Спасибо за внимание!
+4
WALTERZ WALTERZ 9 лет назад #
Писалось под 1.10.4. Не смотрел изменения в компоненте поиска, но думаю, что подойдет для 1.10.*.
По массовому требованию - объясню как проделать с другими версиями.

ВАЖНО!
Попробуйте кто-нибудь и отпишитесь, пожалуйста. Я сначала дорабатывал на локалке, потом уже подробно всё расписывал. Может что упустил, или ещё чего.
0
Def Def 9 лет назад #
попробовал прикрутить к шопу, на 1.10.3, но не покаывает картинку:(

может чуток поиск изменен в 1.10.4?
+2
WALTERZ WALTERZ 9 лет назад #
Может вставили не то. Дайте ссылку на сайт в лс.
+3
WALTERZ WALTERZ 9 лет назад #
Посмотрел дистрибутив 1.10 - там всё тоже самое. Так что подойдет для любой версии для ветки 1.10
Жду ссылку, помогу адаптировать для шопа.
0
Def Def 9 лет назад #
в поиске шопа нет строк содержащих $result_array['session_id'] = session_id();
0
Art Freetmen Art Freetmen 9 лет назад #
Спасибо за урок! В поиске по статьям работает! v
Но, как можно прикрутить к поиску в каталоге? Как только не пытался, не получается.. sad
Пробовал такое:
Код PHP:
  1. $result_array['imageurl'] = (file_exists(PATH.'/images/catalog/small/'.$item['id'].'.jpg') ? '/images/catalog/small/'.$item['id'].'.jpg' : '');
такое
Код PHP:
  1. $result_array['imageurl'] = "/images/catalog/small/".$item['file'];
и даже такое
Код PHP:
  1. public function getItemImageUrl($id){
  2. $imageurl = $this->inDB->get_field('cms_uc_items', "id={$id}", 'imageurl');
  3. $imageurl = cmsCore::callEvent('GET_CATALOG_ITEM_IMAGE', $imageurl);
  4. return $imageurl;
  5. }
  6. ...
  7. $result_array['imageurl'] = "/images/catalog/small/"$this->getItemImageUrl($item['id']);
Ничего не сработало..
Правился файл /components/catalog/psearch.php Может нужно что-то еще подправить?
+2
WALTERZ WALTERZ 9 лет назад #
Для УК делается также как и с галереей.
Смотрим БД. cms_uc_items. Там видим поле imageurl. Соответственно в файл psearch.php ставьте:
Код PHP:
  1. $result_array['imageurl'] = "/images/photos/small/".$item['imageurl'];
+2
WALTERZ WALTERZ 9 лет назад #
Ой, путь то к файлам там другой.
Вот так надо:
Код PHP:
  1. $result_array['imageurl'] = "/images/catalog/small/".$item['imageurl'];
+1
Art Freetmen Art Freetmen 9 лет назад #
Ура! Работает! Спасибо! dance
0
Александр Александр 9 лет назад #
+++ спасибо огромное надо попробовать, а ваше по дефулту надо такое)) будет более четкий поиск красочный)))
+3
Крот Крот 9 лет назад #
Плюсанул, сам делал недавно такое товарищу
Эту фичу надо бы в дистрибутив
+3
Fuze Fuze 9 лет назад #
Эту фичу надо бы в дистрибутив
Нет проблем http://trac.instantcms.ru/changeset/1429

Поддержка картинок во всех компонентах, где таковые могут встречаться, включая блоги и посты на форуме.
Модуль блогов, выводящий посты с картинками в них так же будет в дистрибутиве.
0
Fuze Fuze 9 лет назад #
p.s. друзья, ну потратьте на две минуты больше при написании поста, сделайте форматирование участков кода, подсветку кода согласно языка программирования и т.п. хожу за всеми, красивости навожу smile
+1
WALTERZ WALTERZ 9 лет назад #
Отлично, благодарен
0
Sergon Sergon 9 лет назад #
урок полезный, вот только не могу справиться с блогом, доской объявлений, в клубах картинку клуба, мапс. Использую 1.10.3 версию инстанта. WAERZ если возможно может пробежимся по этим компонентам?
+1
WALTERZ WALTERZ 9 лет назад #
В лс
+2
WALTERZ WALTERZ 9 лет назад #
Хотя другим тоже может заинтересовать. Поддержка других компонентов написана тут: http://trac.instantcms.ru/changeset/1429
Чтобы поиск выдавал клубы и их изображения - сначала проделайте это http://instantcms.ru/blogs/mo-vlozhenie/dorabotka-poisk-klubov.html
Потом следует инструкции этой темы

Еще от автора

Баг с регистрацией нового пользователя. Исправляем
И снова здравствуй, дорогое сообщество! Собственно хотел помочь человеку в теме http://instantcms.ru/forum/thread14031-1.
Доработка. Поиск клубов
И снова привет, дорогое сообщество! Писали, что поиск клубов не работает. Взглянул. Оказалось, что поисковик ищет лишь фотографии и блоги клубов.
Скроллер контента на InstantCMS 1.10 (UTF-8)
Скроллер контента из определенной категории под версию InstantCMS 1.10.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.