Здравствуйте все!
Пишу свой модуль.
Состоит из 2х таблиц, 1 из них - таблица для фронтенда.
Хочу, чтобы стандартный поиск по сайту индексировал контент моего модуля.
Кто-нибудь сталкивался с подобной задачей?
я новичок в php и smarty и не совсем могу понять как работает модуль search.
нашёл вот такую статью:
http://forum.cmsmadesimple.org/index.php?topic=33025.0
там приводится вызов функции addwords - но там не прокомментировано толком инчего и параметры вызывают вопросы...
словом, если кто разбирался - сообщите свои соображения.
Модуль поиска: как проиндексировать контk
Re: Модуль поиска: как проиндексировать контk
API для модуля search. Объяснение на английском, так как копирую из своих "запасников"Eugene_K wrote: Пишу свой модуль.
Состоит из 2х таблиц, 1 из них - таблица для фронтенда.
Хочу, чтобы стандартный поиск по сайту индексировал контент моего модуля.
.....
словом, если кто разбирался - сообщите свои соображения.
1. Immediately after an entry relevant for search is added to the database (or updated in database!) in the custom module, do add search words for this entry to the standard Search module
Code: Select all
//Update search index
$module =& $this->GetModuleInstance('Search');
if ($module != FALSE)
{
$content = $field1. ' '. $field2;
$module->AddWords($this->GetName(), $id, 'mymodule', $content, NULL);
/**
* AddWords
* @module string name of used Search module, 'Search' by default for standard Search module
* @id integer id of the entry to build link to it from search result
* @attr string unique name of the custom module for the entry to build link to it from search results
* @content string any fields that contain text relevant for search
* @expires date if the content has to expire
*/
// AddWords($module = 'Search', $id = -1, $attr = '', $content = '', $expires = NULL)
}
Code: Select all
// delete from Search
$module =& $this->GetModuleInstance('Search');
if ($module != FALSE)
{
$module->DeleteWords($this->GetName(),$id, 'mymodule');
}
Code: Select all
function SearchResult($returnid, $entryid, $attr = '') {
if( $attr == 'mymodule' )
{
$db =& $this->GetDb();
$q = 'SELECT * FROM '.cms_db_prefix().'module_mytable
WHERE id = ?';
$row = $db->GetRow($q,array($entryid));
if( $row )
{
$result[0] = $this->GetFriendlyName(); // the prefix displayed in the list results
$result[1] = $row['field1']; // the title in the search results
// this should create a link from search result to the found entry
$result[2] = $this->CreateLink('cntnt01','default',$returnid,
$row['field1']);
}
}
return $result;
}
3. Add function SearchReindex that is called from standard Search module when search index is reindexed
Code: Select all
function SearchReindex(&$module) {
$db =& $this->GetDb();
$query = 'SELECT * FROM '.cms_db_prefix().'module_mytable';
$result =& $db->Execute($query);
while( $result && !$result->EOF )
{
$row =& $result->fields;
$module->AddWords($this->GetName(),$row['field1'],'mymodule',
$row['content']);
$result->MoveNext();
}
$result->Close();
}
Если кому не лень перевести это на русский, милости прошу, закину на cmsmadesimple.ru и добавлю Ваше честное имя с Вашей любимой ссылкой

