Перейти к контенту

Мод "Похожие темы" для 2.2.x


Рекомендуемые сообщения

ВОТ самый мод. Кстати, мод рабочий - юзай народ.

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

Ссылка на комментарий
Поделиться на других сайтах

		# Get forums we're allowed to read
	foreach ($this->ipsclass->forums->forum_by_id as $k => $v)
	{
		if (! $v['password'] || $this->ipsclass->check_perms($v['read_perms']) == TRUE)
		{
			$forumids[] = $v['id'];
		}
	}

здесь

if (! $v['password'] || $this->ipsclass->check_perms($v['read_perms']) == TRUE)

заменить на

if ((! $v['password'] || $this->ipsclass->check_perms($v['read_perms']) == TRUE)and ! in_array($v['id'], explode(',',$this->ipsclass->vars['similar_hidden_forums']) ))

добавить в админке настройку с ключом similar_hidden_forums

ввод текста одна строка, здесь через запятую номера скрытых разделов

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...
  • 9 месяцев спустя...

мод установился, но не пашет -

пишет вот что

 

Detecting error(s)

Fatal error: Call to undefined method topics::similar_topics() in /home/adrenaline/domains/*****.ua/public_html/sources/action_public/topics.php on line 677

Изменено пользователем VictorKiev
Ссылка на комментарий
Поделиться на других сайтах

Гыг :D

 

Автор мода - извращенец. Он предлагает поставить поиск по БД прямо в отображение топика! Учитывая, что при поиске по LIKE индексы не используются, форум загнётся очень быстро.

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

 

Я себе подобную вещь сделал, но у меня работает перловый индексатор, который создаёт и обновляет индекс похожих тем сам в фоновом режиме, вне зависимости от просмотра какого-либо топика. А при отображении топика только запрашиваются готовые tidы из таблицы индексатора.

Ссылка на комментарий
Поделиться на других сайтах

  • 9 месяцев спустя...

можете взять этот ,он рабочий, у меня на 2.3.3 пашет отлично

 

_CC23__Similar_Topics_v1.0.1.zip

Изменено пользователем VictorKiev
Ссылка на комментарий
Поделиться на других сайтах

А есть такой мод,что бы запрещал создавать одинаковые темы на одном форуме.А то уже надоело по 5 тем в разных разделах просматривать.
Ссылка на комментарий
Поделиться на других сайтах

А есть такой мод,что бы запрещал создавать одинаковые темы на одном форуме.А то уже надоело по 5 тем в разных разделах просматривать.

Вот-вот, что-то мне надоело чатать этот вопрос по десятому разу, может закрыть тему и выдать каждому по предуперждению?

 

Есть мод антидублирования сообщений от Архара, смотрите в архиве. Правда его основное предназначение -- защита от спама, но можно и на неточное совпадение настройить. главное чтобы вы потом не получили плохой отзыв от пользователей, которые темы создавать не смогут. Есть более гуманные методы защиты.

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

А можно этот мод, поставить на версию форума 2.3.6 ?

 

Такой вот вопрос возник, потому что не нашёл мод в архиве.

Ссылка на комментарий
Поделиться на других сайтах

Любой мод для 2.1/2.3, не затрагивающий вывод сообщений, можно поставить на 2.3. Иначе нужно поменять пару строк, не более.
Ссылка на комментарий
Поделиться на других сайтах

  • 5 месяцев спустя...

если кому то нужно

мод похожих тем на странице просмотра темы

по вопросам к автору (т.е. мне) :D

 

открываем /sources/action_public/topics.php

ищем:

// Render the moderator links

Добавляем ВЫШЕ:

	/*-------------------------------------------------------------------------*/
// Similar Topics (by Leonardo)
/*-------------------------------------------------------------------------*/

