0 Пользователей и 1 Гость просматривают эту тему.
  • 8 Ответов
  • 2330 Просмотров
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Подскажите как доработать стандартный плагин, чтобы он передавал в результаты поиска поля "Категория", "Картинка".

В плагине:
Код
		if (!empty($items)) {

// set renderer
$renderer = $this->app->renderer->create('item')->addPath(array($this->app->path->path('component.site:'), $this->app->path->path('plugins:search/zoosearch/')));

foreach ($items as $item) {
$row = new stdClass();
$row->title = $item->name;
$row->text = $renderer->render('item.default', array('item' => $item));
$row->href = $this->app->route->item($item);
$row->created = $item->created;
$row->section = '';
$row->browsernav = 2;
$rows[] = $row;
}

беда в том, что все элементы плагин передаёт в одну текстовую переменную text (может не текстовую, я не знаток пхп).
А в переменной section передается пустое значение. Картинка отсутствует.
Я задал $row->section =  '--------' . $category->name;
Но в поисковой выдаче появляется только --------. Я также в шаблоне разместил элемент "Категория", она передается и выводится через текст, но так не совсем красиво, так как категорию нельзя будет отделить от содержимого текста и невозможно будет её оформить CSS. Нужно чтобы категория или элемент категории выводились отдельно.


Вывод поискового компонента Joomla components\com_search\views\search\tmpl\default_results.php:
Код
	<?php if ($result->section) : ?>
<dd class="result-category">
<span class="small<?php echo $this->pageclass_sfx; ?>">
(<?php echo $this->escape($result->section); ?>)
</span>
</dd>
<?php endif; ?>
<dd class="result-text">
<?php echo $result->text; ?>
</dd>

И как передать картинку? ! !
« Последнее редактирование: 10.01.2017, 15:20:39 от newvideo »
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #1 : 10.01.2017, 15:50:07 »
Вот что удалось сделать:

1. комментируем вывод секции в файле поискового компонента Joomla components\com_search\views\search\tmpl\default_results.php:
Код
<?php /*?>	<?php if ($result->section) : ?>
<dd class="result-category">
<span class="small<?php echo $this->pageclass_sfx; ?>">
(<?php echo $this->escape($result->section); ?>)
</span>
</dd>
<?php endif; ?><?php */?>

2. добавляем вывод секции в упрощенном виде (вывод секции выше по умолчанию выводит текст HTML с тэгами, а нам нужно чтобы красиво)
Код
	<dd class="result-text">
<?php echo 'text---------' . $result->text; ?>
 
это мы добавляем=  <?php echo $result->section; ?>
    
</dd>

3. В плагине plugins\search\zoosearch\zoosearch.php
Код
 закомментируем или удаляем  $row->text = $renderer->render('item.default', array('item' => $item));

ищем $row->section = '';
меняем на $row->section = $renderer->render('item.default', array('item' => $item));

так как вывод переменной section содержит различные элементы и слеплены друг за другом, то отображение красивого поиска зависит от порядка полей в шаблоне search. Если, например, картинка будет рядом с категорией, то они будут распологаться друг за другом в строчку, можно наверное отсечь с помошью CSS, но я просто поставил картинку вниз:



Теперь добавим CSS для маленьких картинок и цветов шрифтов:


Вот так передаются переменные в компонент:


Так выглядит итоговый вариант:


Конечно лучше если каждый элемент будет передаваться через переменную в компонент для более удобной верстки и оформления, но моих знаний в PHP недостаточно, поэтому такой вариант пока имеет место для жизни. Ещё недостаток: так как мы убрали переменную text, которая проходит через обработчик компонента, то теперь пропадает подсветка искомого слова.
« Последнее редактирование: 10.01.2017, 16:07:42 от newvideo »
*

shtier

  • Захожу иногда
  • 76
  • 6 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #2 : 10.01.2017, 16:39:20 »
Ни в коем случае не претендую на лучше решение!
default_results.php
Код
 ... 
<dl class="search-results<?php echo $this->pageclass_sfx; ?>">
<?php foreach ($this->results as $result) : ?>
<dt class="result-title">
<?php echo $this->pagination->limitstart + $result->count . '. ';?>
<?php if ($result->href) :?>
<a href="<?php echo JRoute::_($result->href); ?>"<?php if ($result->browsernav == 1) :?> target="_blank"<?php endif;?>>
<?php echo $this->escape($result->title);?>
</a>
<?php else:?>
<?php echo $this->escape($result->title);?>
<?php endif; ?>
</dt>
<?php if ($result->section) : ?>
<dd class="result-category">
<span class="small<?php echo $this->pageclass_sfx; ?>">
(<?php echo $result->section; ?>)
</span>
</dd>
<?php endif; ?>
<?php if ($result->image) : ?>
<dd class="result-image">
<?php echo $result->image; ?>
</dd>
<?php endif; ?>
<dd class="result-text">
<?php echo $result->text; ?>
</dd>
<?php if ($this->params->get('show_date')) : ?>
<dd class="result-created<?php echo $this->pageclass_sfx; ?>">
<?php echo JText::sprintf('JGLOBAL_CREATED_DATE_ON', $result->created); ?>
</dd>
<?php endif; ?>
<?php endforeach; ?>
</dl>
теперь про плагин
plugins\search\zoosearch\renderer\item
category.php
Код
...
// no direct access
defined('_JEXEC') or die('Restricted access');
echo $this->renderPosition('category');
default.php
Код
...
// no direct access
defined('_JEXEC') or die('Restricted access');
echo $this->renderPosition('description');
image.php
Код
...
// no direct access
defined('_JEXEC') or die('Restricted access');
echo $this->renderPosition('image');
positions.xml
Код
<?xml version="1.0" encoding="utf-8"?>
<renderer>
<positions layout="default">
<position name="description">Description</position>
</positions>
<positions layout="category">
<position name="category">Category</position>
</positions>
<positions layout="image">
<position name="image">Image</position>
</positions>
</renderer>
zoosearch.php
Код
...
$row = new stdClass();
$row->title = $item->name;
$row->text = $renderer->render('item.default', array('item' => $item));
$row->href = $this->app->route->item($item);
$row->created = $item->created;
// добавляем категорию
$row->section = $renderer->render('item.category', array('item' => $item));
// добавляем картинку
$row->image = $renderer->render('item.image', array('item' => $item));
$row->browsernav = 2;
$rows[] = $row;
...
Короче в итоге в админке будет не только default разметка в Search но и category, image. Сама верстка это все в default_results.php. Элементы добавлять в одноименные разметки по одной
по аналогии можно ещё что-нибудь добавить.  Чтобы всё это не затерлось - вносите изменения путем переопределений (override), а не напрямую
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #3 : 10.01.2017, 19:17:06 »
Цитировать
Короче в итоге в админке будет не только default разметка в Search но и category, image. Сама верстка это все в default_results.php. Элементы добавлять в одноименные разметки по одной
по аналогии можно ещё что-нибудь добавить.  Чтобы всё это не затерлось - вносите изменения путем переопределений (override), а не напрямую
Спасибо за подключение!
В итоге у меня выводится только первая запись в поиске как нужно, остальные выводятся без текста.

Удаляю строки в плагине
/*            $row->section = $renderer->render('item.category', array('item' => $item));*/
/*            $row->image = $renderer->render('item.image', array('item' => $item));*/

и текст появляется во всех найденных записях.

Переопределение - хорошее замечание, добавил для компонента, а вот для плагина что-то не работает, наверное не предусмотрено.
*

shtier

  • Захожу иногда
  • 76
  • 6 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #4 : 11.01.2017, 07:26:58 »
есть такое...
тогда вот так
Код
		// execute query
$items = $this->app->table->item->all(compact('select', 'from', 'conditions', 'order', 'limit'));

// create search result rows
$rows = array();
if (!empty($items)) {

foreach ($items as $item) {

$row = new stdClass();
$row->title = $item->name;
$row->text = $this->renderPos('item.default', $item);
$row->href = $this->app->route->item($item);
$row->created = $item->created;
$row->section = $this->renderPos('item.category', $item);
$row->image = $this->renderPos('item.image', $item);

$row->browsernav = 2;
$rows[] = $row;

}

}

return $rows;
}
public function renderPos($pos, $item) {
// set renderer
$renderer = $this->app->renderer->create('item')->addPath(array($this->app->path->path('component.site:'), $this->app->path->path('plugins:search/zoosearch/')));
$result = $renderer->render($pos, array('item' => $item));
return $result;
}
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #5 : 11.01.2017, 12:40:51 »
Fatal error: Call to undefined function renderPos()
*

shtier

  • Захожу иногда
  • 76
  • 6 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #6 : 11.01.2017, 12:48:06 »
Fatal error: Call to undefined function renderPos()
так вы эту функцию добавьте, я ведь её в примере (выше) привел
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #7 : 11.01.2017, 17:06:43 »
так вы эту функцию добавьте, я ведь её в примере (выше) привел

Да, точно, я чёт подумал, что чего-то не хватает))))
Спасибо! Отличное решение!
Вот так вот в итоге получилось:
*

newvideo

  • Захожу иногда
  • 194
  • 2 / 0
Re: Плагин поиска ZooSearch. Доработка
« Ответ #8 : 11.01.2017, 17:34:11 »
Если сможете разобраться в проблеме смарт поиска, то было бы здорово http://joomlaforum.ru/index.php/topic,334259.0.html
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться