Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
Alien2001

Добавление BB-кодов к сообщению до записи в базу

Recommended Posts

У меня опять специфическая задача: необходимо при отправке сообщения его обработать, добавив дополнительные BB-коды по определенному условию.

По функционалу похоже на предварительный парсинг медиа-тегов, когда пользователь добавляет ссылку на Youtube, а в базу сообщение записывается уже с тегом [MEDIA]

 

На первом этапе ищу возможность сделать хук, который бы обрабатывал сообщение после его отправки, но до записи в базу.

Как я понимаю, можно создать хук типа Data Hook, но проблема в том, что его нужно подключать многократно, т.е. отдельно для каждого действия - создания темы, ответа в тему, исправления (для форумов), создания записи для блогов и т.д. Нет ли возможности подключится в другой точке, например, внедрится в фильтр плохих слов? Или еще как-то?

 

Спасибо

Share this post


Link to post
Share on other sites
Обратите внимание

По указанному вами в профиле "Board url" находится не IP.Board, либо модифицированный пиратский скрипт с удаленными копирайтами. Если вы указали неверный URL, пожауйста, поправьте его, потому что он скорее всего потребуется при диагностике вашей проблемы. Нелицензионные скрипты не приветствуются, т.к. зачастую именно некорректное "нуление" и является причиной проблем в них.

Share this post


Link to post
Share on other sites

Создайте свой ббкод с отдельной обработкой в файле.

Share this post


Link to post
Share on other sites

Но ведь BB-коды парсятся при выводе сообщения,а не при записи. Так ведь?

 

У меня же задача следующая: если пользователь добавил в сообщение некий контент, например ссылку на определенный ресурс (список этих ресурсов и будет обрабатываться при анализе), то система насильно заключает этот контент в специальный BB-код. И это нужно сделать не при выводе, а именно при записи

Share this post


Link to post
Share on other sites
Но ведь BB-коды парсятся при выводе сообщения,а не при записи. Так ведь?

А какая разница? В конечном счете все равно это для пользователя делается.

Ну если нужно до занесении в бд, тогда вам поможет метод preDbParse.

Share this post


Link to post
Share on other sites

А какая разница? В конечном счете все равно это для пользователя делается.

Ну если нужно до занесении в бд, тогда вам поможет метод preDbParse.

Спасибо, направление понял.

Share this post


Link to post
Share on other sites

В продолжение задачи.

 

Пытаюсь сделать обработчик для добавления BB-кода, но, поскольку не силен в регулярках, забуксовал.

 

Задача следующая: требуется заключить ссылки на отдельные ресурсы (по списку) в специальный тег, например [sLINK]. Обработка будет происходить до записи в базу.

 

При этом:

  • тегом [sLINK] могут пользоваться все участники сами, заключая в них любые блоки контента, поэтому при разборе всё что уже заключено в этот тег, должно игнорироваться, чтобы избежать вложенности этих тегов
  • под условия подпадают как ссылки в теге , так и обычные ссылки с http, которые тегом url не помечены

Share this post


Link to post
Share on other sites

Решение сделал следующим образом. По ходу немного изменил задачу - решил не выбирать отдельные урлы, а включать внутрь тега весь абзац, где они содержатся:

 

protected function addSlinks( $txt )
{
	if ($txt == '' || !$this->settings['use_slinks']) return $txt;

	///Find and replace acting slink tag 
	$i=-1;
	global $slink_find;
	$txt = preg_replace_callback (
				"|\[slink\](.*?)\[\/slink\]|si", 
				function($matches)  { 
					global $i,$slink_find;
					$i++;
					$slink_find[0][$i] = "<br /><!--NoParse_slink_$i--><br />";
					$slink_find[1][$i] = $matches[0];
					return $slink_find[0][$i];
					},
				$txt);

		///remove error slink tag (without open / close tag)
		$txt = str_ireplace( array( '[slink]', '[/slink]' ), "", $txt );

		$list_values 	= array();
		$list_values 	= explode( "\n", str_replace( "\r", "", $this->settings['slink_list'] ) );


	/// Find slinks in txt 
	foreach($brs = explode('<br />', $txt) AS $key =>  $block)
	{
		if ($block == "") continue;
		foreach ($list_values as $u)
		{
		$u = trim($u);
		if (stripos($block, $u)  !== false ) 
			{
			 $brs[$key] = "[slink]".$block."[/slink]";
			 break;
			}
		}
	}
	$txt =  implode('<br />', $brs);
	$txt =  str_replace ($slink_find[0], $slink_find[1], $txt);
               unset ($slink_find);
	return $txt;
}

 

Этот код нужно вставить в файл core.php (/admin/sources/classes/bbcode/) в конец перед последней закрывающей }, а после строчки:

$txt = $this->badWords($txt);

добавить

$txt = $this->addSlinks($txt);

Ну и также добавить соответствующие настройки в панели управления.

 

Не могу судить, насколько хорошо все вышло, единственное, что мне явно не нравится - это использование global, но не придумал, как этого избежать.

Share this post


Link to post
Share on other sites
$slink_find = array();
$txt = preg_replace_callback (
			"|\[slink\](.*?)\[\/slink\]|si", 
			function($matches) use ($slink_find){ 
				static $i = 0;
				$slink_find;

				$slink_find[0][$i] = "<br /><!--NoParse_slink_$i--><br />";
				$slink_find[1][$i] = $matches[0];

				$i++;
				return $slink_find[0][$i];
			},
			$txt
);

  • Upvote 1

Share this post


Link to post
Share on other sites

Спасибо, но так не работает: переменная $slink_find не видна за пределами callback-функции без назначения ее глобальной перед preg_replace_callback .

Кроме того, при переносе $i внутрь и приращении после присвоения значения $slink_find, строка возврата должна быть return $slink_find[0][($i-1)], собственно потому у меня приращение и было сделано столь странно на первый взгляд.

Share this post


Link to post
Share on other sites

Кроме того, при переносе $i внутрь и приращении после присвоения значения $slink_find, строка возврата должна быть return $slink_find[0][($i-1)], собственно потому у меня приращение и было сделано столь странно на первый взгляд.

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

Кроме того, инкремент делается в конце, тогда не придется делать приращение таким извратным способом с -1.

 

Спасибо, но так не работает: переменная $slink_find не видна за пределами callback-функции без назначения ее глобальной перед preg_replace_callback .

Да, тут получаются разные области видимости у функции родителя и колбэк функции, поэтому объявлять глобальной придется и там и там. Как вариант можно использовать $this

Share this post


Link to post
Share on other sites

Спасибо, со static разобрался. $slink_find пришлось сделать глобальной, ну да ладно.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...