htmlbook.ru - настольная книга администратора

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

  • Неограниченное количество категорий и суб-категорий
  • Настройки прав доступа по группам
  • Настройки прав доступа по каждой категории
  • Предпросмотр медиа файлов: 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

Еще раз ОГРОМНОЕ спасибо Yoskaldyr за помощь.
На этот раз кажется все получилось.

Выкладываю еще раз файл 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(',');
  }

  
$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) . '")';
    }
  }

  
$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_ins "tagthread.tagid IN (" implode(','$tagid_where) . ")"
// Конец нового кода
// Конец корректировок  для поиска по нескольким меткам

    
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, SUM(IF(" $tagid_where_ins ", 1, 0)) AS tagsum
          FROM " 
TABLE_PREFIX "thread AS thread
          INNER JOIN " 
TABLE_PREFIX "tagthread AS tagthread ON
              (" 
$tagid_where_ins " 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
      GROUP BY thread.threadid
          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;
//        }
// Конец было
// Начало нового кода

    
if ($tag_type_search == 0)
    {
      
$threadids[] = $thread['threadid'];
  
          
$resultnum++;
          if (
$resultnum >= $perpage)
          {
              break;
          }
    }
  
    if (
$tag_type_search == 1)
    {
      
$thread_sum $thread['tagsum'];
  
      if(
$thread_sum == $tag_tok_count)
      {
        
$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 $
|| ####################################################################
\*======================================================================*/
?>
Если есть возможность протестировать этот небольшой хак, буду рад услышать любые отзывы и постараться привести все это в нечто готовое к применению.
Attached Files
File Type: php tags.php (17.5 KB, 1 views)

Last edited by SMak044 : 10-09-2009 at 05:40 AM.
 
Bot
Yandex Bot Yandex Bot is online now
 
Join Date: 05.05.2005
Реклама на форуме А что у нас тут интересного? =)
Old  
Yoskaldyr
Специалист
Default 0

SMak044, Ну и в этот раз не совсем то )))
Ниже мой вариант (не значит что именно его и надо использовать, к тому же там другие переменные из моего кода, но принцип должен быть понятен)
PHP Code:
    $threadid_sql $db->query_read_slave("
        SELECT thread.threadid, 
$tachy_columns, SUM(IF (tagthread.tagid IN($tag[tagid]),1,0)) as tagsum
        FROM " 
TABLE_PREFIX "tagthread AS tagthread
        LEFT JOIN " 
TABLE_PREFIX "thread AS thread ON (tagthread.threadid = thread.threadid)
        
$tachyjoin
        
$hook_query_joins
        WHERE tagthread.tagid IN(
$tag[tagid]) AND
            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
        GROUP BY thread.threadid
        HAVING tagsum=
$tag[tags]
        ORDER BY lastpost DESC
        LIMIT " 
intval($vbulletin->options['maxresults'])
    ); 
Почему у меня LEFT JOIN а не INNER JOIN - когда делал Explain в варианте с LEFT JOIN получилось немного быстрее чем с INNER JOIN и меньшее количество полей в базе было прочитано. Хотя это все может зависеть от специфики конкретных форумов - у одних мало меток много тем, у других наоборот много меток и мало тем.
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Yoskaldyr, вопрос такой. У тебя $tag[tagid] это массив или одно значение? Я думал, что $tag[tagid] выводит только 1 значение. Именно по этому у меня после выполнения запроса $tag идет while, создание массива и потом implode() для представления его в виде (1,2,3). Или это просто лишние телодвижения?

Ну в общем логика у меня была такая.
1. Находим id всех перечисленных в поиске меток.
2. Преобразуем полученный массив в строку типа (1,2,3,4).
3. Выполняем поиск тем. При этом проводим группировку по id тем и (как ты подсказал, еще раз спасибо) считаем вхождение меток в теме.
4. Если логика ИЛИ, то мы игнорируем количество вхождений и создаем массив id отобранных тем. Если логика И, то мы сначало проверяем на соответствие количество токенов = количество вхождений меток в теме, в случае соответствия заносим в массив id отобранных тем.

В общем мне не до конца понятна конструкция $tag[tagid] - это массив вида (1,2,3) или одно значение.
 
Old  
Yoskaldyr
Специалист
Default 0

SMak044, В моем коде $tag[tagid] - это строка с набором тегов через запятую
$tag[tags] - количество тегов.
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Quote:
Originally Posted by Yoskaldyr View Post
$tag[tags] - количество тегов.
Попробовал и то и тот запрос. Но у меня маленькая база и тего не много, ток, что результат одинаковый.

Но подсмотрел в твоем варианте использование
HAVING tagsum=$tag[tags]

Это правильно, но сразу увидел, что если использовать его в таком виде, то мы получаем ограничение при поиске с любой из меток. Думаю в этом случае должно выглядеть так
HAVING tagsum >= $tag[tags]

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

Как думаешь такая логика правильная?

Еще один вопрос к тебе. Есть ли смысл делать продукт к булке? я сделал, но кроме 2 фраз туда ничего не всунул....
 
Old  
Yoskaldyr
Специалист
Default 0

Насчет HAVING tagsum=$tag[tags]
tagsum это SUM(IF (tagthread.tagid IN($tag[tagid]),1,0))
т.е. чтобы нашло темы соответствующие всем меткам (в не 2-м из 3-х заданных например), по любому надо делать проверку именно на точное значение. tagsum > $tag[tags] не может быть в принципе, а если условие по поиску любой из меток, то тогда надо просто 2 разных запроса делать и все.
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Не совсем так.
Мы вычисляем сумму вхождений в каждую тему.
У нас есть 3 метки по которым мы ищем с учетом того, что они все есть в одной теме.
Значит мы получим список тем, где три раза будет повторены все темы где существуют эти метки. сумма нам выдаст в tagsum 3.
Я подумал, что этот же запрос может быть использован и для вывода и тем при поиске или. Мы просто должны в HAVING установить условие >= 1.

D результате нам не надо прописывать еще один запрос. А просто в случае поиска ИЛИ мы переменную $tag[tags] устанавливаем в 1, так как нам собственно все равно сколько вхождений в каждую из тем, главное, что бы > 1.
 
Old  
Yoskaldyr
Специалист
Default 0

SMak044, Для этого надо с начала было сказать что в $tag[tags] будет число 1.
Вообще-то раз все равно идет исправление, то тогда вообще надо использовать iif(...) для различных частей запроса
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Yoskaldyr, Еще раз огромно тебе спасибо.
Я себе на форум уже установил. Все работает замечательно.
Сейчас приведу в порядок описание и выложу в хаки. Решил сделать продукт все же, что бы фразы прописать.
По поводу iif(...) почитаю. Я раньше с этим не сталкивался. Надо разобраться.
 
Old  
SMak044
Эксперт
 
SMak044's Avatar
Default 0

Quote:
Originally Posted by SMak044 View Post
Решил сделать продукт все же, что бы фразы прописать.
Посмотрел, что все же это недоделка.
Решил сделать более цивилизованно.
1. Переименовал файл tags.php в smttags.php
2. Создал группу настроек.
2.1. создал опцию включить/выключить.
3. Создал модуль с заменами в шаблонах.

Но замена не происходит. Покопал и в результате разобрался, что не происходит:
$vbulletin->templatecache[шаблон] = str_replace(addslashes(),addslashes(),$vbulletin->templatecache[шаблон])

Хотя сама функция работает. Что я делаю не так?

Last edited by SMak044 : 10-13-2009 at 12:47 AM.
 
 

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 12:11 PM.


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