Опубликовано 1 октября 2010, 13:50 под Pelican - The Woods

Писать хаки для vBulletin в окошечке 450x150 без подсветки. Тратить по пол-минуты на вставку фразы через веб-интерфейс, а потом обнаружить, что похожая уже есть. Получасовая халтура (оцененная соответствующе) растягивается на несколько дней. Заказчик и его гениальные идеи, конечно, супер, но с этим ничего не поделать. А вот утомительное программирование в браузере (хуже только IDE для фортрана) вполне можно перенести в любимый редактор. Хак в global_start, приоритет выполнения 1:

$PRODUCT = file_get_contents(DIR . '/PRODUCT.php');
if (preg_match("#PHRASES\s*\{(.*)(\r|\n|\r\n)\}#isU", $PRODUCT, $matches))
{
    foreach (explode("\n", $matches[1]) as $match)
    {
        $match = trim($match);
        if ($match != "")
        {
            list ($phraseName, $phraseValue) = explode(" ", $match, 2);
            $vbphrase[trim($phraseName)] = preg_replace("#\{([0-9]+)\}#", "%\$1\$s", trim($phraseValue));
        }
    }
}
$vBulletinHook = vBulletinHook::init();
if (preg_match_all("#HOOK\((.*)\)\s*\{(.*)(\r|\n|\r\n)\}#isU", $PRODUCT, $matches))
{
    foreach ($matches[0] as $k => $_)
    {
        $vBulletinHook->pluginlist[trim($matches[1][$k])] .= $matches[2][$k];
    }
}

Ну и дальше, очевидно, создаём PRODUCT.php в корне форума:

<?php
PHRASES
{
    playing_chess   Играем в шахматы: до конца света осталось {1} дней
}

HOOK(global_start)
{
    $vbulletin->options['bbtitle'] = construct_phrase($vbphrase['playing_chess'], round((mktime(0, 0, 0, 12, 21, 2012) - time()) / 86400, 0));
}

Хаки init_startup, cache_templates и, может быть, ещё какие-нибудь, выполняться не будут, код без отступов не пройдёт, а в остальном классно. Инсталлятор этого добра на форум выложу в комментарии позже. Сначала нужно доделать работу

Комментарии (2)
themylogin
1 октября 2010, 17:16
S Q #1
Чтобы работало в админке, надо ещё такой же хак в admin_global.

Обещанный вставлятель:
query_write(fetch_query_sql(array(
                'languageid'    =&gt; '-1',
                'varname'       =&gt; $phraseName,
                'fieldname'     =&gt; 'global',
                'text'          =&gt; $phraseValue,
                'product'       =&gt; PRODUCT
            ), 'phrase'));
        }
    }
}
$vBulletinHook = vBulletinHook::init();
if (preg_match_all("#HOOK\((.*)\)\s*\{(.*)(\r|\n|\r\n)\}#isU", $PRODUCT, $matches))
{
    foreach ($matches[0] as $k =&gt; $_)
    {
        $hookName = trim($matches[1][$k]);
        $hookCode = $matches[2][$k];

        $db-&gt;query_write(fetch_query_sql(array(
            'title'         =&gt; $hookName,
            'hookname'      =&gt; $hookName,
            'phpcode'       =&gt; $hookCode,
            'product'       =&gt; PRODUCT,
            'active'        =&gt; '1',
            'executionorder'=&gt; '5',
        ), 'plugin'));
    }
}php
define('PRODUCT', 'private_threads');

// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE & ~8192);

// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT', 'PRODUCT-INSERT');

// ################### PRE-CACHE TEMPLATES AND DATA ######################
// get special phrase groups
$phrasegroups = array();

// get special data templates from the datastore
$specialtemplates = array();

// pre-cache templates used by all actions
$globaltemplates = array();

// pre-cache templates used by specific actions
$actiontemplates = array();

// ######################### REQUIRE BACK-END ############################
require_once('./global.php');

// #######################################################################
// ######################## START MAIN SCRIPT ############################
// #######################################################################

$PRODUCT = file_get_contents(DIR . '/PRODUCT.php');
if (preg_match("#PHRASES\s*\{(.*)(\r|\n|\r\n)\}#isU", $PRODUCT, $matches))
{
    foreach (explode("\n", $matches[1]) as $match)
    {
        $match = trim($match);
        if ($match != "")
        {
            list ($phraseName, $phraseValue) = explode(" ", $match, 2);
            $phraseName = trim($phraseName);
            $phraseValue = trim($phraseValue);

            $db-?
Coming soon: группы фраз, шаблоны
Чтобы работало в админке, надо ещё такой же хак в admin_global. Обещанный вставлятель:<source><?php define('PRODUCT', 'private_threads'); // ####################### SET PHP ENVIRONMENT ########################### error_reporting(E_ALL & ~E_NOTICE & ~8192); // #################### DEFINE IMPORTANT CONSTANTS ####################### define('THIS_SCRIPT', 'PRODUCT-INSERT'); // ################### PRE-CACHE TEMPLATES AND DATA ###################### // get special phrase groups $phrasegroups = array(); // get special data templates from the datastore $specialtemplates = array(); // pre-cache templates used by all actions $globaltemplates = array(); // pre-cache templates used by specific actions $actiontemplates = array(); // ######################### REQUIRE BACK-END ############################ require_once('./global.php'); // ####################################################################### // ######################## START MAIN SCRIPT ############################ // ####################################################################### $PRODUCT = file_get_contents(DIR . '/PRODUCT.php'); if (preg_match("#PHRASES\s*\{(.*)(\r|\n|\r\n)\}#isU", $PRODUCT, $matches)) { foreach (explode("\n", $matches[1]) as $match) { $match = trim($match); if ($match != "") { list ($phraseName, $phraseValue) = explode(" ", $match, 2); $phraseName = trim($phraseName); $phraseValue = trim($phraseValue); $db->query_write(fetch_query_sql(array( 'languageid' => '-1', 'varname' => $phraseName, 'fieldname' => 'global', 'text' => $phraseValue, 'product' => PRODUCT ), 'phrase')); } } } $vBulletinHook = vBulletinHook::init(); if (preg_match_all("#HOOK\((.*)\)\s*\{(.*)(\r|\n|\r\n)\}#isU", $PRODUCT, $matches)) { foreach ($matches[0] as $k => $_) { $hookName = trim($matches[1][$k]); $hookCode = $matches[2][$k]; $db->query_write(fetch_query_sql(array( 'title' => $hookName, 'hookname' => $hookName, 'phpcode' => $hookCode, 'product' => PRODUCT, 'active' => '1', 'executionorder'=> '5', ), 'plugin')); } }</source>Coming soon: группы фраз, шаблоны
osdohtem
2 октября 2010, 05:01
S Q #2
Вова, давай, давай!
Вова, давай, давай!
Добавить комментарий
Войдите через  Доступные тэги: <b>, <i>, <s>, <u>, <a href="">, <img src="" /> (загрузить), <pre>, <quote>
Теги
1nsk Alternative E-Business Embedded GNU/GPL-софт HTML/CSS ICQ KDE last.fm Linux Linuxnsk Live Lyceum game Microsoft Motivator MySQL New Age P2P Party Photoshop PHP Python Qt4/C++ SEO Sibnet thelogin.ru Timelapse Web 2.0 Webdev Webstream Windows Wireless А я говорил! Авто Админ Алексеев Аниме Атмосфера Безобразие Бесплатный Wi-Fi Блоги Большой бизнес Боты Бред Бухать Бытовуха Велосипед Весна Вечер Взлом Винил Винтаж Вконтакте Вода Воспоминания Гетто Гламур Гопота Горский Графити Грузовик Дача Двор Девушки Девченки!!! Деньги Дизайн Дом Домофоны Драка Драки Еда Железо Животные Заведения общественного отдыха Задроты Затулинка Зима Игрушки Игры Идея Интересно Интернет Исследование История Казань Карикатура Квартира Класс Компьютеры Коромшук Коты КПК Кран Красиво Криминал Крыша Курение Лето Литература Лицей Лицей НГТУ Лохи Магнитофоны Маркса Мат Математика Машинный перевод Мегафон Менты Метро Мечты Мифы Мне стыдно Мобайл Можга МТС Музыка Мультикасса Мультики Мы помним Надписи Наука НГТУ Недвижимость Непоняятно Новосибирск Носители Ноутбуки Ночь Обидно Обман Образование Общественный транспорт Омск Опечатки Орфография Осень Парк Периферия Пиратство Плохо Погода Поезд Помойка Праздники Презрение Природа Провайдеры Программирование Протест Радиотехника Растения Реклама Религия и вера Ретро Рисунок Руины Рэп Салют Сервер Серверы Сервис Сериалы Скринкаст Скриншоты Смешно СМИ Снег Собаки Совет Софт Спам Спасём Россию Спецтранспорт Стоп-ляп Стройка Студяга Танцы ТВ Типа страх Трамваи Транс Транспорт Уважаю Ужас Умный дом Утро Филдрепорты Философия Форум ФПМИ Хикки Хостинг Цитатник Школа Школа 208 ЭГ Эксперимент Юго-Западный
Twitter 01-10-2010
Lorem Ipsum
Вставать через 5 часов, ВОЛКОВ Б#&ТЬ! Ну пара серий из четвёртого сезона не повредит, а пока он качается, поем :-(
Lorem Ipsum
Я встретил вашу маму!
Lorem Ipsum
Норм винил Диман респект!
Lorem Ipsum
Дима-дима, продаёт плохие пластинки :(
Lorem Ipsum
меня мордвинец взломал:(
Lorem Ipsum
TY TAKOY TUPOY! @_@
Lorem Ipsum
"А у него девушка на учительской живет! Побрился и поехал на ночь глядя!" Господи, дай мне терпения, осталось меньше месяца :-(
Lorem Ipsum
Твой нос кровоточит!
Lorem Ipsum
Сырой сюрприз в каждой пачке Captain Black :-!
Lorem Ipsum
Не забыть страшную историю про чудо-йогурт, комету и гладильную доску