• DONATE to NULLED!
    Форуму и его команде можно помочь, мотивировать модераторов разделов.
    Помогите модератору этого раздела killoff лично.

Помощь Вывести все значения одного доп поля

  • Автор темы
  • Модер.
  • #21
Вот и отлично!
Тему тогда можно закрывать.(ты кстати вроде сам можешь ее закрыть без модераторов)


by killoff: закрыл
Открыл сново...
Можно как то сделать подсчет повторов перед удалением дублей чтобы можно было выводить их количество в соответствии с нужным доп полем?
 
работу не проверял.
PHP:
<?php

include ('engine/api/api.class.php'); // подключаем api
$table = 'dle_post';  // название таблицы
$fields  = 'xfields'; // нужные поля, * - все поля
$where = 'approve=1'; // условия выборки
$multirow = 1; // забирать ли один ряд или несколько
$start = 0; // начальное значение выборки
$limit = 0; // количество записей для выборки, 0 - выбрать все
$xfield = 'year'; ///ИМЯ ДОП ПОЛЯ ДЛЯ ВЫВОДА
$time = '14000'; //время жизни кеша

$xfields = $dle_api->load_from_cache ($fields, $time, $xfields); //берем наш кеш, если есть конечно ))
if( !$xfields ) { //проверяем взяли ли мы кеш и если не взяли, то делаем запрос
    $xfields = $dle_api->load_table ($table,$fields,$where,$multirow,$start,$limit); //делаем запрос к бд
    $dle_api->save_to_cache ( xfields, $xfields); //сохраняем в кеш
    }

$stack = array(); //создаем пустой массив
foreach($xfields as $value){  // перебор значений массива
    if($value[xfields]){ //проверяем есть ли элемент в массиве

        $row = xfieldsdataload($value[xfields]); //получаем нужное нам доп поле
        if($row[$xfield]){ //проверяем есть ли значение
       
            $rowdata = explode( ",", $row[$xfield]); //разбиваем наше значение на массив
            foreach($rowdata as $value){    //перебираем значения массива
                if($value){                    //проверяем есть ли значение
                    $value = trim($value);    //убираем пробелы
                    array_push($stack, $value); //добавляем в конец массива полученное значение
                    }
                }
            }
        }
    }
$stack = array_count_values($stack); //считаем повторы и избавляемся от повторных значений
foreach($stack as $key => $count){  //выводим окончательный вариант
    echo "<a href=/index.php?do=search_xf&q=";  //открываем ссылку
    echo $key; //подставляем значение для поиска
    echo ">";
    echo $key."(".$count.")"; //имя ссылки и кол-во повторов
    echo "</a><br/>"; //закрываем ссылку
}
 
  • Автор темы
  • Модер.
  • #23
Не думал что вернусь к этой теме, но всё же нужна ещё помощь по выбору доп полей и выдаче полученной инфы.

Код выше собирает все значения указанного доп поля и подсчитывает их количество. Как к нему добавить ещё одно условие, чтобы можно было указать одно значение доп поля, а на выходе получить все значения другого доп поля (где есть пересечения с первым значением) с подсчетом количества? Если не понятно описал, вот пример.
Имеем два доп поля (цвет, материал), и 100 новостей. Во всех новостях эти поля одинаковые, а значения могут пересекаться а могут и не пересекаться. Как найти и вывести все новости, которые имеют цвет "синий", но отобразить встречающиеся значения из поля "материалы" с количеством новостей.... :oops: :glob:
 
Имеем два доп поля (цвет, материал), и 100 новостей. Во всех новостях эти поля одинаковые, а значения могут пересекаться а могут и не пересекаться. Как найти и вывести все новости, которые имеют цвет "синий", но отобразить встречающиеся значения из поля "материалы" с количеством новостей....
Все понял кроме
но отобразить встречающиеся значения из поля "материалы" с количеством новостей
, можно подробней на этом моменте ?
 
  • Автор темы
  • Модер.
  • #25
можно подробней на этом моменте ?
Например задается поиск по цвету желтый. Имеем color|желтый, красный, черный, в другой новости - color|синий, белый, желтый. Но также они имеют поле "материал" которое также может пересекаться по некоторым значениям полей. Надо к примеру из поля цвет для выборки поставить желтый, и указать второе поле "материал" и вывести из поля "материал" к примеру в таком виде: бумага - 8, шёлк - 5, дуб - 15, где цифры - это количество пересекающихся новостей по доп полю "материал". :crazy:
 
Все понял кроме , можно подробней на этом моменте ?
как я понял задачу
1|красный|кирпич
2|зеленый|камень
3|синий|кирпич
4|красный|камень
5|синий|вода
6|зеленый|кирпич
7|красный|вода
8|синий|дерево
9|синий|кирпич
10|синий|кирпич
12|синий|вода
13|красный|кирпич
кирпич(3)вода(2)дерево(1)
Ну и продолжая ход мыслей...щелкая по любому из значений мы получаем выборку новостей с этим значением.

