Владельцам 3.8.6: не поставили патч - потеряли форум!

Файловый Архив

  • Неограниченное количество категорий и суб-категорий
  • Настройки прав доступа по группам
  • Настройки прав доступа по каждой категории
  • Предпросмотр медиа файлов: FLV, IFLV, F4A, F4V, MP4, MP3, MOV и других...
  • Мультизагрузка файлов - SWFUploader
  • Добавление файлов с сервера
Подробности и история обновлений продукта в этой теме
Loading

Go Back   форум vBSupport.org > > >
Register Изображения Меню vBsupport Files Manager Аллея Звёзд Реклама на форуме Search Today's Posts Mark Forums Read
  • Мемберка
  • Администраторам
  • Premoderation
  • For English speaking users
  • Изменения в правах
  • Каталог Фрилансеров
Пароли на скачивание файлов в Member Area меняются автоматически каждый день
Если вам нужно скачать какой то скрипт, за паролем ко мне в ЛС
привет какирам kerk
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота.
Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
На форуме введена премодерация ВСЕХ новых пользователей

Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
for English speaking users:
You may be surprised with restriction of access to the attachments of the forum. The reason is the recent change in vbsupport.org strategy:

- users with reputation < 10 belong to "simple_users" users' group
- if your reputation > 10 then administrator (kerk, Luvilla) can decide to move you into an "improved" group, but only manually

Main idea is to increase motivation of community members to share their ideas and willingness to support to each other. You may write an article for the subject where you are good enough, you may answer questions, you may share vbulletin.com/org content with vbsupport.org users, receiving "thanks" equal your reputation points. We should not only consume, we should produce something.

- you may:
* increase your reputation (doing something useful for another members of community) and being improved
* purchase temporary access to the improved category:
10 $ for 3 months. - this group can download attachments, reputation/posts do not matter.
20 $ for 3 months. - this group can download attachments, reputation/posts do not matter + adds eliminated + Inbox capacity increased + files manager increased permissions.

Please contact kerk or Luvilla regarding payments.

Important!:
- if your reputation will become less then 0, you will be moved into "simple_users" users' group automatically.*
*for temporary groups (pre-paid for 3 months) reputation/posts do not matter.
Не можете скачать вложение?
Изменения в правах групп пользователей
внимательно читаем эту и эту темы
Короткая версия - тут
Уважаемые пользователи!

На форуме открыт новый раздел "Каталог фрилансеров"

и отдельный раздел для платных заказов "Куплю/Закажу"

 
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default [Вопрос] Поиск по нескольким меткам 0

Не уверен, что в эту тему, но более соответствующей не нашел.
По мотивам тем на форуме, столкнулся с тем, что бюлетен дает возможность искать только по одной метке даже если вводишь несколько слов.
Решил поправить эту ситуацию.
Сделал несколько изменений в файл tags.php
PHP Code:
<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.8.4
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2009 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE & ~8192);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT''tags');
define('CSRF_PROTECTION'true);

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array('inlinemod''search');

// get special data templates from the datastore
$specialtemplates = array(
    
'tagcloud',
    
'iconcache'
);

// pre-cache templates used by all actions
$globaltemplates = array();

// pre-cache templates used by specific actions
$actiontemplates = array(
    
'cloud' => array(
        
'tag_cloud_box',
        
'tag_cloud_headinclude',
        
'tag_cloud_link',
        
'tag_cloud_page'
    
),
    
'tag' => array(
        
'tag_search',
        
'threadadmin_imod_menu_thread',
        
'threadbit'
    
)
);

if (empty(
$_REQUEST['do']))
{
    if (empty(
$_REQUEST['tag']))
    {
        
$_REQUEST['do'] = 'cloud';
    }
    else
    {
        
$_REQUEST['do'] = 'tag';
    }
}

// ######################### REQUIRE BACK-END ############################
require_once('./global.php');
require_once(
DIR '/includes/functions_bigthree.php');
require_once(
DIR '/includes/functions_forumdisplay.php');

if (!
$vbulletin->options['threadtagging'])
{
    
print_no_permission();
}

(
$hook vBulletinHook::fetch_hook('tags_start')) ? eval($hook) : false;

// #######################################################################
if ($_REQUEST['do'] == 'cloud')
{
    require_once(
DIR '/includes/functions_search.php');

    
$tag_cloud fetch_tagcloud('usage');
    if (
$tag_cloud)
    {
        eval(
'$tag_cloud_headinclude .= "' fetch_template('tag_cloud_headinclude') . '";');
    }
    else
    {
        
$tag_cloud_headinclude '';
    }

    
$navbits construct_navbits(array(
        
'' => $vbphrase['tags'],
    ));
    eval(
'$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_cloud_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_cloud_page') . '");');
}

