2013-11-07 3 views
0

Я пишу плагин для моего компонента. Для этого компонента у меня есть таблица «#__radiocatalog_item» со столбцами id, name, description, и мне нужно искать в столбце name. Для этого я написал этот плагин:Плагин для интеллектуального поиска на Joomla: нет результатов

<?php 

defined('JPATH_BASE') or die; 

require_once JPATH_ADMINISTRATOR.'/components/com_finder/helpers/indexer/adapter.php'; 

class PlgFinderRadioitem extends FinderIndexerAdapter 
{ 
    protected $context = 'Radioitem'; 
    protected $extension = 'com_radiocatalog'; 
    protected $layout = 'item'; 
    protected $type_title = 'item'; 
    protected $table = '#__radiocatalog_item'; 
    protected $state_field = 'parent'; 
    protected $autoloadLanguage = true; 

    protected function setup() 
     { 
      return true; 
     } 


    public function onFinderDelete($context, $table) 
    { 
     if ($context == 'com_radiocatalog.item') 
     { 
     $id = $table->id; 
     } 
     elseif ($context == 'com_finder.index') 
     { 
     $id = $table->id; 
     } 
     else 
     { 
     return true; 
     } 

     return $this->remove($id); 
    } 

    public function onFinderChangeState($context, $pks, $value) 
    { 
     if ($context == 'com_radiocatalog.item') 
     { 
     $this->itemStateChange($pks, $value); 
     } 

     if ($context == 'com_plugins.plugin' && $value === 0) 
     { 
     $this->pluginDisable($pks); 
     } 
    } 

    protected function index(FinderIndexerResult $item, $format = 'html') 
    { 
     if (JComponentHelper::isEnabled($this->extension) == false) 
     { 
     return; 
     } 

     $item->url = $this->getURL($item->id, 'com_radiocatalog&layout=item', $this->layout); 
     $item->route = 'index.php?option=com_radiocatalog&view=item&layout=item&id='.$item->id; 
     $item->addTaxonomy('Type', 'Radioitems'); 
     $item->addTaxonomy('Language', $item->language); 
     $this->indexer->index($item);  
    } 

    protected function getListQuery($sql = null) 
    { 
     $db = JFactory::getDbo(); 
     $sql = $sql instanceof JDatabaseQuery ? $sql : $db->getQuery(true); 
     $sql->select('a.id as id, a.name as title, a.description as description'); 
     $sql->from('#__radiocatalog_item AS a'); 

     return $sql; 
    } 

    protected function getStateQuery() 
    { 
     $sql = $this->db->getQuery(true); 
     $sql->select($this->db->quoteName('a.id')); 
     $sql->select($this->db->quoteName('a.name').' as title'); 
     $sql->from($this->db->quoteName('#__radiocatalog_item') . ' AS a'); 
     return $sql; 
    } 
} 
?> 

После полной индексации поиск на сайте не работает.

+1

Два вопроса: 1. какая версия Joomla и 2. Что происходит после индексирования и поиска? Вы видите ошибки? – Craig

+0

Мне кажется, маловероятно, чтобы у вас было поле состояния с именем parent. – Elin

+0

@cppl 1. Joomla 3.2.0; 2. Нет видимых ошибок; – ftp27

ответ

2

Я боролся с той же проблемой. Поэтому я включил отладку Joomla {Global Configuration/System/Debug System = true} и попытался найти термин «myterm» с помощью модуля SmartSearch с открытым сайтом. Затем я проверил выполненные SQL-запросы. Во-первых, этот термин был найден:

SELECT t.term, t.term_id 
FROM j_finder_terms AS t 
WHERE t.term = 'myterm' 
AND t.phrase = 0 

с ID = 653 (используется позже):

SELECT l.link_id,m.weight AS ordering 
FROM `j_finder_links` AS l 
INNER JOIN `j_finder_links_terms2` AS m 
ON m.link_id = l.link_id 
WHERE l.access IN (1,1) 
AND l.state = 1 
AND (l.publish_start_date = '0000-00-00 00:00:00' OR l.publish_end_date <= '2014-01-04 17:34:00') 
AND (l.publish_end_date = '0000-00-00 00:00:00' OR l.publish_end_date >= '2014-01-04 17:34:00') 
AND m.term_id IN (653) 

Но этот запрос не возвращает никакого результата, потому что j_finder_links.access и j_finder_links.state значения были установите на 0 вместо 1.

Так что я предлагаю вам проверить запросы и если у вас есть та же проблема, попробуйте изменить запрос из метода getStateQuery() или выберите «1 AS access, 1 AS state» в getListQuery() и оставить переменную $ state_field unset.

Прошу прощения за неопределенное объяснение, я мало знаю о том, как работает SmartSearch, я просто пытаюсь заставить его работать каким-то образом с моим компонентом.

Смежные вопросы