Добавление BB-кодов к сообщению до записи в базу - Дизайн и модификация Invision Power Board

Перейти к содержимому

 

Правила раздела

Здесь обсуждаются вопросы по настройке и администрированию форумов IPB 3.x.
Пожалуйста, не оффтопьте, если зашли сюда случайно, и обратите внимание на соседние разделы.
Установка, настройка и обслуживание форумов IPB 2.x.
Оформление форумов, включая верстку скинов.
Размещение рекламы на форумах.
SEO оптимизация форума.
Техническая поддержка наших скинов и модов.

СвернутьПрикрепленные теги

Теги не найдены

Страница 1 из 1

Добавление BB-кодов к сообщению до записи в базу Предварительный парсинг сообщения (3.3)

#1 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 30 Октябрь 2013 - 12:19

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

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

Спасибо
0

#2 Пользователь не на сайте   Bot ответил: »

 
 
  • Почетный робот
  • ***
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
 

Отправлено 30 Октябрь 2013 - 12:19

Обратите внимание

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


0

#3 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 718
  • Регистрация: 20-Март 09
  • Репутация: 2 267
  • IPB version:3.1.x
 

Отправлено 30 Октябрь 2013 - 12:33

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

#4 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 30 Октябрь 2013 - 13:26

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

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

#5 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 718
  • Регистрация: 20-Март 09
  • Репутация: 2 267
  • IPB version:3.1.x
 

Отправлено 30 Октябрь 2013 - 18:05

Цитата

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

А какая разница? В конечном счете все равно это для пользователя делается.
Ну если нужно до занесении в бд, тогда вам поможет метод preDbParse.
0

#6 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 31 Октябрь 2013 - 15:50

Просмотреть сообщениеsiv1987 30 Октябрь 2013 - 18:05 сказал(а):

А какая разница? В конечном счете все равно это для пользователя делается.
Ну если нужно до занесении в бд, тогда вам поможет метод preDbParse.

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

#7 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 13 Ноябрь 2013 - 13:36

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

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

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

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

0

#8 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 18 Ноябрь 2013 - 10:27

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

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

#9 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 718
  • Регистрация: 20-Март 09
  • Репутация: 2 267
  • IPB version:3.1.x
 

Отправлено 18 Ноябрь 2013 - 13:46

	$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
	);

1

#10 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 18 Ноябрь 2013 - 14:36

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

#11 Пользователь не на сайте   siv1987 ответил: »

 
 
  • Advanced
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: IPB Skins Team
  • Сообщений: 8 718
  • Регистрация: 20-Март 09
  • Репутация: 2 267
  • IPB version:3.1.x
 

Отправлено 18 Ноябрь 2013 - 19:16

Просмотреть сообщениеAlien2001 сказал(а):

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

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

Просмотреть сообщениеAlien2001 сказал(а):

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

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

#12 Пользователь не на сайте   Alien2001 ответил: »

 
 
  • Member
  • **
  • Insert nick to fast reply form
  • Quote selected text to fast reply form
  • Группа: Пользователи
  • Сообщений: 92
  • Регистрация: 26-Июль 12
  • Репутация: 10
  • IPB version:3.3.x
 

Отправлено 20 Ноябрь 2013 - 13:04

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

Сообщить об этой теме:


Страница 1 из 1


Быстрый ответ

  

1 пользователей читают эту тему
0 зарегистрированных, 1 гостей, 0 скрытых


Контактная информация

Вопросы по работе сайта

+7 (917) 501-4765
C 10 до 20 в рабочие дни (время московское)

Техническая поддержка

Контактные данные специалистов

Дизайн форумов

IPB 3.x ¦ IPB 2.x

Бесплатные шаблоны

IPB 3.2 – 3.4 ¦ IPB 3.1 ¦ IPB 3.0 ¦ IPB 2.2 – 2.3 ¦ IPB 2.1 ¦ Клипарт
Лицензия на использование ¦ Ваша поддержка ¦ О проекте
Copyright © 2005-2016 IPBSkins.ru Team
При копировании материалов с сайта
прямая ссылка на источник обязательна