// #######################################################################
if ($_REQUEST['do'] == 'tag')
{
    
$vbulletin->input->clean_array_gpc('r', array(
        
'tag' => TYPE_NOHTML,
        
'pagenumber' => TYPE_UINT,
        
'perpage' => TYPE_UINT
    
));

    if (!
$vbulletin->GPC['tag'])
    {
        
standard_error(fetch_error('invalidid'$vbphrase['tag'], $vbulletin->options['contactuslink']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $tag = $db->query_first("
//        SELECT *
//        FROM " . TABLE_PREFIX . "tag
//        WHERE tagtext = '" . $db->escape_string($vbulletin->GPC['tag']) . "'
//    ");
// Конец было
// Начало нового кода
  
$tag_string $vbulletin->GPC['tag'];                         // Получаем строку поиска

  
$tag_separate = array();                                      // Объвляем массив
  
$tok strtok($tag_string' ,.;:(){}[]|"');                  // Отделяем слова

  
while ($tok)                                                  // Заносим отдельные слова в массив
  
{
    
$tag_separate[] = $tok;
    
$tok strtok(' ,.;:(){}[]|"');
  }

    foreach (
$tag_separate AS $key => $tagvalue)                   // Создаем строку для вставки в запрос
    
{
    if(
$key != 0)
    {
    
$tags_where .= ', "' $tagvalue '"';
    }
    if(
$key == 0)
    {
      
$tags_where .= '"' $tagvalue '"';
    }
    }

    
$tag $db->query("
        SELECT *
        FROM " 
TABLE_PREFIX "tag
        WHERE tagtext in (" 
$tags_where ")
    "
);

    
$tagid_where = array();
    while (
$tags $db->fetch_array($tag))
    {
        
$tagid_where[] = $tags['tagid'];
    }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
if (!$tag)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

    
// get forum ids for all forums user is allowed to view
    
$forumids array_keys($vbulletin->forumcache);
    
$self_only = array();

    foreach (
$forumids AS $key => $forumid)
    {
        
$forum $vbulletin->forumcache["$forumid"];

        
$forumperms fetch_permissions($forumid);
        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canview']) OR !verify_forum_password($forumid$forum['password'], false))
        {
            unset(
$forumids["$key"]);
            continue;
        }

        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canviewothers']))
        {
            
$self_only[] = $forumid;
        }
    }

    if (!
$forumids)
    {
        
print_no_permission();
    }

    
// needed to prevent mass amounts of queries
    
require_once(DIR '/includes/functions_forumlist.php');
    
cache_moderators();

    
$coventry fetch_coventry('string');
    
$globalignore = ($coventry "AND thread.postuserid NOT IN ($coventry) " '');

    if (
$vbulletin->userinfo['userid'] AND in_coventry($vbulletin->userinfo['userid'], true))
    {
        
$tachyjoin "
            LEFT JOIN " 
TABLE_PREFIX "tachythreadpost AS tachythreadpost ON
                (tachythreadpost.threadid = thread.threadid AND tachythreadpost.userid = " 
$vbulletin->userinfo['userid'] . ")
            LEFT JOIN " 
TABLE_PREFIX "tachythreadcounter AS tachythreadcounter ON
                (tachythreadcounter.threadid = thread.threadid AND tachythreadcounter.userid = " 
$vbulletin->userinfo['userid'] . ")
        "
;
        
$tachy_columns "
            IF(tachythreadpost.userid IS NULL, thread.lastpost, tachythreadpost.lastpost) AS lastpost,
            IF(tachythreadpost.userid IS NULL, thread.lastposter, tachythreadpost.lastposter) AS lastposter,
            IF(tachythreadpost.userid IS NULL, thread.lastpostid, tachythreadpost.lastpostid) AS lastpostid,
            IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount) AS replycount,
            IF(thread.views<=IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount), IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount)+1, thread.views) AS views
        "
;

    }
    else
    {
        
$tachyjoin '';
        
$tachy_columns 'thread.lastpost, thread.lastposter, thread.lastpostid, thread.replycount, IF(thread.views<=thread.replycount, thread.replycount+1, thread.views) AS views';
    }

    
$hook_query_joins $hook_query_where '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_limit')) ? eval($hook) : false;

// Корректировки для поиска по нескольким меткам
// Начало было
//    $threadid_sql = $db->query_read_slave("
//        SELECT thread.threadid, $tachy_columns
//        FROM " . TABLE_PREFIX . "thread AS thread
//        INNER JOIN " . TABLE_PREFIX . "tagthread AS tagthread ON
//            (tagthread.tagid = $tag[tagid] AND tagthread.threadid = thread.threadid)
//        $tachyjoin
//        $hook_query_joins
//        WHERE thread.forumid IN(" . implode(', ', $forumids) . ")
//            " . ($self_only ? 'AND IF(thread.forumid IN (' . implode(',', $self_only) . '), thread.postuserid = ' . $vbulletin->userinfo['userid'] . ', 1)' : '') . "
//            AND thread.visible = 1
//            AND thread.sticky IN (0, 1)
//            AND thread.open <> 10
//            $globalignore
//            $hook_query_where
//        ORDER BY lastpost DESC
//        LIMIT " . intval($vbulletin->options['maxresults'])
//    );
// Конец было
// Начало нового кода
    
$threadid_sql $db->query_read_slave("
        SELECT thread.threadid, 
$tachy_columns
        FROM " 
TABLE_PREFIX "thread AS thread
        INNER JOIN " 
TABLE_PREFIX "tagthread AS tagthread ON
            (tagthread.tagid IN (" 
implode(','$tagid_where) . ") AND tagthread.threadid = thread.threadid)
        
$tachyjoin
        
$hook_query_joins
        WHERE thread.forumid IN(" 
implode(', '$forumids) . ")
            " 
. ($self_only 'AND IF(thread.forumid IN (' implode(','$self_only) . '), thread.postuserid = ' $vbulletin->userinfo['userid'] . ', 1)' '') . "
            AND thread.visible = 1
            AND thread.sticky IN (0, 1)
            AND thread.open <> 10
            
$globalignore
            
$hook_query_where
        ORDER BY lastpost DESC
        LIMIT " 
intval($vbulletin->options['maxresults'])
    );

// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$totalthreads $db->num_rows($threadid_sql);
    if (!
$totalthreads)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    if ($vbulletin->GPC['pagenumber'] <= 1)
//    {
//        $db->query_write("INSERT INTO " . TABLE_PREFIX . "tagsearch (tagid, dateline) VALUES ($tag[tagid], " . TIMENOW . ")");
//    }
// Конец было
// Начало нового кода
  
if ($vbulletin->GPC['pagenumber'] <= 1)
  {
    while (
$tagsid $db->fetch_array($tag))
    {
      
$tags_id $tagsid['tagid'];
          
$db->query_write("INSERT INTO " TABLE_PREFIX "tagsearch (tagid, dateline) VALUES (" $tags_id", " TIMENOW ")");
      }
  }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$pagenumber $vbulletin->GPC['pagenumber'];
    
$perpage $vbulletin->GPC['perpage'];

    
sanitize_pageresults($totalthreads$pagenumber$perpage200$vbulletin->options['maxthreads']);

    if (
$pagenumber 1)
    {
        
$db->data_seek($threadid_sql, ($pagenumber 1) * $perpage);
    }

    
$threadids = array();
    
$resultnum 0;
    while (
$thread $db->fetch_array($threadid_sql))
    {
        
$threadids[] = $thread['threadid'];

        
$resultnum++;
        if (
$resultnum >= $perpage)
        {
            break;
        }
    }
    
$db->free_result($threadid_sql);

    if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
    {
        
// we need this for forum read times
        
cache_ordered_forums(1);
    }

    
// now move on to actual display code

    
$hook_query_fields $hook_query_joins '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_data')) ? eval($hook) : false;

    
$thread_sql $db->query_read_slave("
        SELECT
            thread.threadid, thread.title AS threadtitle, thread.forumid, pollid, open, postusername, postuserid, thread.iconid AS threadiconid,
            thread.dateline, notes, thread.visible, sticky, votetotal, thread.attach, 
$tachy_columns,
            thread.prefixid, thread.taglist, hiddencount, deletedcount
            " 
. ($vbulletin->options['threadpreview'] > ', post.pagetext AS preview' '') . "
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ? ", NOT ISNULL(subscribethread.subscribethreadid) AS issubscribed" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? ", threadread.readtime AS threadread" "") . "
            
$hook_query_fields
        FROM " 
TABLE_PREFIX "thread AS thread
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ?  " LEFT JOIN " TABLE_PREFIX "subscribethread AS subscribethread ON(subscribethread.threadid = thread.threadid AND subscribethread.userid = " $vbulletin->userinfo['userid'] . " AND canview = 1)" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? " LEFT JOIN " TABLE_PREFIX "threadread AS threadread ON (threadread.threadid = thread.threadid AND threadread.userid = " $vbulletin->userinfo['userid'] . ")" "") . "
            " 
. ($vbulletin->options['threadpreview'] > "LEFT JOIN " TABLE_PREFIX "post AS post ON(post.postid = thread.firstpostid)" '') . "
            
$tachyjoin
            
$hook_query_joins
        WHERE thread.threadid IN (" 
implode(','$threadids) . ")
    "
);

    
$threads = array();
    
$lastread = array();
    
$managethread $movethread $deletethread $approvethread $openthread = array();

    
$dotthreads fetch_dot_threads_array(implode(','$threadids));
    if (
$vbulletin->options['showdots'] AND $vbulletin->userinfo['userid'])
    {
        
$show['dotthreads'] = true;
    }
    else
    {
        
$show['dotthreads'] = false;
    }

    while (
$thread $db->fetch_array($thread_sql))
    {
        
$threads["$thread[threadid]"] = $thread;

        
// get forum read times if needed
        
if (!isset($lastread["$thread[forumid]"]))
        {
            if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
            {
                
$forum $vbulletin->forumcache["$thread[forumid]"];
                
$lastread["$thread[forumid]"] = max($forum['forumread'], (TIMENOW - ($vbulletin->options['markinglimit'] * 86400)));
            }
            else
            {
                
$forumview intval(fetch_bbarray_cookie('forum_view'$thread['forumid']));
                
$lastread["$thread[forumid]"] = ($forumview $vbulletin->userinfo['lastvisit'] ? $forumview $vbulletin->userinfo['lastvisit']);
            }
        }

        
// check inline mod stuff
        
if (can_moderate($thread['forumid'], 'canmanagethreads'))
        {
            
$movethread["$thread[threadid]"] = 1;
            
$show['movethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'candeleteposts') OR can_moderate($thread['forumid'], 'canremoveposts'))
        {
            
$deletethread["$thread[threadid]"] = 1;
            
$show['deletethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canmoderateposts'))
        {
            
$approvethread["$thread[threadid]"] = 1;
            
$show['approvethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canopenclose'))
        {
            
$openthread["$thread[threadid]"] = 1;
            
$show['openthread'] = true;

        }
        if (
$vbulletin->forumcache["$thread[forumid]"]['options'] & $vbulletin->bf_misc_forumoptions['allowicons'])
        {
            
$show['threadicons'] = true;
        }
    }
    
$db->free_result($thread_sql);

    if (!empty(
$managethread) OR !empty($movethread) OR !empty($deletethread) OR !empty($approvethread) OR !empty($openthread))
    {
        
$show['inlinemod'] = true;
        
$show['spamctrls'] = $show['deletethread'];
    }

    
$columncount 6;
    if (
$show['threadicons'])
    {
        
$columncount++;
    }
    if (
$show['inlinemod'])
    {
        
$columncount++;
    }

    
$show['forumlink'] = true;
    
$threadbits '';

    (
$hook vBulletinHook::fetch_hook('tags_list_threads')) ? eval($hook) : false;

    foreach (
$threadids AS $threadid)
    {
        
$thread $threads["$threadid"];

        
$forumperms fetch_permissions($thread['forumid']);
        if (
$vbulletin->options['threadpreview'] > AND !($forumperms $vbulletin->bf_ugp_forumpermissions['canviewthreads']))
        {
            
$thread['preview'] = '';
        }

        
$thread process_thread_array($thread$lastread["$thread[forumid]"]);

        
$show['disabled'] = ($movethread["$thread[threadid]"] OR $deletethread["$thread[threadid]"] OR $approvethread["$thread[threadid]"] OR $openthread["$thread[threadid]"]) ? false true;

        eval(
'$threadbits .= "' fetch_template('threadbit') . '";');
    }

    if (
$show['popups'] AND $show['inlinemod'])
    {
        eval(
'$threadadmin_imod_menu = "' fetch_template('threadadmin_imod_menu_thread') . '";');
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $pagenav = construct_page_nav($pagenumber, $perpage, $totalthreads,
//        'tags.php?tag=' . urlencode(unhtmlspecialchars($tag['tagtext']))
//        . ($perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage" : '')
//    );
//
//    $navbits = construct_navbits(array(
//        'tags.php' . $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
//        '' => construct_phrase($vbphrase['threads_tagged_with_x'], $tag['tagtext'])
//    ));
// Конец было
// Начало нового кода
    
$pagenav construct_page_nav($pagenumber$perpage$totalthreads,
        
'tags.php?tag=' urlencode(unhtmlspecialchars($vbulletin->GPC['tag']))
        . (
$perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage'')
    );

    
$navbits construct_navbits(array(
        
'tags.php' $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
        
'' => construct_phrase($vbphrase['threads_tagged_with_x'], $vbulletin->GPC['tag'])
    ));
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
eval('$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_list_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_search') . '");');
}

/*======================================================================*\
|| ####################################################################
|| # NulleD - FintMax
|| # CVS: $RCSfile$ - $Revision: 31381 $
|| ####################################################################
\*======================================================================*/
?>
Так как я не очень большой специалист в PHP и с бюлетене, то прошу покритиковать мое творчество, может быть что сделал не так или может быть надо что то добавить.

На локалке у меня работает.
Attached Files
File Type: php tags.php (16.0 KB, 0 views)
 
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
Old  
Yoskaldyr
Специалист
Default 1

SMak044, Судя по данному коду будет искаться любая из перечисленных меток. А на практике чаще надо найти темы со всеми указанными метками (т.е. в коде условие ИЛИ, а обычно нужно И ).
Также метки могут состоять из нескольких слов, поэтому в качестве разделителя меток лучше использовать только запятую (стандарт для булки при добавлении тегов)

Также чтобы нормально в форме поиска отрабатывал js предугадывание для нескольких тегов надо изменить шаблон для вызова другой js функции.

P.S. Я делал на заказ такой хак, но не знаю согласится ли заказчик на то чтобы я выложил в паблик.
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Yoskaldyr, По поводу поиска не любой а всех, я думал. Но решил пока начать с этого.
Думаю правильней будет иметь чек бокс с выбором, что именно надо по всем или все.
И с запятыми тоже согласен. Но так как это первый блин, то я решил пока оставить все знами для тестирования.

Quote:
Originally Posted by Yoskaldyr View Post
Также чтобы нормально в форме поиска отрабатывал js предугадывание для нескольких тегов надо изменить шаблон для вызова другой js функции.
Опа.. про это не подумал...
Буду ковырять.
 
Old  
Yoskaldyr
Специалист
Default 1

Quote:
Originally Posted by SMak044 View Post
Буду ковырять
в шаблоне tag_cloud_page после:
HTML Code:
tag_comp = new vB_AJAX_TagSuggest('tag_comp', 'tag_input', 'tag_wrapper');
добавить:
HTML Code:
tag_comp.allow_multiple = true;
tag_comp.set_delimiters('');

Last edited by Yoskaldyr : 10-08-2009 at 03:44 PM.
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Заработало.
Пошел модифицировать для поиска с И

SMak044 добавил 08.10.2009 в 17:39
Что то не могу разобраться... Наверно еще чего то не понимаю
Я создал в шаблоне меток чекбокс
HTML Code:
<input type="checkbox" id="tag_all" name="tag_all">
в php файле я его вроде объявил
PHP Code:
    $vbulletin->input->clean_array_gpc('r', array(
        
'tag' => TYPE_NOHTML,

        
'tag_all' => TYPE_NOHTML,    

        
'pagenumber' => TYPE_UINT,
        
'perpage' => TYPE_UINT
    
)); 
Сделал по аналогии с 'tag'
Теперь хочу получить его значение. $vbulletin->GPC['tag_all']; И ничего не получаю.
У меня смутная догадка, что тип TYPE_NOHTML не правильный. Может быть использовать TYPE_BOOL?
Но я попробовал и все равно значение не передается.
Подскажите, что не так делаю.

SMak044 добавил 08.10.2009 в 17:56
Разобрался... Учите HTML ... надо было установить значение value="1" ну и обновить страницу.

Last edited by SMak044 : 10-08-2009 at 06:56 PM. Reason: Добавлено сообщение
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Немного переделал код. Добавил возможность поиска с логикой "И", убрал все разделители, оставил только запятую.
Огромное спасибо Yoskaldyr за помощь с предугадыванием меток при наборе, реализовано.
Потребовалось изменить немного шаблон tag_cloud_page.
  1. В шаблоне tag_cloud_page после:
    HTML Code:
    tag_comp = new vB_AJAX_TagSuggest('tag_comp', 'tag_input', 'tag_wrapper');
    добавить:
    HTML Code:
    tag_comp.allow_multiple = true;
    tag_comp.set_delimiters('');
  2. В шаблоне tag_cloud_page заменить:
    HTML Code:
    		<span id="tag_wrapper"><input type="text" id="tag_input" name="tag" size="25" style="width: 80%" class="bginput" /></span>
    		<input type="submit" class="button" value="$vbphrase[search]" />
    На:
    HTML Code:
    		<table border="0" cellspacing="0" cellpadding="0" width="100%">
    		<tr><td colspan="3" align="center">Для поиска по меткам разделяйте метки запятыми</td></tr>
    			<tr>
    				<td>
    					<span id="tag_wrapper">
    						<input type="text" id="tag_input" name="tag" size="25" style="width: 95%" class="bginput" />
    					</span>
    				</td>
    				<td width=160px>
    					<input type="checkbox" id="tag_all" name="tag_all" value="1">&nbsp;Со&nbsp;всеми&nbsp;метками
    				</td>
    				<td width=1px>
    					<input type="submit" class="button" value="$vbphrase[search]" />
    				</td>
    			</tr>
    		</table>

PHP код файла tags.php:
PHP Code:
<?php
/*======================================================================*\
|| #################################################################### ||
|| # vBulletin 3.8.4
|| # ---------------------------------------------------------------- # ||
|| # Copyright ©2000-2009 Jelsoft Enterprises Ltd. All Rights Reserved. ||
|| # This file may not be redistributed in whole or significant part. # ||
|| # ---------------- VBULLETIN IS NOT FREE SOFTWARE ---------------- # ||
|| # http://www.vbulletin.com | http://www.vbulletin.com/license.html # ||
|| #################################################################### ||
\*======================================================================*/

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE & ~8192);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT''tags');
define('CSRF_PROTECTION'true);

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array('inlinemod''search');

// get special data templates from the datastore
$specialtemplates = array(
    
'tagcloud',
    
'iconcache'
);

// pre-cache templates used by all actions
$globaltemplates = array();

// pre-cache templates used by specific actions
$actiontemplates = array(
    
'cloud' => array(
        
'tag_cloud_box',
        
'tag_cloud_headinclude',
        
'tag_cloud_link',
        
'tag_cloud_page'
    
),
    
'tag' => array(
        
'tag_search',
        
'threadadmin_imod_menu_thread',
        
'threadbit'
    
)
);

if (empty(
$_REQUEST['do']))
{
    if (empty(
$_REQUEST['tag']))
    {
        
$_REQUEST['do'] = 'cloud';
    }
    else
    {
        
$_REQUEST['do'] = 'tag';
    }
}

// ######################### REQUIRE BACK-END ############################
require_once('./global.php');
require_once(
DIR '/includes/functions_bigthree.php');
require_once(
DIR '/includes/functions_forumdisplay.php');

if (!
$vbulletin->options['threadtagging'])
{
    
print_no_permission();
}

(
$hook vBulletinHook::fetch_hook('tags_start')) ? eval($hook) : false;

// #######################################################################
if ($_REQUEST['do'] == 'cloud')
{
    require_once(
DIR '/includes/functions_search.php');

    
$tag_cloud fetch_tagcloud('usage');
    if (
$tag_cloud)
    {
        eval(
'$tag_cloud_headinclude .= "' fetch_template('tag_cloud_headinclude') . '";');
    }
    else
    {
        
$tag_cloud_headinclude '';
    }

    
$navbits construct_navbits(array(
        
'' => $vbphrase['tags'],
    ));
    eval(
'$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_cloud_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_cloud_page') . '");');
}

// #######################################################################
if ($_REQUEST['do'] == 'tag')
{
    
$vbulletin->input->clean_array_gpc('r', array(
        
'tag' => TYPE_NOHTML,
        
'tag_all' => TYPE_NOHTML,    
        
'pagenumber' => TYPE_UINT,
        
'perpage' => TYPE_UINT
    
));

    if (!
$vbulletin->GPC['tag'])
    {
        
standard_error(fetch_error('invalidid'$vbphrase['tag'], $vbulletin->options['contactuslink']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $tag = $db->query_first("
//        SELECT *
//        FROM " . TABLE_PREFIX . "tag
//        WHERE tagtext = '" . $db->escape_string($vbulletin->GPC['tag']) . "'
//    ");
// Конец было
// Начало нового кода
  
$tag_type_search 0;
    
  if (
$vbulletin->GPC['tag_all'] == 1)  
    {
    
$tag_type_search 1;
    }

  
$tag_string $vbulletin->GPC['tag'];

  
$tag_separate = array(); 
  
$tok strtok($tag_string','); 

  while (
$tok)
  {
    
$tag_separate[] = $tok;
    
$tok strtok(',');
  }

  if (
$tag_type_search == 0)
  {
    
$tag_tok_count count($tag_separate);
    
$tag_tok_last $tag_tok_count 1;

      foreach (
$tag_separate AS $key => $tagvalue)
      {
      if(
$key == 0)
      {
        
$tags_where .= 'tagtext in ("' trim ($tagvalue) . '"';
      }
      if(
$key && $key $tag_tok_last)
      {
      
$tags_where .= ', "' trim ($tagvalue) . '"';
      }
      if(
$key == $tag_tok_last)
      {
      
$tags_where .= ', "' trim ($tagvalue) . '")';
      }
      }
  }

  if (
$tag_type_search == 1)
  {
      foreach (
$tag_separate AS $key => $tagvalue)
      {
      if(
$key == 0)
      {
        
$tags_where .= 'tagtext = "' trim ($tagvalue) . '"';
      }
      if(
$key 0)
      {
      
$tags_where .= ' AND tagtext = "' trim ($tagvalue) . '"';
      }
      }
  }

  
$tag $db->query("
      SELECT *
      FROM " 
TABLE_PREFIX "tag
      WHERE " 
$tags_where "
    "
);
  
  
$tagid_where = array();
  while (
$tags $db->fetch_array($tag))
  {
      
$tagid_where[] = $tags['tagid'];
  }

  
$tagid_where_count count($tagid_where);
  
$tagid_where "tagthread.tagid IN (" implode(','$tagid_where) . ") AND "

  if(
$tagid_where_count == 0)
  {
    
$tagid_where "tagthread.tagid IN (Null) AND ";
  }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
if (!$tag)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

    
// get forum ids for all forums user is allowed to view
    
$forumids array_keys($vbulletin->forumcache);
    
$self_only = array();

    foreach (
$forumids AS $key => $forumid)
    {
        
$forum $vbulletin->forumcache["$forumid"];

        
$forumperms fetch_permissions($forumid);
        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canview']) OR !verify_forum_password($forumid$forum['password'], false))
        {
            unset(
$forumids["$key"]);
            continue;
        }

        if (!(
$forumperms $vbulletin->bf_ugp_forumpermissions['canviewothers']))
        {
            
$self_only[] = $forumid;
        }
    }

    if (!
$forumids)
    {
        
print_no_permission();
    }

    
// needed to prevent mass amounts of queries
    
require_once(DIR '/includes/functions_forumlist.php');
    
cache_moderators();

    
$coventry fetch_coventry('string');
    
$globalignore = ($coventry "AND thread.postuserid NOT IN ($coventry) " '');

    if (
$vbulletin->userinfo['userid'] AND in_coventry($vbulletin->userinfo['userid'], true))
    {
        
$tachyjoin "
            LEFT JOIN " 
TABLE_PREFIX "tachythreadpost AS tachythreadpost ON
                (tachythreadpost.threadid = thread.threadid AND tachythreadpost.userid = " 
$vbulletin->userinfo['userid'] . ")
            LEFT JOIN " 
TABLE_PREFIX "tachythreadcounter AS tachythreadcounter ON
                (tachythreadcounter.threadid = thread.threadid AND tachythreadcounter.userid = " 
$vbulletin->userinfo['userid'] . ")
        "
;
        
$tachy_columns "
            IF(tachythreadpost.userid IS NULL, thread.lastpost, tachythreadpost.lastpost) AS lastpost,
            IF(tachythreadpost.userid IS NULL, thread.lastposter, tachythreadpost.lastposter) AS lastposter,
            IF(tachythreadpost.userid IS NULL, thread.lastpostid, tachythreadpost.lastpostid) AS lastpostid,
            IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount) AS replycount,
            IF(thread.views<=IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount), IF(tachythreadcounter.userid IS NULL, thread.replycount, thread.replycount + tachythreadcounter.replycount)+1, thread.views) AS views
        "
;

    }
    else
    {
        
$tachyjoin '';
        
$tachy_columns 'thread.lastpost, thread.lastposter, thread.lastpostid, thread.replycount, IF(thread.views<=thread.replycount, thread.replycount+1, thread.views) AS views';
    }

    
$hook_query_joins $hook_query_where '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_limit')) ? eval($hook) : false;

// Корректировки для поиска по нескольким меткам
// Начало было
//    $threadid_sql = $db->query_read_slave("
//        SELECT thread.threadid, $tachy_columns
//        FROM " . TABLE_PREFIX . "thread AS thread
//        INNER JOIN " . TABLE_PREFIX . "tagthread AS tagthread ON
//            (tagthread.tagid = $tag[tagid] AND tagthread.threadid = thread.threadid)
//        $tachyjoin
//        $hook_query_joins
//        WHERE thread.forumid IN(" . implode(', ', $forumids) . ")
//            " . ($self_only ? 'AND IF(thread.forumid IN (' . implode(',', $self_only) . '), thread.postuserid = ' . $vbulletin->userinfo['userid'] . ', 1)' : '') . "
//            AND thread.visible = 1
//            AND thread.sticky IN (0, 1)
//            AND thread.open <> 10
//            $globalignore
//            $hook_query_where
//        ORDER BY lastpost DESC
//        LIMIT " . intval($vbulletin->options['maxresults'])
//    );
// Конец было
// Начало нового кода
    
$threadid_sql $db->query_read_slave("
        SELECT thread.threadid, 
$tachy_columns
        FROM " 
TABLE_PREFIX "thread AS thread
        INNER JOIN " 
TABLE_PREFIX "tagthread AS tagthread ON
            (" 
$tagid_where "tagthread.threadid = thread.threadid)
        
$tachyjoin
        
$hook_query_joins
        WHERE thread.forumid IN(" 
implode(', '$forumids) . ")
            " 
. ($self_only 'AND IF(thread.forumid IN (' implode(','$self_only) . '), thread.postuserid = ' $vbulletin->userinfo['userid'] . ', 1)' '') . "
            AND thread.visible = 1
            AND thread.sticky IN (0, 1)
            AND thread.open <> 10
            
$globalignore
            
$hook_query_where
        ORDER BY lastpost DESC
        LIMIT " 
intval($vbulletin->options['maxresults'])
    );
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$totalthreads $db->num_rows($threadid_sql);
    if (!
$totalthreads)
    {
        
standard_error(fetch_error('no_content_tagged_with_x'$vbulletin->GPC['tag']));
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    if ($vbulletin->GPC['pagenumber'] <= 1)
//    {
//        $db->query_write("INSERT INTO " . TABLE_PREFIX . "tagsearch (tagid, dateline) VALUES ($tag[tagid], " . TIMENOW . ")");
//    }
// Конец было
// Начало нового кода
  
if ($vbulletin->GPC['pagenumber'] <= 1)
  {
    while (
$tagsid $db->fetch_array($tag))
    {
      
$tags_id $tagsid['tagid'];
          
$db->query_write("INSERT INTO " TABLE_PREFIX "tagsearch (tagid, dateline) VALUES (" $tags_id", " TIMENOW ")");
      }
  }
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
$pagenumber $vbulletin->GPC['pagenumber'];
    
$perpage $vbulletin->GPC['perpage'];

    
sanitize_pageresults($totalthreads$pagenumber$perpage200$vbulletin->options['maxthreads']);

    if (
$pagenumber 1)
    {
        
$db->data_seek($threadid_sql, ($pagenumber 1) * $perpage);
    }

    
$threadids = array();
    
$resultnum 0;
    while (
$thread $db->fetch_array($threadid_sql))
    {
        
$threadids[] = $thread['threadid'];

        
$resultnum++;
        if (
$resultnum >= $perpage)
        {
            break;
        }
    }
    
$db->free_result($threadid_sql);

    if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
    {
        
// we need this for forum read times
        
cache_ordered_forums(1);
    }

    
// now move on to actual display code

    
$hook_query_fields $hook_query_joins '';
    (
$hook vBulletinHook::fetch_hook('tags_list_query_data')) ? eval($hook) : false;

    
$thread_sql $db->query_read_slave("
        SELECT
            thread.threadid, thread.title AS threadtitle, thread.forumid, pollid, open, postusername, postuserid, thread.iconid AS threadiconid,
            thread.dateline, notes, thread.visible, sticky, votetotal, thread.attach, 
$tachy_columns,
            thread.prefixid, thread.taglist, hiddencount, deletedcount
            " 
. ($vbulletin->options['threadpreview'] > ', post.pagetext AS preview' '') . "
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ? ", NOT ISNULL(subscribethread.subscribethreadid) AS issubscribed" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? ", threadread.readtime AS threadread" "") . "
            
$hook_query_fields
        FROM " 
TABLE_PREFIX "thread AS thread
            " 
. (($vbulletin->options['threadsubscribed'] AND $vbulletin->userinfo['userid']) ?  " LEFT JOIN " TABLE_PREFIX "subscribethread AS subscribethread ON(subscribethread.threadid = thread.threadid AND subscribethread.userid = " $vbulletin->userinfo['userid'] . " AND canview = 1)" "") . "
            " 
. (($vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid']) ? " LEFT JOIN " TABLE_PREFIX "threadread AS threadread ON (threadread.threadid = thread.threadid AND threadread.userid = " $vbulletin->userinfo['userid'] . ")" "") . "
            " 
. ($vbulletin->options['threadpreview'] > "LEFT JOIN " TABLE_PREFIX "post AS post ON(post.postid = thread.firstpostid)" '') . "
            
$tachyjoin
            
$hook_query_joins
        WHERE thread.threadid IN (" 
implode(','$threadids) . ")
    "
);

    
$threads = array();
    
$lastread = array();
    
$managethread $movethread $deletethread $approvethread $openthread = array();

    
$dotthreads fetch_dot_threads_array(implode(','$threadids));
    if (
$vbulletin->options['showdots'] AND $vbulletin->userinfo['userid'])
    {
        
$show['dotthreads'] = true;
    }
    else
    {
        
$show['dotthreads'] = false;
    }

    while (
$thread $db->fetch_array($thread_sql))
    {
        
$threads["$thread[threadid]"] = $thread;

        
// get forum read times if needed
        
if (!isset($lastread["$thread[forumid]"]))
        {
            if (
$vbulletin->options['threadmarking'] AND $vbulletin->userinfo['userid'])
            {
                
$forum $vbulletin->forumcache["$thread[forumid]"];
                
$lastread["$thread[forumid]"] = max($forum['forumread'], (TIMENOW - ($vbulletin->options['markinglimit'] * 86400)));
            }
            else
            {
                
$forumview intval(fetch_bbarray_cookie('forum_view'$thread['forumid']));
                
$lastread["$thread[forumid]"] = ($forumview $vbulletin->userinfo['lastvisit'] ? $forumview $vbulletin->userinfo['lastvisit']);
            }
        }

        
// check inline mod stuff
        
if (can_moderate($thread['forumid'], 'canmanagethreads'))
        {
            
$movethread["$thread[threadid]"] = 1;
            
$show['movethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'candeleteposts') OR can_moderate($thread['forumid'], 'canremoveposts'))
        {
            
$deletethread["$thread[threadid]"] = 1;
            
$show['deletethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canmoderateposts'))
        {
            
$approvethread["$thread[threadid]"] = 1;
            
$show['approvethread'] = true;
        }

        if (
can_moderate($thread['forumid'], 'canopenclose'))
        {
            
$openthread["$thread[threadid]"] = 1;
            
$show['openthread'] = true;

        }
        if (
$vbulletin->forumcache["$thread[forumid]"]['options'] & $vbulletin->bf_misc_forumoptions['allowicons'])
        {
            
$show['threadicons'] = true;
        }
    }
    
$db->free_result($thread_sql);

    if (!empty(
$managethread) OR !empty($movethread) OR !empty($deletethread) OR !empty($approvethread) OR !empty($openthread))
    {
        
$show['inlinemod'] = true;
        
$show['spamctrls'] = $show['deletethread'];
    }

    
$columncount 6;
    if (
$show['threadicons'])
    {
        
$columncount++;
    }
    if (
$show['inlinemod'])
    {
        
$columncount++;
    }

    
$show['forumlink'] = true;
    
$threadbits '';

    (
$hook vBulletinHook::fetch_hook('tags_list_threads')) ? eval($hook) : false;

    foreach (
$threadids AS $threadid)
    {
        
$thread $threads["$threadid"];

        
$forumperms fetch_permissions($thread['forumid']);
        if (
$vbulletin->options['threadpreview'] > AND !($forumperms $vbulletin->bf_ugp_forumpermissions['canviewthreads']))
        {
            
$thread['preview'] = '';
        }

        
$thread process_thread_array($thread$lastread["$thread[forumid]"]);

        
$show['disabled'] = ($movethread["$thread[threadid]"] OR $deletethread["$thread[threadid]"] OR $approvethread["$thread[threadid]"] OR $openthread["$thread[threadid]"]) ? false true;

        eval(
'$threadbits .= "' fetch_template('threadbit') . '";');
    }

    if (
$show['popups'] AND $show['inlinemod'])
    {
        eval(
'$threadadmin_imod_menu = "' fetch_template('threadadmin_imod_menu_thread') . '";');
    }

// Корректировки для поиска по нескольким меткам
// Начало было
//    $pagenav = construct_page_nav($pagenumber, $perpage, $totalthreads,
//        'tags.php?tag=' . urlencode(unhtmlspecialchars($tag['tagtext']))
//        . ($perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage" : '')
//    );
//
//    $navbits = construct_navbits(array(
//        'tags.php' . $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
//        '' => construct_phrase($vbphrase['threads_tagged_with_x'], $tag['tagtext'])
//    ));
// Конец было
// Начало нового кода
    
$pagenav construct_page_nav($pagenumber$perpage$totalthreads,
        
'tags.php?tag=' urlencode(unhtmlspecialchars($vbulletin->GPC['tag']))
        . (
$perpage != $vbulletin->options['maxthreads'] ? "&amp;pp=$perpage'')
    );

    
$navbits construct_navbits(array(
        
'tags.php' $vbulletin->session->vars['sessionurl_q'] => $vbphrase['tags'],
        
'' => construct_phrase($vbphrase['threads_tagged_with_x'], $vbulletin->GPC['tag'])
    ));
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
eval('$navbar = "' fetch_template('navbar') . '";');

    (
$hook vBulletinHook::fetch_hook('tags_list_complete')) ? eval($hook) : false;

    eval(
'print_output("' fetch_template('tag_search') . '");');
}

/*======================================================================*\
|| ####################################################################
|| # NulleD - FintMax
|| # CVS: $RCSfile$ - $Revision: 31381 $
|| ####################################################################
\*======================================================================*/
?>
Я специально не убирал родной код.

Впрос:
использование предугадывания при наборе меток, это классная функция, но я столкнулся с тем, что иногда нажимаешь 2 раза на Энтер и начинает выполняться запрос. Это не очень удобно когда собираешься искать со всеми метками.
Как отключить выполнение запроса по нажатию на Энтер?

Вопрос к гуру:
Я понимаю, что в таком виде это не есть продукт даже в приближенном виде. Посоветуйте как можно его оптимизировать для простоты инсталляции и последующей возможности деинсталляции. Или в данном случае в этом нет смысла?
Attached Files
File Type: php tags.php (17.2 KB, 0 views)
 
Old  
Yoskaldyr
Специалист
Default 1

Quote:
Originally Posted by SMak044 View Post
использование предугадывания при наборе меток, это классная функция, но я столкнулся с тем, что иногда нажимаешь 2 раза на Энтер и начинает выполняться запрос. Это не очень удобно когда собираешься искать со всеми метками.
Как отключить выполнение запроса по нажатию на Энтер?
Это полностью правильная логика. Первый ентер - выбор (вставка в форму ввода) какого либо тега, второй отправка запроса, потому что по умолчанию запрос отправляется именно по enter-у и насколько я знаю это почти у всех поисковых систем по умолчанию.

P.S. код, если конечно я его правильно понял, не будет искать одновременно несколько меток
потому что конструкция tagtext = 'bla1' AND tagtext = 'blah2' по идее никогда не будет true
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Quote:
Originally Posted by Yoskaldyr View Post
потому что конструкция tagtext = 'bla1' AND tagtext = 'blah2' по идее никогда не будет true
И верно....
надо присоединять таблицу tagthread ... пошел присоединять ;)
 
Old  
Yoskaldyr
Специалист
Default 1

Quote:
Originally Posted by SMak044 View Post
надо присоединять таблицу tagthread ... пошел присоединять ;)
Да нет же. Проблема в том что не может одно и то же поле равняться и одному значению и совсем другому одновременно.
Смотреть в сторону IN (...) и также в сторону количества вхождений для этого условия
SUM(IF (tagthread.tagid IN( набор_тегов_через запятую ),1,0)) as tagsum
и группировку по thread.threadid
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Yoskaldyr, Да да!
Собака в другом запросе. Спасибо. Буду пробовать. Не судите строго, все постигается со временем.
 
 

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off




All times are GMT +4. The time now is 05:40 PM.


Powered by vBulletin® Version 3.0.2
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.