function similar_topics(){
	$title = $this->ipsclass->stringToLower($this->topic['title']);

	$words = split(' ',$this->topic['title']); $word = "";

	for($ii=0;$ii<count($words);$ii++){
		for($i=1;$i<(count($words)-$ii);$i++){
			if(strlen(html_entity_decode($words[$i]))>2)
				$word .= '%'.$words[$i];
		}
		$word.='%" OR t.title LIKE "';
	}

	$query = '(t.title LIKE "%'.$words[0].$word.'") AND NOT(t.topicprefix=0) AND NOT(t.title="'.$this->topic['title'].'")';

	$query = str_replace('OR t.title LIKE ""','',$query);
	$query = str_replace('OR t.title LIKE "%"','',$query);

	$this->ipsclass->DB->simple_construct( array( 'select' => 't.*, f.id as fid, f.name as fname, m.id as mid, m.name as mname',
												  'from'   => 'topics t LEFT JOIN '.SQL_PREFIX.'forums f ON (t.forum_id=f.id) LEFT JOIN '.SQL_PREFIX.'members m ON (t.starter_id=m.id)',
												  'where'  =>  $query,
												  'order'  => 't.pinned DESC',
												  'limit'  => '5'
										 )	  );
	$this->ipsclass->DB->simple_exec(); $i=0;

	while ( $t = $this->ipsclass->DB->fetch_row() )
	{
		$i++;
		$data['TOPIC'.$i]['tid'] = $t['tid'];
		$data['TOPIC'.$i]['title'] = $t['title'];
		$data['TOPIC'.$i]['fid'] = $t['fid'];
		$data['TOPIC'.$i]['forum'] = $t['fname'];
		$data['TOPIC'.$i]['mid'] = $t['mid'];
		$data['TOPIC'.$i]['author'] = $t['mname'];
	}

	$html = $this->ipsclass->compiled_templates['skin_topic']->similar_topics($data);

	return $html;
}

ищем:

$this->output = str_replace( "<!--IBF.MULTIMOD-->", $this->multi_moderation(), $this->output );

Добавляем НИЖЕ или ВЫШЕ:

$this->output = str_replace( "<!--IBF.SIMILAR_TOPICS-->", $this->similar_topics(), $this->output );

сохраняем, закрываем.

 

Идём в АдминЦентр -> Внешний вид -> /стиль/ -> HTML шаблоны -> skin_topic

создаём новый шаблон similar_topics, входящие переменные $data

вписываем содержимое шаблона:

