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

  • 0 Ответов
  • 228 Просмотров

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

*

voron121

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

Код: xml
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
<?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
<?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 ругается на множество не определенных переменных и на классы. Помогите плз разобраться - рыл интернет - не нашел ни одной доки или мана по этой теме - пришлось выкручиваться как смог - но не смог :(

ссылка на скрин с экрана  - результат отработки поиска  https://yadi.sk/i/YO2N2j4Ou3W6o