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

Мод "Похожие темы" для 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 месяцев спустя...

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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

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

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