Например задается поиск по цвету желтый. Имеем color|желтый, красный, черный, в другой новости - color|синий, белый, желтый. Но также они имеют поле "материал" которое также может пересекаться по некоторым значениям полей. Надо к примеру из поля цвет для выборки поставить желтый, и указать второе поле "материал" и вывести из поля "материал" к примеру в таком виде: бумага - 8, шёлк - 5, дуб - 15, где цифры - это количество пересекающихся новостей по доп полю "материал". :crazy:
упс. опередил.:sun:
 
Последнее редактирование модератором:
  • Автор темы
  • Модер.
  • #27
Ну и продолжая ход мыслей...щелкая по любому из значений мы получаем выборку новостей с этим значением.
Это конечно как вариант, но в общем скорее всего можно и без этого сделать, чтобы просто кол-во выводилось...
 
Создаем файл search_fx.php в /engine/modules
PHP:
<?php
/*
=============================================================================
SEARCH FX - Хак по доп полям
=============================================================================
Автор хака: Gameer
-----------------------------------------------------
URL: http://gameer.name
-----------------------------------------------------
email: gameer@mail.ua
-----------------------------------------------------
skype: gameerblog
=============================================================================
Файл:  search_fx.php
=============================================================================
Версия хака : .1 Stable Release
=============================================================================
/*
* Что может:
* - То что описано в теме
*
*/

$val = trim(strip_tags(stripslashes($val)));
$cache = trim(strip_tags(stripslashes($cache)));
$xf_name = trim(strip_tags(stripslashes($xf)));
$fx_name = trim(strip_tags(stripslashes($fx)));

$allow_cache = ($config['version_id'] >= '10.2') ? $config['allow_cache'] == '1' : $config['allow_cache'] == "yes";

$is_change = false;

if ($cache == 'y' && !$allow_cache) // если кэш не включен включаем принудительно
{
    if(!$allow_cache)
    {
        if ($config['version_id'] >= '10.2')
            $config['allow_cache'] = '1';
        else
             $config['allow_cache'] = "yes";
        $is_change = true;
    }
}
if($cache == 'y')
{
    $search_xf = false;

    $search_xf = get_cache( "news_fx_search", $config['skin'] . $val . $xf_name . $fx_name);
    if($search_xf !== false)
    {
        echo $search_xf;
        return;
    }
}
$sql = $db->query("SELECT xfields FROM " . PREFIX . "_post WHERE SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$xf_name}|', -1 ) ,  '||', 1 ) LIKE '%{$val}%'");
$count_rows = $sql->num_rows;
$tpl->load_template('search_xf.tpl');
if($count_rows > 0)
{
    $arr_two = array();
    while ($row = $db->get_row($sql))
    {
        $arr = xfieldsdataload($row['xfields']);
        $arr_two[] = $arr[$fx_name];
    }
    $count_arr = array_count_values($arr_two);

    $tpl->copy_template = str_replace("{val}", $val, $tpl->copy_template);
    $tpl->copy_template = preg_replace( "'\\[val\\](.*?)\\[/val\\]'si", "\\1", $tpl->copy_template);

    foreach($count_arr as $key => $value)
    {
        $tpl->copy_template = str_replace("{value}", $key, $tpl->copy_template);
        $tpl->copy_template = str_replace("{count}", $value, $tpl->copy_template);
        $tpl->copy_template = preg_replace( "'\\[val\\](.*?)\\[/val\\]'si", "", $tpl->copy_template);
        $tpl->compile('search_xf');
    }

    $tpl->clear();
    $search_xf = $tpl->result['search_xf'];
}
else
    $search_xf = "Ничего не найдено.";

if($cache == 'y' && $is_change)
    create_cache( "news_fx_search", $search_xf, $config['skin'] . $val . $xf_name . $fx_name, true );

echo $search_xf;

function get_cache($name, $id)
{
    global $config, $is_logged, $member_id;
    if( $is_logged ) $end_file = $member_id['user_group'];
    else $end_file = "0";
    $id = md5( $id );
    $name = $name . "_" . $id . "_" . $end_file;

    $buffer = @file_get_contents( ENGINE_DIR . "/cache/" . $name . ".tmp" );

    if ( $buffer !== false AND $config['clear_cache'] )
    {
        $file_date = @filemtime( ENGINE_DIR . "/cache/" . $name . ".tmp" );
        $file_date = time()-$file_date;
  
        if ( $file_date > ( $config['clear_cache'] * 60 ) )
        {
            $buffer = false;
            @unlink( ENGINE_DIR . "/cache/" . $name . ".tmp" );
        }

        return $buffer;
    }
    else
        return $buffer;
}
?>
Создать в шаблоне search_xf.tpl в него всунуть :
Код:
[val]<b>Искали :</b> {val}<br>[/val]
<b>Нашли :</b> {value} => {count}<br>
В нужном месте подключить :
Код:
{include file="/engine/modules/search_xf.php?val=2015&xf=wtf&fx=ganre&cache=y"}
Где val - это то что ищем по цвету ( к примеру синий)
Где xf - это название доп поля цвета на латинице
Где fx - это название доп материала на латинице
Где cache - это включить кэширования или нет (y - включить | n - выключить)
 
