Форум русской поддержки Joomla!® CMS
07.12.2016, 22:24:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Как добавить свой компонент в поиск Joomla! 3?

 (Прочитано 88 раз)
0 Пользователей и 1 Гость смотрят эту тему.
voron121
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Пол: Мужской
Сообщений: 174


Метод тыка и мата помогает в кодинге


« : 08.08.2016, 20:55:11 »

Доброго времени суток уважаемые форумчане. Есть вопрос с решением которого бьюсь четвертый день. Инфы в сети не смог найти прошу помощи у вас. Суть такова : есть самописный компонент который пишет в БД туристические путевки. Грубо говоря так же как и статьи за исключением того что нет категорий. Просто запись в бд.
Пытаюсь заставить стандартный механизм Joomla понимать что есть в моем компоненте и выдавать результаты в поиске. По аналогии с контентом решил взять стандартный плагин для поиска контента и немного изменить под себя. Что получилось - при запросе в поиске название путевки (тура) результат есть но с ошибками :

Код
1. Notice: Undefined property: stdClass::$browsernav in /home/voron121/vv.dp.ua/t3/components/com_search/views/search/tmpl/default_results.php on line 18
> 797987987
 
Notice: Undefined property: stdClass::$section in /home/voron121/vv.dp.ua/t3/components/com_search/views/search/tmpl/default_results.php on line 25
Создано
 

797987987 - это название записи в БД . Урл не простраивается - не могу вообще понять как задействован роутер в данном механизме. Текст описания тура так же не выводиться.

Что же я сделал :

Продублировал плагин поиска и переименовал его в tours.php
в tours.php изменил код на сл:
Код
<?php
/**
* @package     Joomla.Plugin
* @subpackage  Search.content
*
* @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
* @license     GNU General Public License version 2 or later; see LICENSE.txt
*/

 
defined('_JEXEC') or die;
 
/**
* Content search plugin.
*
* @since  1.6
*/

class PlgSearchTours extends JPlugin
{
/**
* Determine areas searchable by this plugin.
*
* @return  array  An array of search areas.
*
* @since   1.6
*/

public function onContentSearchAreas()
{
static $areas = array(
'tours' => 'tours'
);
 
return $areas;
}
 
/**
* Search content (articles).
* The SQL must return the following fields that are used in a common display
* routine: href, title, section, created, text, browsernav.
*
* @param   string  $text      Target search string.
* @param   string  $phrase    Matching option (possible values: exact|any|all).  Default is "any".
* @param   string  $ordering  Ordering option (possible values: newest|oldest|popular|alpha|category).  Default is "newest".
* @param   mixed   $areas     An array if the search it to be restricted to areas or null to search all areas.
*
* @return  array  Search results.
*
* @since   1.6
*/

public function onContentSearch($text, $phrase = '', $ordering = '', $areas = null)
{
$db = JFactory::getDbo();
$app = JFactory::getApplication();
$user = JFactory::getUser();
$groups = implode(',', $user->getAuthorisedViewLevels());
$tag = JFactory::getLanguage()->getTag();
 
require_once JPATH_SITE . '/components/com_tour/router.php';
require_once JPATH_ADMINISTRATOR . '/components/com_search/helpers/search.php';
 
$searchText = $text;
 
if (is_array($areas))
{
if (!array_intersect($areas, array_keys($this->onContentSearchAreas())))
{
return array();
}
}
 
$sContent = $this->params->get('search_content', 1);
$sArchived = $this->params->get('search_archived', 1);
$limit = $this->params->def('search_limit', 50);
 
$nullDate = $db->getNullDate();
$date = JFactory::getDate();
$now = $date->toSql();
 
$text = trim($text);
 
if ($text == '')
{
return array();
}
 
switch ($phrase)
{
case 'exact':
$text = $db->quote('%' . $db->escape($text, true). '%', false);
$wheres2 = array();
$wheres2[] = 'title LIKE ' . $text;
$wheres2[] = 'text LIKE ' . $text;
$where = '(' . implode(') OR (', $wheres2). ')';
break;
 
case 'all':
case 'any':
default:
$words = explode(' ', $text);
$wheres = array();
 
foreach ($words as $word)
{
$word = $db->quote('%' . $db->escape($word, true). '%', false);
$wheres2 = array();
$wheres2[] = 'LOWER(title) LIKE LOWER(' . $word . ')';
$wheres2[] = 'LOWER(text) LIKE LOWER(' . $word . ')';
$wheres[] = implode(' OR ', $wheres2);
}
 
$where = '(' . implode(($phrase == 'all' ? ') AND (' : ') OR ('), $wheres). ')';
break;
}
 
$rows = array();
$query = $db->getQuery(true);
 
// Search articles.
if ($sContent && $limit > 0)
{
$query->clear();
 
$query->select('title, language')
->from('#__tour')
->group('id')
->order('id DESC');
 
// Filter by language.
if ($app->isSite() && JLanguageMultilang::isEnabled())
{
$query->where('language in (' . $db->quote($tag). ',' . $db->quote('*'). ')');
}
 
$db->setQuery($query, 0, $limit);
try
{
$list = $db->loadObjectList();
}
catch (RuntimeException $e)
{
$list = array();
JFactory::getApplication()->enqueueMessage(JText::_('JERROR_AN_ERROR_HAS_OCCURRED'), 'error');
}
$limit -= count($list);
 
if (isset($list))
{
foreach ($list as $key => $item)
{
$list[$key]->href = TourHelperRoute::getTourRoute($item->language);
}
}
 
$rows[] = $list;
}
 
 
 
$results = array();
 
if (count($rows))
{
foreach ($rows as $row)
{
$new_row = array();
 
foreach ($row as $article)
{
if (SearchHelper::checkNoHtml($article, $searchText, array('text', 'title')))
{
$new_row[] = $article;
}
}
 
$results = array_merge($results, (array) $new_row);
}
}
 
return $results;
}
}
 
 

в файле с роутами своего компонента добавил абстрактный класс и метод для строения роута :

Код
<?php
defined('_JEXEC') or exit;
abstract class TourHelperRoute {
 
function TourBuildRoute(&$query) {
   $segments = array();
   if(isset($query['view']))
   {
       $segments[] = $query['view'];
       unset($query['view']);
   }
   if(isset($query['id']))
   {
       $segments[] = $query['id'];
       unset($query['id']);
   };
   return $segments;
}
 
 
function TourParseRoute( $segments ) {
   $vars = array();
   $count = count( $segments );
   if ( $count ) {
       $count--;
       $segment = array_shift( $segments );
       $vars['view'] = $segment;
   }
   if ( $count ) {
       $count--;
       $segment = array_shift( $segments );
       $vars['id'] = $segment;
   }
   return $vars;
}
 
   public static function getTourRoute( $segments ){
       if(isset($query['id'])){
           $id[] = $query['id'];
           unset($query['id']);
       };
       // Create the link
       $link = 'index.php?option=com_tour&view=item&id=' . $segment;
       return $link;
   }
}
?>
 

в итоге вроде бы результат в поиске есть но Joomla ругается на множество не определенных переменных и на классы. Помогите плз разобраться - рыл интернет - не нашел ни одной доки или мана по этой теме - пришлось выкручиваться как смог - но не смог Sad

ссылка на скрин с экрана  - результат отработки поиска  https://yadi.sk/i/YO2N2j4Ou3W6o
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet