Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

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

 

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

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

 

Спасибо

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

Опубликовано:
Обратите внимание

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

Опубликовано:

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

Опубликовано:
  • Автор

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

 

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

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

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

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

Опубликовано:
  • Автор

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

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

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

  • 2 недели спустя...
Опубликовано:
  • Автор

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

 

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

 

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

 

При этом:

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

Опубликовано:
  • Автор

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

 

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, но не придумал, как этого избежать.

Опубликовано:
$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
);

Опубликовано:
  • Автор

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

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

Опубликовано:

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

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

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

 

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

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

Опубликовано:
  • Автор

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

Создайте аккаунт или войдите в него для комментирования

Сейчас на странице 0

  • Нет пользователей, просматривающих эту страницу.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.