Писать на форуме DIAFAN.CMS могут только зарегистрированные пользователи. Войдите или зарегистрируйтесь.

Форум Модули DIAFAN.CMS Поиск по сайту Вывод изображения в поиске


Dmitry (weissfl) 12519 января 2014 г.

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

Александр Биг Эпл (ba5) 8322 января 2014 г.

Про какие элементы идет речь? Про товары? Тогда если использовать поиск по товарам, сделать шаблон и выводить там только поле название товара, то при поиске выпадает обычная плитка товаров, кторая редактируется в shop.list.block или как он там пишется

Dmitry (weissfl) 12522 января 2014 г.

Нет, не только товары. Любые статьи, новости, товары, все в общем

Александра (Alexa0105) 16311 мая 2018 г., редакция 11 мая 2018 г.

Подниму древнюю темку.

Проблема в чем: сайт древней версии 5.3. Обновлять сейчас не вариант, потому что автоматом сделать не получится, а переносить вручную товары и запиленные изменения - адская работа.

Выводятся результаты поиска обычным списком.

Код
if (! empty($result["value"]))
{
echo '<div class="search_result">'.$this->diafan->_('Всего найдено').": <b>".$result["value"].": ".$result["count"]."</b>
<br>".$this->diafan->_('Документы: <strong>%d—%d</strong> из %d найденных', true, $result["count_start"], $result["count_finish"], $result["count"])
. '</div>';

if (!empty($result["rows"]))
{
$i = $result["count_start"];
foreach ($result["rows"] as $row)

Показать весь код
{
echo '<div class="search_list">'.$i++.'. '
.'<a href="'.BASE_PATH_HREF.$row["link"].'">'.$row["name"].'</a>'
.'<br>'
.$row["snippet"]
.'<br>'
.'<a href="'.BASE_PATH_HREF.$row["link"].'">http://'.BASE_URL.'/'.$row["link"].'</a>'
.'</div>';
}
}

echo (!empty($result["paginator"]) ? $result["paginator"] : '');
}
else
{
echo '<div class="search_result">'.$this->diafan->_('Извините, слово для поиска не задано.').'</div>';
}


В последних версиях (6.0 например) добавлено перед выводом такое:

Код
if (! empty($res["class"]))
{
echo $this->get($res["func"], $res["class"], $res);
}


Благодаря чему, если находятся товары, то они отображаются так, как в категории магазина.

Собственно, это и нужно.

Сообразить, куда этот код ведет и что вызывает, не получилось. Где-то что-то упускаю.
Может быть специалисты смогут подсказать что-то по данному вопросу. Куда хоть копать? Или вообще возможно вызвать картинки вместе с названием найденного товара?

Если получится вызвать картинки, то остальное уже дорисую. Больше ничего и не нужно.

Заранее спасибо за подсказки.

Степан (idxdoc) 12911 мая 2018 г.

На бум говорю, вообще проверять нужно, вот и проверите:)
Тупо скопируйте с файла shop.view.rows.php вывод картинок и вставьте сюда.
Наверняка в массиве result присутствуют картинки
Спасибо сказали: Александра (Alexa0105)

Александра (Alexa0105) 16311 мая 2018 г.

Вы будете смеяться, но в этой версии такого файла вообще не существует

$row["img"] пыталась всунуть, не тянет.

Степан (idxdoc) 12911 мая 2018 г.

Напишите сл. код в этом файле
Код

echo '<pre>';
print_r($result);
echo '</pre>;


И покажите мне что вывелось

Александра (Alexa0105) 16311 мая 2018 г.

