Alien2001 Posted October 30, 2013 Share Posted October 30, 2013 У меня опять специфическая задача: необходимо при отправке сообщения его обработать, добавив дополнительные BB-коды по определенному условию.По функционалу похоже на предварительный парсинг медиа-тегов, когда пользователь добавляет ссылку на Youtube, а в базу сообщение записывается уже с тегом [MEDIA] На первом этапе ищу возможность сделать хук, который бы обрабатывал сообщение после его отправки, но до записи в базу.Как я понимаю, можно создать хук типа Data Hook, но проблема в том, что его нужно подключать многократно, т.е. отдельно для каждого действия - создания темы, ответа в тему, исправления (для форумов), создания записи для блогов и т.д. Нет ли возможности подключится в другой точке, например, внедрится в фильтр плохих слов? Или еще как-то? Спасибо Link to comment Share on other sites More sharing options...
Bot Posted October 30, 2013 Share Posted October 30, 2013 Обратите внимание По указанному вами в профиле "Board url" находится не IP.Board, либо модифицированный пиратский скрипт с удаленными копирайтами. Если вы указали неверный URL, пожауйста, поправьте его, потому что он скорее всего потребуется при диагностике вашей проблемы. Нелицензионные скрипты не приветствуются, т.к. зачастую именно некорректное "нуление" и является причиной проблем в них. Link to comment Share on other sites More sharing options...
siv1987 Posted October 30, 2013 Share Posted October 30, 2013 Создайте свой ббкод с отдельной обработкой в файле. Link to comment Share on other sites More sharing options...
Alien2001 Posted October 30, 2013 Author Share Posted October 30, 2013 Но ведь BB-коды парсятся при выводе сообщения,а не при записи. Так ведь? У меня же задача следующая: если пользователь добавил в сообщение некий контент, например ссылку на определенный ресурс (список этих ресурсов и будет обрабатываться при анализе), то система насильно заключает этот контент в специальный BB-код. И это нужно сделать не при выводе, а именно при записи Link to comment Share on other sites More sharing options...
siv1987 Posted October 30, 2013 Share Posted October 30, 2013 Но ведь BB-коды парсятся при выводе сообщения,а не при записи. Так ведь? А какая разница? В конечном счете все равно это для пользователя делается. Ну если нужно до занесении в бд, тогда вам поможет метод preDbParse. Link to comment Share on other sites More sharing options...
Alien2001 Posted October 31, 2013 Author Share Posted October 31, 2013 А какая разница? В конечном счете все равно это для пользователя делается. Ну если нужно до занесении в бд, тогда вам поможет метод preDbParse.Спасибо, направление понял. Link to comment Share on other sites More sharing options...
Alien2001 Posted November 13, 2013 Author Share Posted November 13, 2013 В продолжение задачи. Пытаюсь сделать обработчик для добавления BB-кода, но, поскольку не силен в регулярках, забуксовал. Задача следующая: требуется заключить ссылки на отдельные ресурсы (по списку) в специальный тег, например [sLINK]. Обработка будет происходить до записи в базу. При этом:тегом [sLINK] могут пользоваться все участники сами, заключая в них любые блоки контента, поэтому при разборе всё что уже заключено в этот тег, должно игнорироваться, чтобы избежать вложенности этих теговпод условия подпадают как ссылки в теге , так и обычные ссылки с http, которые тегом url не помечены Link to comment Share on other sites More sharing options...
Alien2001 Posted November 18, 2013 Author Share Posted November 18, 2013 Решение сделал следующим образом. По ходу немного изменил задачу - решил не выбирать отдельные урлы, а включать внутрь тега весь абзац, где они содержатся: 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, но не придумал, как этого избежать. Link to comment Share on other sites More sharing options...
siv1987 Posted November 18, 2013 Share Posted November 18, 2013 $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 Link to comment Share on other sites More sharing options...
Alien2001 Posted November 18, 2013 Author Share Posted November 18, 2013 Спасибо, но так не работает: переменная $slink_find не видна за пределами callback-функции без назначения ее глобальной перед preg_replace_callback . Кроме того, при переносе $i внутрь и приращении после присвоения значения $slink_find, строка возврата должна быть return $slink_find[0][($i-1)], собственно потому у меня приращение и было сделано столь странно на первый взгляд. Link to comment Share on other sites More sharing options...
siv1987 Posted November 18, 2013 Share Posted November 18, 2013 Кроме того, при переносе $i внутрь и приращении после присвоения значения $slink_find, строка возврата должна быть return $slink_find[0][($i-1)], собственно потому у меня приращение и было сделано столь странно на первый взгляд.Для того и существуют статические переменные, которые инициализируются только один раз при вызове функции и не теряют своего значения после ее отработки функции.Кроме того, инкремент делается в конце, тогда не придется делать приращение таким извратным способом с -1. Спасибо, но так не работает: переменная $slink_find не видна за пределами callback-функции без назначения ее глобальной перед preg_replace_callback .Да, тут получаются разные области видимости у функции родителя и колбэк функции, поэтому объявлять глобальной придется и там и там. Как вариант можно использовать $this Link to comment Share on other sites More sharing options...
Alien2001 Posted November 20, 2013 Author Share Posted November 20, 2013 Спасибо, со static разобрался. $slink_find пришлось сделать глобальной, ну да ладно. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now