Навеяно темой
BBcode для программистов, а именно необходимостью не просто осуществлять тупую подстановку HTML-шаблона при обработке BB-кодов, но и обрабатывать предварительно переданные пользователем опции и параметром некоторым скриптом (например, для создания таблицы или см. пример из темы по ссылке выше). Что делать?
Для начала добавляем поле 'phpeval' к таблице 'bbcode' в phpMyAdmin или запросом в админке:
Code:
ALTER TABLE `vb_bbcode` ADD `phpeval` TEXT NULL DEFAULT NULL;
В этом поле будет храниться некий PHP-код, который мы потом будем вызывать при каждой обработке соответствующего тэга.
Далее потребуется произвести некоторые замены в стандартных вобловских классах. Сделать это плагинами не получится -- только ручная правка скрипта (
хотя есть один вариант), потому нужно быть особо внимательным при этом и сохранить на всякий пожарный исходные версии скриптов.
Открываем "includes/class_bbcode_alt.php", ищем
PHP Code:
$bbcodes = $this->registry->db->query_read_slave("
SELECT bbcodetag, bbcodereplacement, twoparams
FROM " . TABLE_PREFIX . "bbcode
");
и меняем на
PHP Code:
$bbcodes = $this->registry->db->query_read_slave("
SELECT bbcodetag, bbcodereplacement, twoparams, phpeval
FROM " . TABLE_PREFIX . "bbcode
");
Замена потребуется в нескольких местах! Эта замена заставит выбирать воблу из базы наше дополнительное поле.
Открываем "includes/class_bbcode.php", ищем
PHP Code:
$this->tag_list["$has_option"]["$customtag[bbcodetag]"] = array(
'html' => $customtag['bbcodereplacement'],
и добавляем на следующей строке
PHP Code:
'eval' => $customtag['phpeval'],
Это добавление тоже потребуется сделать в нескольких местах! Необходимо для сохранения нашего поля в массиве BB-кодов.
В этом же скрипте находим
PHP Code:
// now do the actual replacement
и вставляем ниже
PHP Code:
if ($tag_info['eval'])
{
eval($tag_info['eval']);
}
Это добавление тоже потребуется сделать в нескольких местах! Думаю понятно, что это нужно для собственно выполнения кода.
Вобщем все. Остается только модифицировать админку таким образом, чтобы она позволяла создавать и редактировать данный параметр BB-кода. Для этого открываем скрипт "admincp/bbcode.php", ищем
PHP Code:
print_submit_row($vbphrase['save']);
и перед этим вставляем в первом случае (создание)
PHP Code:
print_textarea_row('PHP-Code', 'phpeval', '', 5, 60);
а во втором (редактирование)
PHP Code:
print_textarea_row('PHP-Code', 'phpeval', $_bbcode['phpeval'], 5, 60);
В форму создания/редактирования BB-кода добавится поле 'PHP-Code'.
Поле добавилось, но нужно еще и обрабатывать переданные данные. В том же скрипте ищем
PHP Code:
'buttonimage' => TYPE_STR
и добавляем выше строку
PHP Code:
'phpeval' => TYPE_STR,
Это добавление тоже потребуется сделать в нескольких местах!
Не закрываем скрипт: данные обработаны -- осталось модифицировать запросы к БД т.о., чтобы они сохраняли значение нашего дополнительного поля. Ищем
PHP Code:
INSERT INTO " . TABLE_PREFIX . "bbcode
(bbcodetag
и заменяем на
PHP Code:
INSERT INTO " . TABLE_PREFIX . "bbcode
(bbcodetag, phpeval
Ищем
PHP Code:
VALUES
('" . trim($db->escape_string($vbulletin->GPC['bbcodetag'])) . "',
и добавляем ниже
PHP Code:
'" . trim($db->escape_string($vbulletin->GPC['phpeval'])) . "',
Ищем
PHP Code:
UPDATE " . TABLE_PREFIX . "bbcode SET
и добавлем ниже
PHP Code:
phpeval = '" . $db->escape_string($vbulletin->GPC['phpeval']) . "',
Все. Теперь при создании/редактировании BB-кода можно указывать, какой PHP-код необходимо выполнить для обработки "{option}" и "{param}". Например:
PHP Code:
// обработка {param} -- преобразуем все символы к заглавным
$open['data'] = strtoupper($open['data']);
// обработка {option} -- преобразуем спецсимволы в соответствующие html-сущности
$open['option'] = htmlspecialchars($open['option']);
Тестировалось на версии 3.6.8 (все никак для тестов не поставлю версию по-новее), но думаю, без проблем пойдет и на более поздних.