<if="$data['TOPIC1']['tid']"><br/>
<div class="borderwrap" style='padding-bottom:1px;'>
<div class="formsubtitle" style="padding: 4px;">Похожие темы</div>
<table width='100%'>
<tr><td class="row1" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC1']['tid']}'>{$data['TOPIC1']['title']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC1']['fid']}'>{$data['TOPIC1']['forum']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC1']['mid']}'>{$data['TOPIC1']['author']}</a>
<if="$data['TOPIC2']['tid']">
<tr><td class="row2" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC2']['tid']}'>{$data['TOPIC2']['title']}</a>
<td class="row2" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC2']['fid']}'>{$data['TOPIC2']['forum']}</a>
<td class="row2" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC2']['mid']}'>{$data['TOPIC2']['author']}</a>
</if><if="$data['TOPIC3']['tid']">
<tr><td class="row1" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC3']['tid']}'>{$data['TOPIC3']['title']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC3']['fid']}'>{$data['TOPIC3']['forum']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC3']['mid']}'>{$data['TOPIC3']['author']}</a>
</if><if="$data['TOPIC4']['tid']">
<tr><td class="row2" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC4']['tid']}'>{$data['TOPIC4']['title']}</a>
<td class="row2" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC4']['fid']}'>{$data['TOPIC4']['forum']}</a>
<td class="row2" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC4']['mid']}'>{$data['TOPIC4']['author']}</a>
</if><if="$data['TOPIC5']['tid']">
<tr><td class="row1" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC5']['tid']}'>{$data['TOPIC5']['title']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC5']['fid']}'>{$data['TOPIC5']['forum']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC5']['mid']}'>{$data['TOPIC5']['author']}</a>
</if>
</table>
</div></if>

разве что неуверен работает ли различие между "Таким Названием" и "тАКИМ нАЗВАНИЕМ"

Ссылка на комментарий
Поделиться на других сайтах

<if="$data['TOPIC1']['tid']"><br/>
<div class="borderwrap" style='padding-bottom:1px;'>
<div class="formsubtitle" style="padding: 4px;">Похожие темы</div>
<table width='100%'>
<tr><td class="row1" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC1']['tid']}'>{$data['TOPIC1']['title']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC1']['fid']}'>{$data['TOPIC1']['forum']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC1']['mid']}'>{$data['TOPIC1']['author']}</a>
....
<tr><td class="row1" style="padding: 4px;">
<a href='index.php?showtopic={$data['TOPIC5']['tid']}'>{$data['TOPIC5']['title']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showforum={$data['TOPIC5']['fid']}'>{$data['TOPIC5']['forum']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showuser={$data['TOPIC5']['mid']}'>{$data['TOPIC5']['author']}</a>
</if>
</table>
</div></if>

Гыгыгыгы!!! Свежий код из индии)))

Ссылка на комментарий
Поделиться на других сайтах

ну извините я не знаю как делать циклы используя api шаблонов
Ссылка на комментарий
Поделиться на других сайтах

А почему циклы-то? Что за идиотская конструкция с именами в массиве типа "topic1"..."topic5"? В чем смысл?

 

		$data = array(); // не мешало бы объявить переменную
	while ( $t = $this->ipsclass->DB->fetch_row() )  
		$data[] = array( 'tid' => $t['tid'], 'title' => $t['title'], 'fid' => $t['fid'], 'forum' => $t['fname'], 'mid' => $t['mid'], 'author' => $t['mname']);
	$html = $this->ipsclass->compiled_templates['skin_topic']->similar_topics($data);

 

<div class="borderwrap" style='padding-bottom:1px;'>
<div class="formsubtitle" style="padding: 4px;">Похожие темы</div>
	<table width='100%'>
<foreach="$data as $topic">
<tr>
<td class="row1" style="padding: 4px;"><a href='index.php?showtopic={$topic['tid']}'>{$topic['title']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showforum={$topic['fid']}'>{$topic['forum']}</a>
<td class="row1" style="padding: 4px;"><a href='index.php?showuser={$topic['mid']}'>{$topic['author']}</a>
</tr>
</foreach>
	</table>
</div>
</div>

 

А вот этот ужас:

		$title = $this->ipsclass->stringToLower($this->topic['title']);

	$words = split(' ',$this->topic['title']); $word = "";

	for($ii=0;$ii<count($words);$ii++){
		for($i=1;$i<(count($words)-$ii);$i++){
			if(strlen($words[$i])>3)
				$word .= '%'.$words[$i];
		}
		$word.='%" OR t.title LIKE "';
	}

	$query = '(t.title LIKE "%'.$words[0].$word.'") AND NOT(t.topicprefix=0) AND NOT(t.title="'.$this->topic['title'].'")';

	$query = str_replace('OR t.title LIKE ""','',$query);
	$query = str_replace('OR t.title LIKE "%"','',$query);

 

похоже призван выполнять вот это:

		$title = $this->ipsclass->stringToLower($this->topic['title']);		
	$words = explode(" ", $title);
	$sub_q = " t.title LIKE ";
	while (list($key, $val) = each($words))
		if(strlen($val) < 3)
			unset($words[$key]);  
		else	$words[$key] = "'%".$val."%'"; //кстати, тут бы не мешало проверочу на LIKE-символы вроде % в составе слов
	if(sizeof($words) > 0)
		$query = " ( ".$sub_q.implode(" OR ".$sub_q, $words)." ) AND NOT(t.topicprefix=0) AND NOT(t.title="'.$this->topic['title'].'")'; // кстати, проверка именно по title - тупо, быстрее по id
	else	$query = "t.title = ''";

Изменено пользователем Ritsuka
Ссылка на комментарий
Поделиться на других сайтах

я таки забыл исключить из кода topicprefix...

и я сделал так как мне понятно и так как у меня работает)

Ссылка на комментарий
Поделиться на других сайтах

Да никто и не возражает ;) равно как и я не претендую на идеальность моего кода :D

 

Единственно что скажу - вы совершенно напрасно игнорируете специфичные операторы PHP - писать на примитивах типа FOR не только неудобно, но и непонятно читающему потом код :)

Ссылка на комментарий
Поделиться на других сайтах

можете взять этот ,он рабочий, у меня на 2.3.3 пашет отлично

 

_CC23__Similar_Topics_v1.0.1.zip

 

 

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

Ссылка на комментарий
Поделиться на других сайтах

Ritsuka: я не пользуюсь тем в чём не уверен :D

 

paulg: вероятно там нужно изменить метод сортировки в sql запросе

Ссылка на комментарий
Поделиться на других сайтах

  • 11 месяцев спустя...

Присоединиться к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.