Похожие в Универсальном каталоге (хак для 1.x)

1356
На одном из сайтов, где используется универсальный каталог для вывода различных товаров и тд,
появилась необходимость сделать вывод похожих при просмотре записи.

Необходимость этого очевидна - увеличивается глубина просмотра, удобство каталога
и как результат, увеличивается ПФ.

Штатными средствами инстанта, пока можно только организовать вывод модуля с
показом записей из выбранной рубрики, но это не всегда подходит.

Как работает:
- При формировании похожих записей в УК, учитывается их релевантность и список строится по убывающей.
- Записи берутся из той же рубрики в которой находится просматриваемая запись.
- Запись выводится с изображением и названием (при отсутствии изображения - заглушка)
- Поиск идет по словам из названия записи в соответствии с настройками.

Если при поиске похожих не нашлось, будет выведен случайный набор записей из той же рубрики.

Изменения необходимо сделать в 2 файлах:

в \components\catalog\frontend.php

найти строку (примерно 720я):

Код PHP:
  1. cmsPage::initTemplate('components', 'com_catalog_item')->
и сразу Перед ней добавить :

Код PHP:
  1.  
  2.  
  3.  
  4. ///////////////// //////////////////KS////////////////// ////////////////////
  5. ///////////////// Выдаем похожие записи из рубрики по релевантности ////////////////////
  6.  
  7. ///////// Настройки: ///////////
  8. $limits = 5; // - кол-во выводимых похожих записей
  9. $len = 3; // - минимальное кол-во букв в словах для поиска
  10. ////////////////////////////////
  11.  
  12. $ti = $item['title'];
  13. $query = '';
  14. $item['recomend'] = '';
  15. if (preg_match_all("/\b(\w+)\b/ui", $ti, $matches)) {
  16. foreach($matches[1] as $v) {
  17. if(strlen($v)>$len){$query .= $v.' ';}
  18. }
  19. }
  20.  
  21. $query = trim($query);
  22.  
  23. if ($query) {
  24.  
  25. $sql = "SELECT id, title, imageurl, price,
  26. MATCH (title) AGAINST ('$query' IN BOOLEAN MODE) as REL
  27. FROM cms_uc_items
  28. WHERE MATCH (title) AGAINST ('$query' IN BOOLEAN MODE)
  29. AND category_id = ".$item['category_id']." AND published=1 AND id != ".$item['id']."
  30. ORDER BY REL DESC LIMIT $limits";
  31. $catres1 = $inDB->query($sql);
  32.  
  33. if ($inDB->num_rows($catres1)>0){
  34. $item['recomend'] .= '
  35. <div class="ks1">Похожие в рубрике:</div>';
  36. while($cat_hom = $inDB->fetch_assoc($catres1)){
  37. $item['recomend'] .= '<div class="ks2">';
  38.  
  39. $item['recomend'] .= '<a href="/catalog/item'.$cat_hom['id'].'.html" title="'.$cat_hom['title'].'">
  40. (цена: '.(($cat_hom['price']) ? $cat_hom['price'] : 'не указана').') ';
  41.  
  42. if ($cat_hom['imageurl']){
  43. $item['recomend'] .= '<img src="/images/catalog/small/'.$cat_hom['imageurl'].'" alt="'.$cat_hom['title'].'">';
  44. } else {
  45. $item['recomend'] .= '<img src="/images/catalog/small/nopic.jpg" alt="'.$cat_hom['title'].'">';
  46. }
  47. $item['recomend'] .= $cat_hom['title'].'</a>';
  48. $item['recomend'] .= '</div>';
  49. }
  50. } else {
  51. $sql = "SELECT id, title, imageurl, price
  52. FROM cms_uc_items
  53. WHERE category_id = ".$item['category_id']."
  54. AND published=1 AND id != ".$item['id']."
  55. ORDER BY RAND()
  56. LIMIT $limits";
  57. $catres1 = $inDB->query($sql);
  58. if ($inDB->num_rows($catres1)>0){
  59. $item['recomend'] .= '
  60. <div class="ks1">Рекомендуем:</div>';
  61. while($cat_hom = $inDB->fetch_assoc($catres1)){
  62. $item['recomend'] .= '<div class="ks2">';
  63.  
  64. $item['recomend'] .= '<a href="/catalog/item'.$cat_hom['id'].'.html" title="'.$cat_hom['title'].'">
  65. (цена: '.(($cat_hom['price']) ? $cat_hom['price'] : 'не указана').') ';
  66.  
  67. if ($cat_hom['imageurl']){
  68. $item['recomend'] .= '<img src="/images/catalog/small/'.$cat_hom['imageurl'].'" alt="'.$cat_hom['title'].'">';
  69. } else {
  70. $item['recomend'] .= '<img src="/images/catalog/small/nopic.jpg" alt="'.$cat_hom['title'].'">';
  71. }
  72. $item['recomend'] .= $cat_hom['title'].'</a>';
  73. $item['recomend'] .= '</div>';
  74. }}}
  75.  
  76. }
  77.  
  78.  
  79. ///////////////// ////////////////////////////////////////////// ////////////////////
  80. ///////////////// ////////////////////////////////////////////// ////////////////////
  81.  
  82.  
  83.  