Last edited by Sonya on Sun Aug 16, 2009 11:03 am, edited 1 time in total.
Re: Модуль поиска: как проиндексировать контk
Спасибо Соня, что отозвались на мой вопрос.
Буду реализовывать. Как только сделаю - напишу перевод текста, который вы выложили и выложу сюда же.
Спасибо!
Буду реализовывать. Как только сделаю - напишу перевод текста, который вы выложили и выложу сюда же.
Спасибо!
Re: Модуль поиска: как проиндексировать контk
Соня, и все, кто в теме.. буду очень признателен, если разъясните..
########### Вопрос номер Раз:
$content = $field1. ' '. $field2;
не понмаю что должнобыть $field1 и $field2 ?
Инструкция:
1. Сразу после того, как запись, относящаяся к поиску, добавлена в базу данных (или обновлена в базе данных!) в вашем собственном модуле, вызовите функцию AddWords стандартного модуля Поиска для этой записи.
Правильно?.. Но всё равно полного понимания где именно в своём модуле я должен вызвать AddWords - нет. Я вызываю её после того, как отобразил контент, а именно, у меня выглядит так:
Идём дальше.
Немедленно сразу после того, как запись удалена из вашего модуля, удалите её из модуля Поиска.
Хм. т.е. код я должен разместить в своём модуле там, где присутствует удаление контента (если присутствует). Так я понял?
Если да - то пока пропускаю и не использую эту штуку.
Таким образом, я ввёл у себя следующее:
далее вы пишите:
Хм. Не совсем понятно кто и что должен делать потом с этим $result - Search сам делает с ним что-то?
В файле Search.module.php я не нашёл вызова функции SearchResult, в файле action.dosearch.php нашёл вот это:
Но это тоже не очень прояснило ситуацию мне...
Ладно, закрыл пока на это непонимание глаза, иду дальше:
Хорошо, добавляю эту функцию:
########### Вопрос номер Два:
в Search.module.php вижу следующее:
Это наводит на мысль, что надо использовать параметр modules, при вызове модуля Search. Делаю так:
Словом, непонмание ещё осталось, а в связи с этим, результат поиска по моему контенту, конечно, нулевой.
Если можете направить мысль в нужную сторону - буду премного благодарен.
Спасибо всем, кто хотя бы дочитал до сюда.
########### Вопрос номер Раз:
$content = $field1. ' '. $field2;
не понмаю что должнобыть $field1 и $field2 ?
Инструкция:
т.е. вот как я перевёл это для себя:1. Immediately after an entry relevant for search is added to the database (or updated in database!) in the custom module, do add search words for this entry to the standard Search module
1. Сразу после того, как запись, относящаяся к поиску, добавлена в базу данных (или обновлена в базе данных!) в вашем собственном модуле, вызовите функцию AddWords стандартного модуля Поиска для этой записи.
Правильно?.. Но всё равно полного понимания где именно в своём модуле я должен вызвать AddWords - нет. Я вызываю её после того, как отобразил контент, а именно, у меня выглядит так:
Code: Select all
DisplayStarsTable($identity, $query1); //Вызываю функцию, отображающую контент
//Update search index
$module =& $this->GetModuleInstance('Search');
if ($module != FALSE)
{
$content = $field1. ' '. $field2;
$module->AddWords($this->GetName(), $id, 'starsshop', $content, NULL);
}
Перевожу:1a. Immediately after entry is deleted from custom module, delete it from Search module as well
Немедленно сразу после того, как запись удалена из вашего модуля, удалите её из модуля Поиска.
Хм. т.е. код я должен разместить в своём модуле там, где присутствует удаление контента (если присутствует). Так я понял?
Если да - то пока пропускаю и не использую эту штуку.
Добавьте API функцию в ваш модуль (вашеимяфайла.module.php). Эта АПИ функция вызывается модулем Поиска для того, чтобы показать результаты поиска.2. Add API function to Mymodule.module.php that is called from standatd Search module to display search results
Таким образом, я ввёл у себя следующее:
Code: Select all
function SearchResult($returnid, $entryid, $attr = '') {
if( $attr == 'starsshop' )
{
$db =& $this->GetDb();
$q = 'SELECT * FROM '.cms_db_prefix().'module_starsshop_products
WHERE id = ?';
$row = $db->GetRow($q,array($entryid));
if( $row )
{
$result[0] = $this->GetFriendlyName(); // the prefix displayed in the list results
$result[1] = $row['field1']; // the title in the search results
// this should create a link from search result to the found entry
$result[2] = $this->CreateLink('cntnt01','default',$returnid,
$row['field1']);
}
}
return $result;
}
далее вы пишите:
Т.е. Эта функция должна вернуть array $result (как показано выше).This function should return $result as Array as shown above.
Хм. Не совсем понятно кто и что должен делать потом с этим $result - Search сам делает с ним что-то?
В файле Search.module.php я не нашёл вызова функции SearchResult, в файле action.dosearch.php нашёл вот это:
Code: Select all
$searchresult = $moduleobj->SearchResult( $returnid,
$result->fields['content_id'],
$result->fields['extra_attr']);
Ладно, закрыл пока на это непонимание глаза, иду дальше:
Добавьте функцию SearchReindex, которая вызывается из стандартного модуля Поиска, когда поисковый индекс реиндексируется.
3. Add function SearchReindex that is called from standard Search module when search index is reindexed
Хорошо, добавляю эту функцию:
в связи с нейfunction SearchReindex(&$module) {
$db =& $this->GetDb();
$query = 'SELECT * FROM '.cms_db_prefix().'module_starsshop_products';
$result =& $db->Execute($query);
while( $result && !$result->EOF )
{
$row =& $result->fields;
$module->AddWords($this->GetName(),$row['field1'],'starsshop',
$row['content']);
$result->MoveNext();
}
$result->Close();
}
########### Вопрос номер Два:
в Search.module.php вижу следующее:
Code: Select all
if (method_exists($gCms->modules[$key]['object'], 'SearchReindex'))
{
$gCms->modules[$key]['object']->SearchReindex($this);
}
Правильно, или нет?..{search lang='ru_RU' searchtext='Введите текст' modules='starsshop, search'}
Словом, непонмание ещё осталось, а в связи с этим, результат поиска по моему контенту, конечно, нулевой.
Если можете направить мысль в нужную сторону - буду премного благодарен.
Спасибо всем, кто хотя бы дочитал до сюда.

Re: Модуль поиска: как проиндексировать контk
Поле (или поля) в которых находится текст, который релевантен для поиска. Допустим, title и content записи в модуле.Eugene_K wrote: ########### Вопрос номер Раз:
$content = $field1. ' '. $field2;
не понмаю что должнобыть $field1 и $field2 ?
Отображение контента не играет никакой роли. В инструкции стоит, сразу же после того, как запись добавлена в базу данных (INSERT) или изменена в базе данных (UPDATE).Eugene_K wrote: Но всё равно полного понимания где именно в своём модуле я должен вызвать AddWords - нет. Я вызываю её после того, как отобразил контент
Да, сам. На то это и API, чтобы не лазить в другие модулиEugene_K wrote: Хм. Не совсем понятно кто и что должен делать потом с этим $result - Search сам делает с ним что-то?

Мысль неверная, функция используется только для переиндексации поиска и к самому поиску отношения не имеет.Eugene_K wrote: ########### Вопрос номер Два:
в Search.module.php вижу следующее:Это наводит на мысль, что надо использовать параметр modules, при вызове модуля Search:Code: Select all
if (method_exists($gCms->modules[$key]['object'], 'SearchReindex')) { $gCms->modules[$key]['object']->SearchReindex($this); }