HOOK fulltext_search - Как объединить результаты поиска?

InstantCMS 2.X
#1 6 марта 2017 в 18:19
fulltext_search — HOOK позволяющий подключить поиск к своему компоненту.

Поиск ведется по указанной таблице БД и указанным полям.
А как провести поиск по нескольким таблицам сразу?

Так если данные компонента размещены в трех таблицах то и поиск выводить в трех разделах поиска по каждой таблице? Как можно объединить?
#2 6 марта 2017 в 18:45
Join?
#3 6 марта 2017 в 18:48

Join?

Ris
С хуком работали? Там не запросы в БД присутствуют, а указываются таблицы и столбцы, который в последующем обрабатываются компонентом search
#4 6 марта 2017 в 19:03
Kreator, в моей версии форума есть пример по поиску в двух таблицах. Как добавить третью таблицу, думаю сообразите.
#5 6 марта 2017 в 19:34

в моей версии форума есть пример по поиску в двух таблицах

Loadырь
поправьте плиз. это выходит если на сайте у вас что-то попытаться поискать

#6 6 марта 2017 в 19:40
Kreator,
Вот содержимое хука из форума от Loadырь

  1. <?php
  2.  
  3. class onForumFulltextSearch extends cmsAction {
  4.  
  5. public function run(){
  6.  
  7. $sources = array(
  8. 'threads' => LANG_FORUM_THREADS_ON_FORUM,
  9. 'posts' => LANG_FORUM_POSTS_ON_FORUM
  10. );
  11.  
  12. $table_names = array(
  13. 'threads' => 'forum_threads',
  14. 'posts' => 'forum_posts'
  15. );
  16.  
  17. $match_fields = array(
  18. 'threads' => array('title', 'description'),
  19. 'posts' => array('content_html')
  20. );
  21.  
  22. $select_fields = array(
  23. 'threads' => array('id', 'slug', 'title', 'description', 'date_pub'),
  24. 'posts' => array('id', 'thread_id', 'content_html', 'date_pub')
  25. );
  26.  
  27. $filters = array(
  28. 'threads' => array(),
  29. 'posts' => array()
  30. );
  31.  
  32. $forum_model = $this->model;
  33.  
  34. return array(
  35. 'name' => $this->name,
  36. 'sources' => $sources,
  37. 'table_names' => $table_names,
  38. 'match_fields' => $match_fields,
  39. 'select_fields' => $select_fields,
  40. 'filters' => $filters,
  41. 'item_callback' => function($item, $model, $sources_name, $match_fields, $select_fields) use ($forum_model){
  42. if ($sources_name == 'threads'){
  43.  
  44. return array_merge($item, array(
  45. 'url' => href_to('forum', 'tfind', array($item['id'])),
  46. 'title' => $item['title'],
  47. 'fields' => array($item['description']),
  48. 'date_pub' => $item['date_pub'],
  49. 'image' => ''
  50. ));
  51.  
  52. } else {
  53.  
  54. $thread = $forum_model->getThread($item['thread_id']);
  55.  
  56. // скрытый текст
  57. if(!empty($this->options['hidetext_enable'])){
  58.  
  59. $hidetext = cmsCore::isControllerExists('hidetext') ?
  60. cmsCore::getController('hidetext') :
  61. false;
  62.  
  63. if ($hidetext && !empty($item['content_html'])){
  64. $item['content_html'] = $hidetext->parseHide($item['content_html']);
  65. }
  66. }
  67.  
  68. return array_merge($item, array(
  69. 'url' => href_to('forum', 'pfind', array($item['id'])),
  70. 'title' => $thread['title'],
  71. 'fields' => array($item['content_html']),
  72. 'date_pub' => $item['date_pub'],
  73. 'image' => ''
  74. ));
  75. }
  76. }
  77. );
  78. }
  79. }
#7 6 марта 2017 в 19:46

пример по поиску в двух таблицах

Loadырь
Да, такой поиск уже давно работает в моем форуме. Но при таком раскладе в результатах поиска появляются 2 вкладки отдельно: темы форума и сообщения форума. А вот хочу чтобы это было одним списком. Не реально?
#9 6 марта 2017 в 23:30
А если всё это выводить одной пачкой? Нет thread_id — значит item — тема и выводим сам item. Нет контента — выводим дескрипшн.

  1.  
  2. if (!empty($item['thread_id'])) {$thread = $forum_model->getThread($item['thread_id']);}
  3. else {$thread = $item;}
  4.  
  5. if (empty($item['content_html'])) {$item['content_html'] = $item['description'];}
  6.  
  7. // скрытый текст
  8. if(!empty($this->options['hidetext_enable'])){
  9.  
  10. $hidetext = cmsCore::isControllerExists('hidetext') ?
  11. cmsCore::getController('hidetext') :
  12. false;
  13.  
  14. if ($hidetext && !empty($item['content_html'])){
  15. $item['content_html'] = $hidetext->parseHide($item['content_html']);
  16. }
  17. }
  18.  
  19. return array_merge($item, array(
  20. 'url' => href_to('forum', 'pfind', array($item['id'])),
  21. 'title' => $thread['title'],
  22. 'fields' => array($item['content_html']),
  23. 'date_pub' => $item['date_pub'],
  24. 'image' => ''
  25. ));
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.