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

Как сделать ссылки на темы форума читабельными


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

Что это такое?

Допустим пользователь отправляет ссылку на какую то тему с вашего форума. В конечном виде ссылка будет выглядеть таким образом

 

http://your.forum.ru/index.php?showtopic=1

 

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

 

Было бы здорово если вместо голого URL'а темы писалось название этой темы. И выглядело бы это эстетичнее, да и более информативнее.

 

Как сделать?

А делать будем так:

 

Файл /sources/lib/post_parser.php

Ищем:

function regex_build_url($url=array()) {

и добавляем после

global $DB;

Ниже будут строки:

  // Make sure it's a "proper" url
 
 if (!preg_match( "/^(http|ftp|https|news):\/\//i", $url['show'] )) $skip_it = 1;
 
 $show     = $url['show'];

 

Добавляем после них:

  if (stristr($show, "your.forum.ru"))
       { 
        if (preg_match("/showtopic=(\d+)/",$show,$find) || preg_match("/&t=(\d+)/",$show,$find)) 
           { 
              $DB->query("SELECT title FROM ibf_topics WHERE tid=".intval($find[1])); 
              if($DB->get_num_rows()) 
              { 
                $record=$DB->fetch_row(); 
                
                if (preg_match("~p=(\d+)~",$show,$find))
                {
                 $record['title'] = $record['title']." (post #{$find[1]})";
                }
                
                $show = $record['title']; 
              } 
           } 
       }
 else

 

Обратите внимание на строку

if (stristr($show, "your.forum.ru"))

в ней идет проверка на то что ссылка на тему именно вашего форума. Т.е. вместо your.forum.ru вам надо прописать URL без www и http до вашего форума.

 

Например для нашего форума эта строка выглядит так:

if (stristr($show, "ibresource.ru/forums"))

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

  • Ответы 202
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

Что-то не работает...

 

Если просто отвечаешь в тему, то всё в порядке, а вот если в сообщении есть ссылка на тему на моём форуме, то выдаётся

Fatal error: Call to a member function on a non-object in z:\home\localhost\www\forum\sources\lib\post_parser.php on line 1239

Если в инете, то туже ошибку выдаёт.

Форум 1.3.1

 

Адрес форум указан правильно.

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

Fatal error: Call to a member function on a non-object in z:\home\localhost\www\forum\sources\lib\post_parser.php on line 1239

Та же проблема. Тестировал на серваке. IPB 1.1.1 Final.

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

ну да =)

 

маленькая, но важная деталь, которую я забыл

все в том же файле, находим:

function regex_build_url($url=array()) { 

и добавляем после

global $DB; 

 

вот теперь все ок.

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

Всё-таки решился выложить :D

Добавил бы, что это преобразование надо делать перед добавление поста в базу с целью формирования [ URL = ссылка ]название топика [ /URL ], а не в режиме реального времени парса ссылок. Так мы просто расходуем ресуры MySQL зря.

Добавлено в [mergetime]1085887126[/mergetime]

Ой, сорри я забыл что в стандартном IPB в базе лежит html. ;)

Ну значит кусок текста "с целью формирования [ URL = ссылка ]название топика [ /URL ]" надо понимать как

" с целью формирования <a href = "ссылка">название топика</a>" :)

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

Vanish

У меня баг с ФаиндПост :

if (preg_match("~p=(\d+)~",$show,$find))
                       {
                           $record['title'] = $record['title']." (post #{\$find[1]})";
                       }

Вот что вылазит :

 

http://www.donkeyhot.net/images/ostap/bag1.JPG

 

Внутри поста :

[URL=http://www.donkeyhot.net/forum/index.php?showtopic=201&view=findpost&p=108908]АНЕКДОТ (post #{$find[1]})[/URL]

 

Как профиксить с номером поста ? :D

 

Так проканает ?

$record['title'] = $record['title']." (post #". $find[1].")";

????

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

Остап

if (preg_match("~p=(\d+)~",$show,$find)) $record['title'] = $record['title']." (сообщение #".$find[1].")";

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

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

Остап

замени

if (preg_match("~p=(\d+)~",$show,$find))
{
$record['title'] = $record['title']." (post #{\$find[1]})";
}

на

if (preg_match("~p=(\d+)~",$show,$find)) $record['title'] = $record['title']." (¹".$find[1].")";
{
//$record['title'] = $record['title']." (post #{\$find[1]})";
}

мож не очень грамотно, но у меня пофиксилось...

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

j0k3r Работают обе исправлялки и Vanish'а, и Song'а, однако (самый первый код) от Vanish'а выглядит удобнее и красивее, и более правильнее. Там просто перед $find по некоторым причинам после постинга черточка / вставлялась, которая, соответственно к глюкам и приводила (внимательнее посмотрите цитаты возмущающихся) :D

Vanish Благодарствую, этого я давно ждал, и мне очень-то даже помогло уже ;)

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

Ну, учитывая ту "местную" багу цитрирования кода, код и не работал соответственно :D

...однако написан со знанием дела ;)

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

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

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

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

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

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

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

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

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

Зарузка...

×
×
  • Создать...

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

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