Код
[rows] => Array
(
[0] => Array
(
[name] => Жеребец фриз (производитель)
[url] => shop/ekzoticheskie-porody/zherebets-friz-proizvoditelROUTE_END
[snippet] => Жеребец фриз (производитель) Предлагается на продажу шикарный жеребец фризской упряжной...
[link] => shop/ekzoticheskie-porody/zherebets-friz-proizvoditel/
)

Показать весь код
[1] => Array
(
[name] => Андалузский жеребец
[url] => shop/ekzoticheskie-porody/andaluzskiy-zherebetsROUTE_END
[snippet] => Андалузский жеребец Предлагается на продажу красивый жеребец, тип Барокко, вывезеный...
[link] => shop/ekzoticheskie-porody/andaluzskiy-zherebets/
)

[2] => Array
(
[name] => Жеребец пони-класс
[url] => shop/poni/zherebets-poni-klassROUTE_END
[snippet] => Жеребец пони-класс Предлагается на продажу изящный гнедой жеребец пони-класс (райд...
[link] => shop/poni/zherebets-poni-klass/
)

[3] => Array
(
[name] => Вороной орловец
[url] => shop/rysaki/voronoy-orlovets1032ROUTE_END
[snippet] => Вороной орловец Предлагается на продажу орловский жеребец вороной, 2010 года рождения,...
[link] => shop/rysaki/voronoy-orlovets1032/
)

)

[count] => 152
[count_start] => 1
[count_finish] => 10
[count_page] => 10
[value] => жеребец
[action] => /search/
[button] => Найти

Александра (Alexa0105) 16311 мая 2018 г.

Т.е. я вижу вообще только 3 параметра: имя, ссылку и сниппет.

Степан (idxdoc) 12911 мая 2018 г., редакция 11 мая 2018 г.

Тогда все посложнее, чем я предполагал, нужно в модельку лезть, найти функцию которая собирает этот массив и дополнить его фотографиями.

Если найдете мне эту функцию и вставите сюда, напишу что нужно дополнить.

файл shop.model.php, если в той версии конечно не так все сильно по другому)))))

примерное название функции list_search()
Спасибо сказали: Александра (Alexa0105)

Александра (Alexa0105) 16311 мая 2018 г.

Файл search.model.php, в шопе нормально, если делать поиск-фильтр по товарам.

Степан (idxdoc) 12911 мая 2018 г.

Александра, дайте мне эту функцию уже))

Александра (Alexa0105) 16311 мая 2018 г.

Из модельки поиска

Код
SELECT r.name, r.url, r.snippet".

Видимо, вот эти три параметра... наверно...

Степан (idxdoc) 12911 мая 2018 г.

Скорей всего оно, скопируйте всю функцию.

Александра (Alexa0105) 16311 мая 2018 г.

Код
/**
* Search_model
*/
class Search_model extends Model
{
/**
* Генерирует список найденных страниц
*
* @return array
*/

Показать весь код
public function show_module()
{
$search = '';
if (isset($_GET["searchword"]))
{
if (is_array($_GET["searchword"]))
{
$_GET["searchword"] = '';
}
$search = trim(htmlspecialchars(stripslashes($_GET["searchword"])));
if(empty($_SESSION["search"]) || ! in_array($_GET["searchword"], $_SESSION["search"]))
{
$_SESSION["search"][] = $_GET["searchword"];
if($count = $this->diafan->configmodules("count_history"))
{
DB::query("INSERT INTO {search_history} (created, name) VALUES (%d, '%h')", time(), $_GET["searchword"]);
if(DB::query_result("SELECT COUNT(*) FROM {search_history}") > $count)
{
DB::query("DELETE FROM {search_history} ORDER BY created ASC LIMIT 1");
}
}
}
}
$this->result = array();

if (! empty($search))
{
Customization::inc('includes/searchwords.php');
$searchwords = new Searchwords();
$search_words = $searchwords->prepare($search);

$keys = array();
$result = DB::query("SELECT id, keyword FROM {search_keywords} WHERE keyword IN ('".implode("', '", $search_words)."')");
while ($row = DB::fetch_array($result))
{
$keys[$row["keyword"]] = $row["id"];
}
DB::free_result($result);

$temp_table = false;
if($this->diafan->configmodules("search_all_word", "search"))
{
$order = '';
// обязательны все слова
$where = "";
foreach($search_words as $k => $key)
{
$where .= " INNER JOIN {search_index} AS i".$k." ON r.id=i".$k.".result_id AND i".$k.".keyword_id=".$keys[$key];
$order .= 'i'.$k.'.rating ASC, ';
}
$order .= "r.rating DESC";
}
else
{
// ищет хотя бы одно слово, сортировка по количеству найденных
$where = "INNER JOIN {search_index} AS i ON r.id=i.result_id AND i.keyword_id IN ('".implode("', '", $keys)."')";
if(count($search_words) > 1)
{
$temp_table = true;
DB::query("CREATE TEMPORARY TABLE {search_temp} (
keyword_id int(11) unsigned NOT NULL,
rating tinyint(2) unsigned NOT NULL
);");
$where .= " INNER JOIN {search_temp} AS t ON t.keyword_id=i.keyword_id";
$query = '';
foreach($search_words as $i => $word)
{
$query .= ($query ? "," : '')." (".$keys[$word].", ".(count($search_words) - $i).")";
}
DB::query("INSERT INTO {search_temp} (keyword_id, rating) VALUES".$query);
}
$order = ($temp_table ? "tmp_rating" : "r.rating")." DESC";
}

$nen = DB::query_result("SELECT COUNT(DISTINCT r.id) FROM {search_results} AS r "
.($this->diafan->_user->role_id ? " LEFT JOIN {access} AS a ON a.element_id=r.id AND a.module_name='search'" : "")
.$where." WHERE r.lang_id=%d"
." AND (r.access='0'"
.($this->diafan->_user->role_id ? " OR r.access='1' AND a.role_id=".$this->diafan->_user->role_id : '')
.")", _LANG);

////navigation//
if ($nastr = $this->diafan->configmodules("nastr", "search"))
{
$this->diafan->_paginator->nastr = $nastr;
}
$this->diafan->_paginator->page = $this->diafan->page;
$this->diafan->_paginator->navlink = $this->diafan->_route->current_link("page");
$this->diafan->_paginator->get_nav = '?searchword='.$search;
$this->diafan->_paginator->nen = $nen;
$links = $this->diafan->_paginator->get();
////navigation///

$k = ! $this->diafan->page ? 1 : ($this->diafan->page - 1) * $this->diafan->_paginator->nastr + 1;

$this->result["paginator"] = $this->diafan->_tpl->get('get', 'paginator', $links);

$count = 0;
$result = DB::query_range("
SELECT r.name, r.url, r.snippet".($temp_table ? ", SUM(t.rating) AS tmp_rating" : "")." FROM {search_results} as r "
.($this->diafan->_user->role_id ? " LEFT JOIN {access} AS a ON a.element_id=r.id AND a.module_name='search'" : "")
.$where
." WHERE r.lang_id=%d"
." AND (r.access='0'"
.($this->diafan->_user->role_id ? " OR r.access='1' AND a.role_id=".$this->diafan->_user->role_id : '')
.")"
." GROUP BY r.id ORDER BY ".$order,
_LANG, $this->diafan->_paginator->polog, $this->diafan->_paginator->nastr);
while ($row = DB::fetch_array($result))
{
$row["link"] = str_replace('ROUTE_END', ROUTE_END, $row["url"]);
$this->result["rows"][] = $row;
$count++;
}
DB::free_result($result);

$this->result["count"] = $this->diafan->_paginator->nen;
$this->result["count_start"] = $this->result["count"] ? ($this->diafan->_paginator->page - 1) * $this->diafan->_paginator->nastr + 1 : 0;
$this->result["count_finish"] = $this->result["count"] ? $this->result["count_start"] - 1 + $count : 0;
$this->result["count_page"] =
$this->diafan->_paginator->nen > $this->diafan->_paginator->nastr ?
$this->diafan->_paginator->nastr : $this->diafan->_paginator->nen;
}
$this->result["value"] = $search;
$this->result["action"] = BASE_PATH_HREF.$this->diafan->_route->link($this->diafan->cid);
$this->result["button"] = 'Найти';

return $this->result;
}

/**
* Генерирует контент для шаблонной функции: форма поиска по сайту
*
* @return array
*/
public function show_search($button)
{
$result["value"] = '';
if (isset($_GET["searchword"]))
{
if (is_array($_GET["searchword"]))
{
$_GET["searchword"] = '';
}
$result["value"] = trim(htmlspecialchars(stripslashes($_GET["searchword"])));
}
$result["action"] = BASE_PATH_HREF.$this->diafan->_route->module('search', true);
$result["button"] = $button;
return $result;
}
}