* в начале есть 2 простых настройки, это:
$limits = 5; // - кол-во выводимых похожих записей
$len = 3; // - минимальное кол-во букв в словах для поиска

далее открыть файл \templates\_default_\components\com_catalog_item.tpl

найти строку (в самом конце):
Код PHP:
  1. {$item.plugins_output_after}
и перед ней добавить:
Код PHP:
  1. {$item.recomend}
* {$item.recomend} - это сам блок с выводом похожих записей, его можно размещать
в шаблоне com_catalog_item.tpl в удобном месте.

Если все правки вносятся вручную, необходимо добавить стили в свой файл CSS:
Код PHP:
  1.  
  2. .ks1 {
  3. font-size:24px;
  4. padding-top:20px;
  5. }
  6. .ks2{
  7. display:block;
  8. width:120px;
  9. height:171px;
  10. float:left;
  11. overflow:hidden;
  12. font-size:12px;
  13. font-style:italic;
  14. }
  15. .ks2 img{
  16. width:110px;
  17. border-radius:4px;
  18. -moz-border-radius:4px;
  19. padding: 1px;
  20. border:solid 1px silver;
  21. margin-top:3px}
  22. .ks2 a{
  23. padding-right:1px;
  24. }
  25.  

** не забывайте делать резервные копии!

Демо можно посмотреть здесь:
раз - внизу выводятся похожие записи.
два - похожих не нашлось, выводятся рекомендуемые.
в других рубриках, так же можно посмотреть вывод.
Плагин "Похожие записи Блогов" + картинка + описание (ver.1.10* & ↑ №3)
Теги: похожие
Комментарии (4)
omarov 2 ноября 2016 в 23:04 +1
Все отлично работает! Спасибо!
Только 2 вопроса:
1. Можно сделать поиск по похожим со всех рубрик?
2. Можно вывести цену товара под названием?

В php слаб, сам не смог найти решение!
KS 23 мая 2018 в 08:06 0
1. да , достаточно удалить из запроса вот это условие :

строчка 17:
Код PHP:
  1. AND category_id = ".$item['category_id']."
строчка 38-39:
Код PHP:
  1. category_id = ".$item['category_id']."
  2. AND
2. да, достаточно добавить в выборку поле с ценой (например PRICE)

строчка 13:
Код PHP:
  1. $sql = "SELECT id, title, imageurl, price,
строчка 36:
Код PHP:
  1. $sql = "SELECT id, title, imageurl, price
и вывести цену на экран , например под названием :

строчки 27 и 49 :

$item['recomend'] .= '<a href="/catalog/item'.$cat_hom['id'].'.html" title="'.$cat_hom['title'].'"> (цена: '.(($cat_hom['price']) ? $cat_hom['price'] : 'не указана').') ';

ps . написано без проверки , возможны опечатки
KS 23 мая 2018 в 08:07 +1
строчки 27 и 49 :

Код PHP:
  1.  
  2. $item['recomend'] .= '<a href="/catalog/item'.$cat_hom['id'].'.html" title="'.$cat_hom['title'].'"> (цена: '.(($cat_hom['price']) ? $cat_hom['price'] : 'не указана').') ';
Юрий 23 мая 2018 в 17:47 0
Спасибо большое !!! Очень кстати оказался хак !