Последнее редактирование:
  • Автор темы
  • Модер.
  • #29
В нужном месте подключить :
:yahoo:Почти то что надо, только при выводе идёт так:
Код:
Искали : Мэтт Дэймон
Нашли : фантастика, приключения => 1
Нашли : военный, драма, комедия => 1
Нашли : фантастика, боевик, триллер, драма => 1
Нашли : фантастика, драма, приключения => 1
Нашли : фантастика, триллер, драма, комедия => 1
Нашли : драма, мелодрама, биография => 1
Нашли : драма => 1
Нашли : драма, семейный, комедия => 1
Нашли : мультфильм, мюзикл, комедия, семейный => 1
Как сделать чтобы жанры были только один раз и общее кол-во повторов жанров...?:thenks:
 
Замени в php файле на это :
PHP:
<?php
/*
=============================================================================
SEARCH FX - Хак по доп полям
=============================================================================
Автор хака: Gameer
-----------------------------------------------------
URL: http://gameer.name
-----------------------------------------------------
email: gameer@mail.ua
-----------------------------------------------------
skype: gameerblog
=============================================================================
Файл:  search_fx.php
=============================================================================
Версия хака : .1 Stable Release
=============================================================================
/*
* Что может:
* - То что описано в теме
*
*/

$val = trim(strip_tags(stripslashes($val)));
$cache = trim(strip_tags(stripslashes($cache)));
$xf_name = trim(strip_tags(stripslashes($xf)));
$fx_name = trim(strip_tags(stripslashes($fx)));

$allow_cache = ($config['version_id'] >= '10.2') ? $config['allow_cache'] == '1' : $config['allow_cache'] == "yes";

$is_change = false;

if ($cache == 'y' && !$allow_cache) // если кэш не включен включаем принудительно
{
    if(!$allow_cache)
    {
        if ($config['version_id'] >= '10.2')
            $config['allow_cache'] = '1';
        else
             $config['allow_cache'] = "yes";
        $is_change = true;
    }
}
if($cache == 'y')
{
    $search_xf = false;

    $search_xf = get_cache( "news_fx_search", $config['skin'] . $val . $xf_name . $fx_name);
    if($search_xf !== false)
    {
        echo $search_xf;
        return;
    }
}
$sql = $db->query("SELECT xfields FROM " . PREFIX . "_post WHERE SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '{$xf_name}|', -1 ) ,  '||', 1 ) LIKE '%{$val}%'");
$count_rows = $sql->num_rows;
$tpl->load_template('search_xf.tpl');
if($count_rows > 0)
{
    $arr_two = array();
    while ($row = $db->get_row($sql))
    {
        $arr = xfieldsdataload($row['xfields']);
        $arr_two[] = $arr[$fx_name];
    }
 
    unset($arr);
    $arr_all = array();
    for($i = 0; $i < count($arr_two); $i++)
    {
        if(count(explode(',',$arr_two[$i])) >= 2)
        {
            $expl_all = explode(',',$arr_two[$i]);
            foreach($expl_all as $data)
               $arr_all[] = $data
        }
        else
            $arr_all[] = $arr_two[$i];
    }
    unset($arr_two);
    $count_arr = array_count_values($arr_all);
    unset($arr_all);

    $tpl->copy_template = str_replace("{val}", $val, $tpl->copy_template);
    $tpl->copy_template = preg_replace( "'\\[val\\](.*?)\\[/val\\]'si", "\\1", $tpl->copy_template);

    foreach($count_arr as $key => $value)
    {
        $tpl->copy_template = str_replace("{value}", trim(strip_tags(stripslashes($key))), $tpl->copy_template);
        $tpl->copy_template = str_replace("{count}", intval($value), $tpl->copy_template);
        $tpl->copy_template = preg_replace( "'\\[val\\](.*?)\\[/val\\]'si", "", $tpl->copy_template);
        $tpl->compile('search_xf');
    }

    $tpl->clear();
    $search_xf = $tpl->result['search_xf'];
}
else
    $search_xf = "Ничего не найдено.";

if($cache == 'y' && $is_change)
    create_cache( "news_fx_search", $search_xf, $config['skin'] . $val . $xf_name . $fx_name, true );

echo $search_xf;

function get_cache($name, $id)
{
    global $config, $is_logged, $member_id;
    if( $is_logged ) $end_file = $member_id['user_group'];
    else $end_file = "0";
    $id = md5( $id );
    $name = $name . "_" . $id . "_" . $end_file;

    $buffer = @file_get_contents( ENGINE_DIR . "/cache/" . $name . ".tmp" );

    if ( $buffer !== false AND $config['clear_cache'] )
    {
        $file_date = @filemtime( ENGINE_DIR . "/cache/" . $name . ".tmp" );
        $file_date = time()-$file_date;
        if ( $file_date > ( $config['clear_cache'] * 60 ) )
        {
            $buffer = false;
            @unlink( ENGINE_DIR . "/cache/" . $name . ".tmp" );
        }

        return $buffer;
    }
    else
        return $buffer;
}
?>
 
Последнее редактирование:
Назад
Сверху