Александра (Alexa0105) 16311 мая 2018 г.

Упс, погорячилась. Всю модель пихнула

Степан (idxdoc) 12911 мая 2018 г.

вот как мы сделаем, будет проще, в модельке сейчас только id товара вытащим, а то даже его нет.
Код

$result = DB::query_range("
SELECT r.id, r.name, r.url, r.snippet"


Потом во вьюхе сделаем запрос в базу на картинку.

Вначале цикла форыча

Код
foreach ($result["rows"] as $row)
{


Вставьте этот код

Код

$images = $this->diafan->_images->get("medium", $row["id"], "shop", "element", 0, $row["name"], false, 2, "large")

foreach($images as $img){
echo '<img src="'.$img["src"].'" alt="'.$img["alt"].'" title="'.$img["title"].'">';
}



если ничего не напутал, и я не знаю, сработает ли этот код в вашей версии, попробуйте.

Александра (Alexa0105) 16311 мая 2018 г.

Цитата
в модельке сейчас только id товара вытащим

Это получилось.

Цитата
Вставьте этот код

В общем, не цепляет.

print_r($result);
видит
Код
[rows] => Array
(
[0] => Array
(
[id] => 7279
[name] => Андалузский жеребец
[url] => shop/ekzoticheskie-porody/andaluzskiy-zherebetsROUTE_END
[snippet] => Андалузский жеребец Предлагается на продажу красивый жеребец, тип Барокко, вывезеный...
[link] => shop/ekzoticheskie-porody/andaluzskiy-zherebets/
)


Но общее направление поняла. Спасибо. Еще покопаюсь...
В новых версиях выводится же как-то эта картинка. Значит модельки еще сравнить попробовать можно.

Степан (idxdoc) 12911 мая 2018 г., редакция 11 мая 2018 г.

Резалт правильный выводит, мы туда только айди добавили, Вы код добавили с картинками?
Ошибка выводиться какая нибудь?

Добавьте сл.код если нет ошибки.

Код
echo '<pre>';
print_r($images);
echo '</pre>';


P.S. Я посмотрел документацию по диафану 5.3. там есть поддержка того что я написал.

P.P.S. Проверил еще раз))))

Нужно заменить чутка
Код
$images = $this->diafan->_images->get("medium", $row["id"], "shop", 0, $row["name"], false, 2, "large")

Александра (Alexa0105) 16311 мая 2018 г.

Цитата
Вы код добавили с картинками?

Да и заменила сейчас новым.

Цитата
Ошибка выводиться какая нибудь?

Ошибок не вижу.

Цитата
echo '<pre>';
print_r($images);
echo '</pre>';

Вообще ничего не вывело, кроме самого поиска.

Цитата
Я посмотрел документацию по диафану 5.3.

Подскажите ссылку, пожалуйста, я почему-то совсем не вижу такой документации. Да и дистрибутива оригинального нет.

Степан (idxdoc) 12911 мая 2018 г.

Цитата
Подскажите ссылку, пожалуйста, я почему-то совсем не вижу такой документации. Да и дистрибутива оригинального нет.

https://www.diafan.ru/docs/manual_diafan.CMS_5.3.pdf

Цитата
Вообще ничего не вывело, кроме самого поиска.

Скопируйте всю вьюху.
Он не может ничего не вывести. Включен режим разработчика?
Спасибо сказали: Александра (Alexa0105)

Александра (Alexa0105) 16311 мая 2018 г.

За ссыль спасибо.

Цитата
Включен режим разработчика?

Был включен. Сейчас пошла перепроверить и увы, доступа в админку нет. Придется ждать друга с сайтом, он видимо ночью понатыкал в админке и отрубил меня случайно.

В любом случае спасибо за помощь, поддержку и подпинывания в нужном направлении.
Позднее отпишусь, а пока почитаю матчасть.

Александра (Alexa0105) 16311 мая 2018 г.

Истину глаголите, Степан. Нарисовались ошибки в режиме разработчика. Действительно отключили ночью его.
Код

Undefined variable: images
#1 include(/home/g/goldgadgru/traversale/public_html/modules/search/views/search.view.show.php) called at [/home/g/goldgadgru/traversale/public_html/includes/template.php:92]
#2 Template->get(show, search, Array(...)) called at [/home/g/goldgadgru/traversale/public_html/modules/search/search.php:40]
#3 Search->show_module() called at [/home/g/goldgadgru/traversale/public_html/includes/function.php:118]
#4 Theme_functions->show_module() called at [/home/g/goldgadgru/traversale/public_html/includes/function.php:57]
#5 Theme_functions->show_body(Array(...)) called at [(null):0]
#6 call_user_func_array(Array(...), Array(...)) called at [/home/g/goldgadgru/traversale/public_html/includes/parser_theme.php:216]
#7 Parser_theme->start_element(Array(...)) called at [/home/g/goldgadgru/traversale/public_html/includes/parser_theme.php:106]
#8 Parser_theme->get_function_in_theme(<?php if(!defined("DIAFAN")){include("../includes/404.php");exit();}?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www...) called at [/home/g/goldgadgru/traversale/public_html/includes/parser_theme.php:68]

Показать весь код
#9 Parser_theme->show_theme(Search) called at [/home/g/goldgadgru/traversale/public_html/includes/init.php:395]
#10 Init->start() called at [/home/g/goldgadgru/traversale/public_html/index.php:62]


Говорит, что неопределенная переменная.

Степан (idxdoc) 12912 мая 2018 г.

Нужно еще вчера была скопировать мне всю вашу вьюху.

Скопируйте всю вьюху.

Александра (Alexa0105) 16312 мая 2018 г.

Код
<?php
/**
* Шаблон результатов поиска по сайту
*
* @package Diafan.CMS
* @author diafan.ru
* @version 5.3
* @license http://cms.diafan.ru/license.html
* @copyright Copyright (c) 2003-2013 OOO «Диафан» (http://diafan.ru)
*/

Показать весь код
if (!defined('DIAFAN'))
{
include dirname(dirname(dirname(__FILE__))).'/includes/404.php';
}

if (! empty($result["value"]))
{
echo '<div class="search_result">'.$this->diafan->_('Всего найдено').": <b>".$result["value"].": ".$result["count"]."</b>
<br>".$this->diafan->_('Документы: <strong>%d—%d</strong> из %d найденных', true, $result["count_start"], $result["count_finish"], $result["count"])
. '</div>';

if (!empty($result["rows"]))
{
$i = $result["count_start"];
foreach ($result["rows"] as $row)
{

$images = $this->diafan->_images->get("medium", $row["id"], "shop", 0, $row["name"], false, 2, "large");
foreach ($images as $img) {
echo '<img src="'.$img["src"].'" alt="'.$img["alt"].'" title="'.$img["title"].'">';
}


echo '<div class="search_list">'.$i++.'. '
.'<a href="'.BASE_PATH_HREF.$row["link"].'">'.$row["name"].'</a>'
.'<br>'
.$row["snippet"]
.'<br>'
.'<a href="'.BASE_PATH_HREF.$row["link"].'">http://'.BASE_URL.'/'.$row["link"].'</a>'
.'</div>';
}
}

echo (!empty($result["paginator"]) ? $result["paginator"] : '');
}
else
{
echo '<div class="search_result">'.$this->diafan->_('Извините, слово для поиска не задано.').'</div>';
}

Степан (idxdoc) 12912 мая 2018 г.

Я чутка отформатировал код и добавил условие, чтобы ошибку убрать, но саму проблему не решил, будь доступы конечно уже 10 раз сделал бы. Попробуйте поиграться с 4 параметром, который сейчас указан 0, в функции get(). Это айди сайта, к которому прикреплены изображения, в последней версии диафана там можно оставить 0 и все ок, а в этой возможно нужно написать номер страницы сайта, к которой прикреплен магазин.
Код

<?php if(!defined('DIAFAN')){include dirname(dirname(dirname(__FILE__))).'/includes/404.php';}

if(!empty($result["value"])){
echo '<div class="search_result">'.$this->diafan->_('Всего найдено').": <b>".$result["value"].": ".$result["count"]."</b>
<br>".$this->diafan->_('Документы: <strong>%d—%d</strong> из %d найденных', true, $result["count_start"], $result["count_finish"], $result["count"])
. '</div>';

if(!empty($result["rows"])){
$i = $result["count_start"];

Показать весь код
foreach ($result["rows"] as $row){

$images = $this->diafan->_images->get("medium", $row["id"], "shop", 0, $row["name"], false, 1, "large");

if(!empty($images)){
foreach($images as $img){
echo '<img src="'.$img["src"].'" alt="'.$img["alt"].'" title="'.$img["title"].'">';
}
}

echo '<div class="search_list">'.$i++.'. '
.'<a href="'.BASE_PATH_HREF.$row["link"].'">'.$row["name"].'</a>'
.'<br>'
.$row["snippet"]
.'<br>'
.'<a href="'.BASE_PATH_HREF.$row["link"].'">http://'.BASE_URL.'/'.$row["link"].'</a>'
.'</div>';

}
}
echo (!empty($result["paginator"]) ? $result["paginator"] : '');
}else{
echo '<div class="search_result">'.$this->diafan->_('Извините, слово для поиска не задано.').'</div>';
}

Александра (Alexa0105) 16312 мая 2018 г.

В общем, не хочет совсем выводить.
Ошибок в режиме разработчика не обнаружено.
id магазина = 1. Поставила, тоже не хочет.
Видимо, пилить нужно глубже.

П.С. Отняла у вас кучу времени...

Степан (idxdoc) 12912 мая 2018 г.

Короче, я не знаю какого эта функция ничего не возвращает, все должно работать, нужно вникать больше.
По большому счету можем тупо сделать запрос в базу да и похер в данном случае.

Код

<?php if(!defined('DIAFAN')){include dirname(dirname(dirname(__FILE__))).'/includes/404.php';}

if(!empty($result["value"])){
echo '<div class="search_result">'.$this->diafan->_('Всего найдено').": <b>".$result["value"].": ".$result["count"]."</b>
<br>".$this->diafan->_('Документы: <strong>%d—%d</strong> из %d найденных', true, $result["count_start"], $result["count_finish"], $result["count"])
. '</div>';

if(!empty($result["rows"])){
$i = $result["count_start"];

Показать весь код
foreach($result["rows"] as $row){

$img_product = DB::query_fetch_array('SELECT name, [alt], [title] FROM {images} WHERE module_name="shop" AND element_id="%d" AND trash="0"', $row['id']);

if(!empty($img_product)){
echo '<img src="'.BASE_PATH_HREF.'/userfiles/shop/medium/'.$img_product["name"].'" alt="'.$img_product["alt"].'" title="'.$img_product["title"].'">';
}

echo '<div class="search_list">'.$i++.'. '
.'<a href="'.BASE_PATH_HREF.$row["link"].'">'.$row["name"].'</a>'
.'<br>'
.$row["snippet"]
.'<br>'
.'<a href="'.BASE_PATH_HREF.$row["link"].'">http://'.BASE_URL.'/'.$row["link"].'</a>'
.'</div>';

}
}
echo (!empty($result["paginator"]) ? $result["paginator"] : '');
}else{
echo '<div class="search_result">'.$this->diafan->_('Извините, слово для поиска не задано.').'</div>';
}



Посмотрите только путь правильный ли я записал, я не знаю какой он в вашем случае. Это где выводим картинку в атрибуте "src"