Доброго времени суток! Пытаюсь решить вроде простецкую задачку, а знаний не хватает. Надеюсь кто подскажет как с ней быть. Суть в следующем : Написан компонент под j1.5 довольно давно, который содержит много таблиц в бд о товарах компаниях и т.д. , а поиск стандартный по компоненту не работает. Начал разбираться в том как написать плагин для апгрейда поиска. Ознакомился с событиями onSearch и onSearchAreas , постарался изучить стандартные поиски (по категориям, статьям, контактам ..) До конца не получается разобраться, упираюсь в ошибку
Warning: Invalid argument supplied for foreach() test/www/plugins/search/searchtiu.php on line 131, понимаю что возвращаемый объект не содержит чего то (массив rows). Сама таблица в которой надо вести поиск содержит такие столбцы: id, id_user ,id_cat_tovarov, id_company, value(так неудачно задано название товара), articul, cost, wholesale, published
К сожалению не получается дебагом пройтись по функции и посмотреть где что лежит(((((((((
Сам код плагина
//Определить registerEvent. Заменил "Tiu"
$mainframe->registerEvent( 'onSearch', 'plgSearchTiu' );
$mainframe->registerEvent( 'onSearchAreas', 'plgSearchTiuAreas' );
function &plgSearchTiuAreas()
{
static $areas = array(
'searchtiu' => 'Searchtiu'
);
return $areas;
}
function plgSearchTiu( $text, $phrase='', $ordering='', $areas=null )
{
$db =& JFactory::getDBO();
$user =& JFactory::getUser();
if (is_array( $areas )) {
if (!array_intersect( $areas, array_keys( plgSearchTiuAreas() ) )) {
return array();
}
}
$plugin =& JPluginHelper::getPlugin('search', 'searchtiu');
$pluginParams = new JParameter( $plugin->params );
$limit = $pluginParams->def( 'search_limit', 50 );
$text = trim( $text );
if ($text == '')
{
return array();
}
$wheres = array();
switch ($phrase) {
//Поиск точного
case 'exact':
$text = $db->Quote( '%'.$db->getEscaped( $text, true ).'%', false );
$wheres2 = array();
$wheres2[] = 'LOWER(a.value) 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->getEscaped( $word, true ).'%', false );
$wheres2 = array();
$wheres2[] = 'LOWER(a.value) LIKE '.$word;
$wheres[] = implode( ' OR ', $wheres2 );
}
$where = '(' . implode( ($phrase == 'all' ? ') AND (' : ') OR ('), $wheres ). ')';
break;
}
//упорядочение результатов
switch ( $ordering ) {
//алфавитный, по возрастанию
case 'alpha':
$order = 'a.value ASC';
break;
//сначала старые
case 'oldest':
//популярные первый
case 'popular':
//Сначала новые
case 'newest':
//Значение по умолчанию: алфавитный, по возрастанию
default:
$order = 'a.value ASC';
}
//заменить nameofplugin
$searchSearchtiu = JText::_( 'Searchtiu' );
//запрос к базе данных, отличается в ситуации! Это будет выглядеть примерно так:
$query = 'SELECT a.value AS title,'
. ' CONCAT_WS( " / ", '. $db->Quote($searchSearchtiu).', b.title )AS section,'
. ' "1" AS browsernav'
. ' FROM #__c_tovari AS a'
. ' WHERE ( '. $where .' )'
. ' AND a.published = 1'
. ' ORDER BY '. $order
;
//Установить запроса
$db->setQuery( $query, 0, $limit );
$rows = $db->loadObjectList();
//"Выход" из отображается ссылка
foreach($rows as $key => $row) {
$rows[$key]->href = '#';
}
//Вернуться результаты поиска в массиве
return $rows;
}