Многим владельцам сайтов хотелось бы организовать поиск по статьям с помощью технологии Ajax, чтобы при вводе фразы в поле поиска, результаты поиска выдавались без обновления страницы. Одним из вариантов решения данного вопроса является модуль поиска Rokajaxsearch от компании RocketTheme. Этот модуль использует стандартные плагины поиска Joomla, поэтому в результатах поиска Вы не увидите изображения статей и материалов. Предлагаю в этой статье разобрать вывод изображений в результатах поиска для компонента Mosets Tree, а также настроить связку Mosets Tree + Rokajaxsearch.
Пояснение: в статье рассматривается метод для Mosets Tree 3-ей версии.
Как это работает?
Выборка изображений
Для начала, нам необходимо сделать выборку изображения из базы данных. Если Вы установили на свой сайт компонент Mosets Tree, убедитесь, что с ним был установлен плагин поиска, обычно он поставляется в комплектации с компонентом.
Откройте файл /plugins/search/mtree/mtree.php и найдите блок кода:
# The main search query
if( $search_listing && !empty($where) && $limit > 0 ) {
$sql = 'SELECT DISTINCT l.link_id AS id, l.link_created AS created, l.link_name AS title, cl.cat_id,'
Из кода можно понять, какие поля берутся из базы данных для поиска. Здесь нам необходимо добавить выборку изображения:
# The main search query
if( $search_listing && !empty($where) && $limit > 0 ) {
$sql = 'SELECT DISTINCT l.link_id AS id, l.link_created AS created, l.link_name AS title, cl.cat_id, img.filename AS image,'
Важно указать, из какой таблицы мы выбираем изображение, для этого немного ниже найдите код с закрывающей скобкой:
$sql .= ")";
И добавьте следующий запрос:
$sql .= ", #__mt_images AS img)";
Но и это не всё. Необходимо задать условие сравнение, чтобы нами было получено изображение соответствующее ID материала. Не забываем, что у каждого материала может быть несколько изображений, поэтому мы возьмем первое из них. Чтобы добавить это условие, чуть ниже найдите блок:
$sql .= ' LEFT JOIN #__mt_cats AS c ON c.cat_id = cl.cat_id '
. ' WHERE '
. " link_published='1' AND link_approved='1' AND ( publish_up = ".$db->Quote($nullDate)." OR publish_up <= ".$db->Quote( $now->toSql() )." ) "
. " AND ( publish_down = ".$db->Quote($nullDate)." OR publish_down >= ".$db->Quote( $now->toSql() )." )"
. ' AND cl.link_id = l.link_id '
. ' AND cl.main = 1';
И замените его на следующий:
$sql .= ' LEFT JOIN #__mt_cats AS c ON c.cat_id = cl.cat_id '
. ' WHERE '
. " link_published='1' AND link_approved='1' AND ( publish_up = ".$db->Quote($nullDate)." OR publish_up <= ".$db->Quote( $now->toSql() )." ) "
. " AND ( publish_down = ".$db->Quote($nullDate)." OR publish_down >= ".$db->Quote( $now->toSql() )." )"
. ' AND cl.link_id = l.link_id '
. ' AND cl.main = 1'
. ' AND img.link_id = l.link_id AND img.ordering = 1';
Как видите, в конце мы просто добавили условие img.link_id = l.link_id для получения изображения соответствующего ID материала и img.ordering = 1 — для получения первого изображения.
Для большего понимания, ниже представлен уже полностью исправленный блок кода:
# The main search query
if( $search_listing && !empty($where) && $limit > 0 ) {
$sql = 'SELECT DISTINCT l.link_id AS id, l.link_created AS created, l.link_name AS title, cl.cat_id, img.filename AS image,'
. ' l.link_desc AS text, \'0\' AS browsernav, '
. " CONCAT('index.php?option=com_mtree&task=viewlink&link_id=',l.link_id,'&Itemid=".$Itemid."') AS href,"
. " IF(c.cat_id>0, CONCAT_WS('/', '" . $db->escape( JText::_('PLG_SEARCH_MTREE_DIRECTORY') ) . "', c.cat_name), '" . $db->escape( JText::_('PLG_SEARCH_MTREE_DIRECTORY') ) . "') AS section"
. ' FROM (#__mt_links AS l, #__mt_cl AS cl';
if($searchable_custom_fields_count > 0) {
$sql .= ", #__mt_customfields AS cf";
}
$sql .= ", #__mt_images AS img)";
if($searchable_custom_fields_count > 0) {
$sql .= ' LEFT JOIN #__mt_cfvalues AS cfv ON cfv.link_id = l.link_id AND cfv.cf_id = cf.cf_id';
}
$sql .= ' LEFT JOIN #__mt_cats AS c ON c.cat_id = cl.cat_id '
. ' WHERE '
. " link_published='1' AND link_approved='1' AND ( publish_up = ".$db->Quote($nullDate)." OR publish_up <= ".$db->Quote( $now->toSql() )." ) "
. " AND ( publish_down = ".$db->Quote($nullDate)." OR publish_down >= ".$db->Quote( $now->toSql() )." )"
. ' AND cl.link_id = l.link_id '
. ' AND cl.main = 1 '
. ' AND img.link_id = l.link_id AND img.ordering = 1';
$sql .= ' AND '.$where
. ' ORDER BY '
. $order;
$db->setQuery( $sql, 0, $limit );
$listings_result = $db->loadObjectList();
$limit -= count($listings_result);
} else {
$listings_result = array();
}
Правка шаблона результатов поиска
Итак, выборку мы сделали, теперь необходимо отобразить изображение на сайте. Учитывая, что модуль Rokajaxsearch использует стандартные возможности Joomla, нам необходимо отредактировать файл результатов поиска Joomla. Для этого откройте файл /components/com_search/views/search/tmpl/default_results.php (если у Вас уникальный шаблон, возможно файл будет располагаться по следующему пути /templates/ВАШ_ШАБЛОН/html/com_search/search/default_results.php). Для примера, предлагаю добавить вывод изображения рядом с текстом описания, для этого найдите следующие строки:
<dd class="result-text">
<?php echo $result->text; ?>
</dd>
И измените их на следующие:
<dd class="result-text">
<?php
if (isset($result->image) && $result->image != '') {
echo '<div style="text-align: center; margin-top: 10px;" ><img src="/media/com_mtree/images/listings/s/'. $result->image .'" alt="" /></div>';
}
?>
<?php echo $result->text; ?>
<?php if (isset($result->image) && $result->image != '') {
echo '<div style="clear:both"></div>';
} ?>
</dd>
Разберем, что мы сделали. До вывода текста описания мы выводим блок с изображением, с заданным выравниванием по левому краю, чтобы текст описания обтекал изображение справа. Учитывая, что в базе данных изображения к материалам в Mosets Tree хранятся в виде имен файлов, то мы также добавляем полный путь до самого изображения /media/com_mtree/images/listings/s/. s — на конце означает, что мы будем брать маленькое изображение (миниатюра), если Вам хочется выводить изображение большого формата, измените s на m. После вывода текста описания мы также добавляем блок с очисткой выравнивания. Это нужно, чтобы последующий текст не сбивался и не пытался также обтекать изображение. Не забудьте задать оптимальные размеры для изображения, иначе оформление может поломаться.
Последующее оформление — это лишь дело Вашей фантазии.
Что хотелось бы отметить еще по поводу связки Mosets Tree + Rokajaxsearch. Если Вы планируете в основном пользоваться поиском Mosets Tree, советую создать отдельный пункт меню (можно скрытый) с расширенным поиском этого компонента. После этого перейдите в менеджер модулей, откройте настройки модуля Rokajaxsearch и в поле Advanced Search page URL укажите путь к созданному Вами пункту меню. Теперь, если модуль не дал результатов поиска, он предложит ссылку на расширенный поиск. При переходе по ссылке Вы попадете на созданную Вами страницу.
И еще одно «НО». Учитывая, что модуль Rokajaxsearch использует возможности стандартного поиска Joomla, то при попытке просмотра всех результатов поиска Вы будете попадать на страницу поиска Joomla. Если Вас это не устраивает, и Вы хотели бы попадать на страницу поиска Mosets Tree, откройте файл /modules/mod_rokajaxsearch/tmpl/default.php и найдите строку:
<input type="hidden" name="option" value="com_search" />
и просто замените на следующую:
<input type="hidden" name="option" value="com_mtree" />
Вот и всё.
Комментарии
Здесь еще никто не оставлял комментарии.