Помогите с Dle :(

12
Василич#
На сайте с 10.03.2009
Offline
111
1657

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

Есть модуль для DLE (Searchfields+) т.е. "Поиск по дополнительным полям".

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

Например:

Я выбираю категорию для поиска: "Комедии".

Модуль ищет только те новости, где категория заполнена к ней только одна (т.е. "Комедии"), если категорий указано много к новости (мильтикатегории) (драмы, комедии, ужасы) то новость не ищется.

Пожалуйста, помогите кто сможет, уверен здесь есть такие.

Вот содержание PHP файла модуля:

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

Есть модуль для DLE (Searchfields+) т.е. "Поиск по дополнительным полям".

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

Например:

Я выбираю категорию для поиска: "Комедии".

Модуль ищет только те новости, где категория заполнена к ней только одна (т.е. "Комедии"), если категорий указано много к новости (мильтикатегории) (драмы, комедии, ужасы) то новость не ищется.

Пожалуйста, помогите кто сможет, уверен здесь есть такие.

Вот содержание PHP файла модуля:

<?php


/* DLE + SearchFields v5.0
* All Rights Reserved!
* @author Dave Aka Aios
* @year 2010
*/
if (!defined('DATALIFEENGINE')) {
die("Hacking attempt!");
}

$disables = array( 'do', 'cstart', 'page', 'loc', 'news_direction_by', 'news_sort_by' );
$request = $_SERVER['REQUEST_URI'];
$query_string = $_SERVER['QUERY_STRING'];

if ($config['allow_alt_url'] == 'yes')
{
if ($_GET['loc'])
{
$location = '';
foreach ($_GET as $key => $value)
{
if ( $key != 'do' && $key != 'loc' && !is_array($value)){
$location .= $key . ':' . $value . '/';
}else if(is_array($value)){
$location .= $key . ':' . implode(";", $value) . '/';
}
}

header ("Location: $config[http_home_url]sf/$location");
}

$tmp_array = explode('/', $_GET['q']);
$in_array = '';

unset($_GET);
$_GET['do'] = 'search_xf';
$request = substr($request, 1);

foreach($tmp_array as $value)
{
if ($value != '')
{
$in_array = explode(":", $value);
$_GET[$in_array[0]] = $in_array[1];
if($in_array[0] == 'page')
$cstart = $in_array[1];
}
}
}

$url_page = $config['http_home_url'] . $request;

if($_GET['page'] > 1){
$url_page = preg_replace( "/(page:[0-9]+\\/|cstart:[0-9]+)/", "", $url_page );
}else{
$url_page = preg_replace( "/(\\/page:[0-9]+\\/|\\/cstart:[0-9]+)/", "", $url_page );
}

if(strpos($query_string, 'cstart') !== false)
{
$query_string = preg_replace( '/cstart=[0-9]+/', "", $query_string );
$query_string = substr($query_string, 1);
}
$user_query = str_replace("&","&amp;",$query_string);

if ($cstart) {
$cstart = $cstart - 1;
$cstart = $cstart * $config['news_number'];
}

$newsmodule = true;

if (isset($_GET['news_sort_by'])) $news_sort_by = $_GET['news_sort_by'];
else $news_sort_by = 'date';

if (isset($_GET['news_direction_by'])) $news_direction_by = $_GET['news_direction_by'];
else $news_direction_by = 'DESC';

if ($news_sort_by != 'date')
$select = ", SUBSTRING_INDEX( SUBSTRING_INDEX( xfields, '{$news_sort_by}|', -1 ) , '||', 1 ) as $news_sort_by";


$searchQuery = array();
$searchEngine = $_GET;

foreach ($searchEngine as $key => $value)
{
if (!in_array($key, $disables) and $value !="" and $value != NULL)
{
preg_match_all('#int_(.*)_(.*)#', $key, $matches, PREG_SET_ORDER);
if($matches)
{
if($matches=='start')
{
$searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields )>$value";
}
else
{
$searchQuery[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields )<$value";
}
}
else
{
// if(strpos($_SERVER['REQUEST_URI'], "?do=searchfields") || strpos($_SERVER['REQUEST_URI'], '/sf/'))
// {
// $value = $db->safesql(htmlspecialchars(stripslashes($value)));
// }
// else
// {
// $value = iconv("utf-8","windows-1251",$db->safesql(htmlspecialchars(stripslashes($value))));
// }
if ($key != 'category')
{
if(strpos($value, ";") === false)
{
$searchArr = array($key, $value);
$searchQuery[] = "xfields LIKE '%" . implode('|', $searchArr) . "%'";
}else{
$searchRes = explode(";", $value);
foreach($searchRes as $kent){
$searchArr = array($key, $kent);
$searchLS[] = "xfields LIKE '%" . implode('|', $searchArr) . "%'";
}
$searchRes = implode(" OR ", $searchLS);
$searchQuery[] = '(' .$searchRes. ')';

}

}
else
{
if ($config['allow_multi_category'] == 'yes')
{
$searchQuery[] = "category regexp '[[:<:]]( $value )[[:>:]]'";
}
else
{
$searchQuery[] = "category = '$value'";
}
}
}
}
}

unset($matches);
if($searchQuery)
$where .= implode(' AND ',$searchQuery)." AND";

$sql_select = "SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, approve, flag, editdate, editor, reason, view_edit, tags $select FROM " . PREFIX . "_post where {$where} approve" . $where_date . " ORDER BY " . $news_sort_by . "+0 " . $news_direction_by . " LIMIT " . $cstart . "," . $config['news_number'];
$sql_count = "SELECT COUNT(*) as count FROM " . PREFIX . "_post where {$where} approve" . $where_date;
$allow_active_news = true;



?>
bmw-power.com.ua (https://bmw-power.com.ua)
siv1987
На сайте с 02.04.2009
Offline
427
#1

Вобщето судя по всему он должен правильно сработать. А в настройках мултикатегории включены?

Василич#
На сайте с 10.03.2009
Offline
111
#2
siv1987:
Вобщето судя по всему он должен правильно сработать. А в настройках мултикатегории включены?

Прежде всего спасибо за ответ.

Да, в настройках мультикатегории включены 😕

---------- Добавлено 23.07.2012 в 20:48 ----------

Помогите люди добрые.... ну очень нужно :(

siv1987
На сайте с 02.04.2009
Offline
427
#3

Добавьте

die( $sql_select.'<br /><br />allow_multi_category: '.$config['allow_multi_category'] );

перед $sql_count = "SELECT COUNT(*)

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

Василич#
На сайте с 10.03.2009
Offline
111
#4
siv1987:
Добавьте
die( $sql_select.'<br /><br />allow_multi_category: '.$config['allow_multi_category'] );

перед $sql_count = "SELECT COUNT(*)

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

Спасибо за ответ! Вот результат:

SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, approve, flag, editdate, editor, reason, view_edit, tags FROM dle_post where category = '2' AND approve ORDER BY date+0 DESC LIMIT 0,15

allow_multi_category: 1



---------- Добавлено 23.07.2012 в 21:04 ----------

Попробовал в данном коде:

if ($config['allow_multi_category'] == 'yes')
{
$searchQuery[] = "category regexp '[[:<:]]( $value )[[:>:]]'";
}
else
{
$searchQuery[] = "category = '$value'";
}

заменить

$searchQuery[] = "category = '$value'";

на

$searchQuery[] = "category regexp '[[:<:]]( $value )[[:>:]]'";

теперь выдает пустую страницу. Как я понял что-то не то в запросе именно этом:

$searchQuery[] = "category regexp '[[:<:]]( $value )[[:>:]]'";

помогите пожалуйста, в php не очень силён.

siv1987
На сайте с 02.04.2009
Offline
427
#5

Какая у вас версия сайта?

Найдите


$config['allow_multi_category'] == 'yes'

и замените на


$config['allow_multi_category'] == 'yes' OR $config['allow_multi_category'] == 1
Василич#
На сайте с 10.03.2009
Offline
111
#6

Dle 9.5. Попробовал. Теперь в результатах пустая страница. Уверен на 100% что проблема именно в даном запросе:

$searchQuery[] = "category regexp '[[:<:]]( $value )[[:>:]]'";

---------- Добавлено 23.07.2012 в 21:10 ----------

siv1987, на Вас последняя надежда :(

siv1987
На сайте с 02.04.2009
Offline
427
#7

Еще раз тогда вставьте ту строчку и покажите результат.

Василич#
На сайте с 10.03.2009
Offline
111
#8

siv1987, большущее спасибо что возитесь со мной.

Вот результат:

SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, rating, vote_num, news_read, approve, flag, editdate, editor, reason, view_edit, tags FROM dle_post where category regexp '[[:<:]]( 2 )[[:>:]]' AND approve ORDER BY date+0 DESC LIMIT 0,15

allow_multi_category: 1



---------- Добавлено 23.07.2012 в 21:17 ----------

siv1987, большущее спасибо за помощь!!!! Оказывается надо было ковычки убрать с запроса:

$searchQuery[] = "category regexp '[[:<:]]( $value )[[:>:]]'";

на

$searchQuery[] = "category regexp '[[:<:]]($value)[[:>:]]'";

:) ОГРОМНОЕ СПАСИБО ВАМ !!!

---------- Добавлено 23.07.2012 в 21:20 ----------

Только теперь другая проблема еще нарисовалась :(

Если искать по доп. полям (по тексту) например по стране: Ирландия

То ищет только те совпадения, где "Ирландия" стоит на первом месте. Например: "Ирландия, США", если наоборот "США, Ирландия", то поиск не работает :(

siv1987
На сайте с 02.04.2009
Offline
427
#9
Василич#:
Оказывается надо было ковычки убрать с запроса:

Я или слепой или не вижу никакой разницы. Ковычки там нужны, как ординарные так и двойные. Ну раз заработал, значит хорошо.

Василич#
На сайте с 10.03.2009
Offline
111
#10

Спасибо Вам большое, благодаря Вам проблема решилась !siv1987,

извините за чрезмерную наглость, но не подскажете еще в чем здесь может быть проблема:

Если искать по доп. полям (по тексту),

например: по стране: Ирландия

То ищет только те совпадения, где "Ирландия" стоит на первом месте. Например: "Ирландия, США" - находит новость, если наоборот "США, Ирландия" - то новость не находит

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий