1 (28.11.2008 15:37 отредактировано hcs)

Тема: [Релиз] AnyCode Tool (1.0.0 Beta)

(Please log in or register to see this URL)
(Please log in or register to see this URL)

Данное расширение предназначено для разработчиков, но может быть использовано кем угодно.
AnyCode позволяет внедрять код пхп в ядро форума "на коленке", не создавая расширения, используя механизм хуков.
По сути в системе появляется параллельный механизм расширений, которые можно редактировать "не отходя от кассы".

Примеры использования.

Задача 1
Показать рекламный блок гостям - после первого сообщения в теме, зарегистрированным пользователям - перед формой ответа.

Решение
1. Создаем решение (solution)  с именем Google_Adsense (имя решения должно быть обязательно латиницей до 42 символов, допускаются символы _- и цифры) на соответсвующей вкладке в панели администратора
2. Создаем хуки, тоже в соответсвующей вкладке, заполняем поля следующим образом:
имя 1 хука: vt_row_pre_display
код хука:

if ($forum_page['item_count'] == 2 && $forum_user['is_guest']) {
    echo 'Рекламный блок для уважаемого гостя';
}

жмем "добавить"
2 хук имя: vt_end
код:

if ($forum_page['item_count'] == 1 && $forum_user['is_guest']) {
    echo 'Рекламный блок для уважаемого гостя';
}

жмем "добавить"
3 хук имя: vt_quickpost_pre_display
код:

if (!$forum_user['is_guest']) {
    if($forum_user['g_id']=FORUM_ADMIN)
        echo 'Админу рекламу не показываем, мы ево любим ;)';
    else
        echo
            ' Рекламный блок для зарегистрированного пользователя';
}

жмем "добавить".
Если решение не было ранее активировано, то активируем на странице решений, после чего в просмотре темы можем наблюдать соответсвующие изменения.

Задача 2
Убрать надпись Зарегистрирован в инфо пользователя в сообщении
Решение
Обнуляем переменную $forum_page['author_info']['registered'] В хуке vt_row_pre_display:
Код ддля хука:

unset($forum_page['author_info']['registered']);

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

Таким образом можно наращивать функциональность, менять стандартное решение на свое, корректировать работу форума не меняя ядро и не дожидаясь, когда добрый дядя сделает нужное расширение.
Если что-то хочешь сделать - сделай это сам! smile

Мод имеет статус BETA, поэтому все последствия на вашей совести. Принимаю замечания, предложения, баг-репорты и материальные вознаграждения.
В планах сделать секции install-uninstall и функцию экспорта, чтобы можно было выгружать решения в обычные расширения и продавать буржуям.

(Please log in or register to see this URL)
(Please log in or register to see this URL)

Захочешь — найдешь время, не захочешь — найдешь причину.
+ U#0

Поделиться

2

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

ууу....классная штука. Будем пробовать

Поделиться

3

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Классная идея расширения. Правда, оно у меня сразу не заработало, причины выяснять не стал, нужно было 1.3.1 выпускать smile Позже посмотрю еще раз.

В этом расширении можно было бы реализовать интересную функцию - экспортировать solution как обычное расширение - записать код хуков, дополненный другими полями, в manifest.xml.

И еще - нам было бы приятно, если бы это расширение появилось в этом списке: (Please log in or register to see this URL)

Сайт parpalak

Поделиться

4

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Действительно работает в FF. Супер-прога! Спасибо, hсs.

Добавлено спустя     3 минуты   26 секунд:
Кстати, не понял, почему на панели "Delete Solution" поле называется "Add to solution"?

http://clip2net.com/clip/m11893/1227848477-clip-10kb.png

Поделиться

5

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Обнаружилась типа дыра: модераторы видят панель AnyCode, хотя, по идее, она должна быть доступна только админам.

Поделиться

6

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Ну это не дырка, просто недоработка, причем я её знаю и помню. Мне главное работоспособность в целом доказать.

Добавлено спустя     6 минут   48 секунд:
С ошибкой добавления хука я разобрался, проблема во взаимодействии Codepress и некоторых браузеров. Я не стал заморачиваться и выкинул Codepress, все работает отлично.

parpalak пишет:

В этом расширении можно было бы реализовать интересную функцию - экспортировать solution как обычное расширение - записать код хуков, дополненный другими полями, в manifest.xml.

Я вобщем-то написал уже, что в планах есть сделать экспорт в расширение.
Спасибо за приглашение на (Please log in or register to see this URL) обязательно добавлюсь.

8k84 пишет:

Кстати, не понял, почему на панели "Delete Solution" поле называется "Add to solution"?

Спасибо, исправлю.

Добавлено спустя     43 минуты   17 секунд:
Расширение обновлено:
исправлена ошибка в некоторых браузерах
исправлены неправильные надписи
исправлены диагностические сообщения
удален доступ модераторов к расширению (требует доработки, чтобы не выводились ссылки)

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

7 (28.11.2008 17:56 отредактировано 8k84)

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Пардон за дурацкий вопрос: откуда можно качнуть обновленный вариант?

И как его обновлять? Надо удалить старую версию, потом установить новую, и писать заново все решения и хуки?
Или как-то попроще?

Поделиться

8

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Обновленный вариант в первом сообщении. Достаточно переписать поверх. В управлении расширениями будет предложено обновить. Не могу дать гарантий, но у меня обновилось без проблем, решения остались.

Добавлено спустя   1 час   15 минут   55 секунд:
Как мне нравится это расширение!

Задача 4
Показать в списке форумов вместо даты последнего сообщения - название темы
Решение:
Создать решение last_topic_title_on_forum_index (если хотите можно назвать и короче, ваше право)
хук №1 in_qr_get_cats_and_forums
код к хуку:

$query['SELECT'] .=', t.subject';
$query['JOINS'][] = array(
    'LEFT JOIN'    => 'topics AS t',
    'ON'        => 'f.last_post_id=t.last_post_id'
);

хук №2

in_normal_row_pre_display

код к хуку:

$forum_page['item_body']['info']['lastpost'] = str_replace(array(format_time($cur_forum['last_post']), '<cite>'),array(forum_htmlencode($cur_forum['subject']), '<cite>'.format_time($cur_forum['last_post']).'</cite><cite>'),
$forum_page['item_body']['info']['lastpost']);

Активируем решение. Смотрим результат. Восторгаемся. Проникаемся глубоким уважением к автору :-)

Учитывая, что некоторые вебмастера нагородили кучу хаков к 1.2, то миграция на 1.3 с таким расширением будет менее сложная. Конечно расширений вроде лички и загрузки файлов AnyCode не заменит, но решить часть проблем типа вышерешённых - запросто.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

9

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Скачал, проверил - сейчас заработало без проблем. В общем, крутое расширение. Пользователи будут рады smile

Сайт parpalak

Поделиться

10

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

hcs пишет:

Проникаемся глубоким уважением к автору :-)

Уже проникаюсь, замечательная идея расширения. Это праздник какой-то! Нужно руссифицировать smile

У каждого свой взгляд на мир.

Сайт coordinator

Поделиться

11

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Задача 5
Кто сейчас просматривает эту тему?
Решение
На основе кода "кто в онлайне" из индекса.

Хук №1:
vt_start

    $query = array(
        'SELECT'    => 'o.user_id, o.ident',
        'FROM'        => 'online AS o',
        'WHERE'        => 'o.idle=0 AND o.prev_url=\''.get_current_url(255).'\'',
        'ORDER BY'    => 'o.ident'
    );

    $result = $forum_db->query_build($query) or error(__FILE__, __LINE__);
    $forum_page['num_guests'] = $forum_page['num_users'] = 0;
    $users = array();
    
    while ($forum_user_online = $forum_db->fetch_assoc($result))
    {
        
        if ($forum_user_online['user_id'] > 1)
        {
            $users[] = ($forum_user['g_view_users'] == '1') ? '<a href="'.forum_link($forum_url['user'], $forum_user_online['user_id']).'">'.forum_htmlencode($forum_user_online['ident']).'</a>' : forum_htmlencode($forum_user_online['ident']);
            ++$forum_page['num_users'];
        }
        else
            ++$forum_page['num_guests'];
    }

require_once FORUM_ROOT.'lang/'.$forum_user['language'].'/index.php';
    
    $forum_page['online_info'] = array();
    $forum_page['online_info']['guests'] = ($forum_page['num_guests'] == 0) ? $lang_index['Guests none'] : sprintf((($forum_page['num_guests'] == 1) ? $lang_index['Guests single'] : $lang_index['Guests plural']), forum_number_format($forum_page['num_guests']));
    $forum_page['online_info']['users'] = ($forum_page['num_users'] == 0) ? $lang_index['Users none'] : sprintf((($forum_page['num_users'] == 1) ? $lang_index['Users single'] : $lang_index['Users plural']), forum_number_format($forum_page['num_users']));

Хук №2: vt_end

    ?>
<div id="brd-online" class="gen-content">
    <h3 class="hn"><span><?php printf($lang_index['Currently online'], implode($lang_index['Online stats separator'], $forum_page['online_info'])) ?></span></h3>
<?php if (!empty($users)): ?>    <p><?php echo implode($lang_index['Online list separator'], $users) ?></p>
<?php endif;?>
</div>
<?php

Во втором хуке можно $lang_index['Currently online'] заменить на что-нибудь вроде 'Просматривают тему ( %s )'

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

12

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

А с обтеканием изображений, как в modernbb_code можно?
У меня из-за недостатка знаний не получилось.

У каждого свой взгляд на мир.

Сайт coordinator

Поделиться

13

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

задачу 3 потеряли wink
лучше бы список всех возможностей в один пост, или по порядку, чтобы не искать smile

Сайт Wolverine

Поделиться

14

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Ну пусть эта задача будет под №3

Задача №3
Склейка сообщений
Решение
хук №1
po_qr_get_topic_forum_info

$query['SELECT'] .= ', p.id AS post_id, p.poster_id, p.message, p.posted';
$query['JOINS'][] = array(
                'LEFT JOIN'    => 'posts AS p',
                'ON'        => 't.last_post_id=p.id AND p.poster_id='.$forum_user['id']
            );

хук №2
vt_quickpost_pre_fieldset_end

if ($forum_page['is_admmod']) { ?>
            <div class="txt-set set2">
                <div class="txt-box textarea required">
                    <label for="fld2"><span><?php echo $lang_hcsmrg['Merge posts label'] ?></span></label>
                    <input type="checkbox" name="merge" value="1" checked="checked" /><?php echo $lang_hcsmrg['Merge posts']; ?>
                </div>
            </div>
<?php }

хук №3
po_pre_add_post

//stub
$forum_config['o_merge_timeout'] = 6000;
// end stub

if (!$forum_user['is_guest'] && $cur_posting['poster_id']!=NULL && $cur_posting['message']!=NULL && time()-$cur_posting['posted']<$forum_config['o_merge_timeout'] && (($forum_page['is_admmod'] && isset($_POST['merge'])) && $_POST['merge'] == 1 || !$forum_page['is_admmod'])) {
    if (strlen($message) + strlen($cur_posting['message'])  < FORUM_MAX_POSTSIZE_BYTES) {

function seconds_st($nm)
{
    switch ($nm)
    {
        case 1:
        case 21:
        case 31:
        case 41:
        case 51:
            $st = 'секунду';
        break;

        case 2:
        case 3:
        case 4:
        case 22:
        case 23:
        case 24:
        case 32:
        case 33:
        case 34:
        case 42:
        case 43:
        case 44:
        case 52:
        case 53:
        case 54:
            $st = 'секунды';
        break;

        default:
            $st = 'секунд';
        break;
    }
    return ' ' . $nm . ' ' . $st;
}

function minutes_st($nm)
{
    switch ($nm)
    {
        case 1:
        case 21:
        case 31:
        case 41:
        case 51:
            $st = 'минуту';
        break;

        case 2:
        case 3:
        case 4:
        case 22:
        case 23:
        case 24:
        case 32:
        case 33:
        case 34:
        case 42:
        case 43:
        case 44:
        case 52:
        case 53:
        case 54:
            $st = 'минуты';
        break;

        default:
            $st = 'минут';
        break;
    }
    return ' ' . $nm . ' ' . $st;
}

function hours_st($nm)
{
    switch ($nm)
    {
        case 1:
        case 21:
            $st = 'час';
        break;

        case 2:
        case 3:
        case 4:
        case 22:
        case 23:
            $st = 'часа';
        break;

        default:
            $st = 'часов';
        break;
    }
    return ' ' . $nm . ' ' . $st;
}

function days_st($nm)
{
    switch ( $nm )
    {
        case 1:
        case 21:
            $st = 'день';
        break;

        case 2:
        case 3:
        case 4:
        case 22:
        case 23:
            $st = 'дня';
        break;

        default:
            $st = 'дней';
        break;
    }
    return ' ' . $nm . ' ' . $st;
}
    
        $merged_after = (time() - $cur_posting['posted']);
        $merged_sec = $merged_after % 60;
        $merged_min = ($merged_after/60) % 60;
        $merged_hours = ($merged_after/3600) % 24 ;
        $merged_days = ($merged_after/86400) % 31;
        $s_st = ($merged_sec) ? seconds_st($merged_sec) : '';
        $m_st = ($merged_min) ? minutes_st($merged_min) : '';
        $h_st = ($merged_hours) ? hours_st($merged_hours) : '';
        $d_st = ($merged_days) ? days_st($merged_days) : '';
        $added = "\n\n".'[color=#808080][i]'.$lang_hcsmrg['Added'].$d_st.$h_st.$m_st.$s_st.': [/i][/color]' . "\n\n"; 
        
        
        $query = array(
            'UPDATE'    => 'posts',
            'SET'        => 'message=\''.$forum_db->escape($cur_posting['message'].$added .$message).'\'',
            'WHERE'        => 'id='.$cur_posting['post_id']
        );        
        $forum_db->query_build($query) or error(__FILE__, __LINE__);
        
        $query = array(
            'UPDATE'    => 'users',
            'SET'        => 'last_post='.$now,
            'WHERE'        => 'id='.$forum_user['id']
        );        
        $forum_db->query_build($query) or error(__FILE__, __LINE__);
        
        if (!defined('FORUM_SEARCH_IDX_FUNCTIONS_LOADED'))
            require FORUM_ROOT.'include/search_idx.php';

        update_search_index('edit', $cur_posting['post_id'], $cur_posting['message'].$message);
                
        if (!$forum_user['is_guest'])     {
            $tracked_topics = get_tracked_topics();
            $tracked_topics['topics'][$tid] = time();
            set_tracked_topics($tracked_topics);
        }        
        redirect(forum_link($forum_url['post'], $cur_posting['post_id']), $lang_post['Post redirect']);
    }
}

хук №4
vt_start

$lang_hcsmrg['Merge posts label'] = 'Склеить сообщение'; 
$lang_hcsmrg['Merge posts'] = 'Сообщение будет склеено с последним, если оно ваше';
$lang_hcsmrg['Added'] = 'Добавлено спустя';

хук №5
po_start

$lang_hcsmrg['Merge posts label'] = 'Склеить сообщение'; 
$lang_hcsmrg['Merge posts'] = 'Сообщение будет склеено с последним, если оно ваше';
$lang_hcsmrg['Added'] = 'Добавлено спустя';

Добавлено спустя 30 секунд:

Получается что-то вроде этого.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

15

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

последнее понравилось. Теперь для идиотов, как это использовать. Пока ни фига не понял. Надо установить то, что в первом посту вложено?

Поделиться

16

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

crash пишет:

Теперь для идиотов, как это использовать

Идиотам это лучше не использовать вообще, потому что малейшая ошибка может вывести из строя форум.

crash пишет:

Надо установить то, что в первом посту вложено?

Да, надо установить расширение и потом по инструкции создавать решение, добавлять к решению хуки. Потом активировать решение. Важно не перепутать, добавляя хуки к решениям.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

17

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Вопрос по задаче 1: хотелось бы показывать разные блоки в зависимости от категории. Там есть какой-нибудь явный параметр, в зависимости от значения которого можно выбирать разные блоки?

Поделиться

18

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

От категории в смысле раздела форума?
Я вобще ничего не понял, извините за тупость smile

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

19 (08.12.2008 09:41 отредактировано 8k84)

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Да, форум разбит на категории, внутри категорий -- разделы. Хотелось бы показывать разные блоки "рекламы" в зависимости от того, какой категории принадлежит открытая тема.

P.S. На этом форуме реклама вставлена после первого сообщения в теме, хотя вижу ее не как гость. Так задумано?

Поделиться

20

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Реклама отключается в профиле.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

21

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Имелось в виду, что в оригинальном решении для зарегистрированного пользователя реклама ставилась перед формой быстрого ответа.

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

Поделиться

22

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

что-то архив битый. Скачиваю, при открытии ошибка

Поделиться

23 (22.12.2008 01:29 отредактировано DARX)

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Есть ли какие-либо правила называния хуков? Объясните плиз...
Вот я к примеру хочу убрать инфо "Зарегистрирован" в сообщении. Как назвать хук? Или без разницы?

К какому "окружению" привязываются хуки?

Поделиться

24

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

Хук по своему усмотрению называть нельзя smile
Имена хуков жестко заданы в исходниках, так что если хочешь изменить поведение движка - открывай код и изучай.

Захочешь — найдешь время, не захочешь — найдешь причину.

Поделиться

25

Re: [Релиз] AnyCode Tool (1.0.0 Beta)

hcs пишет:

Хук по своему усмотрению называть нельзя smile
Имена хуков жестко заданы в исходниках, так что если хочешь изменить поведение движка - открывай код и изучай.

Спасибо, конечно, опенсорс рулит... Лично для меня разобраться - не проблема. Но думаю хорошим тоном было бы хотя бы немного уделить время для документации. Ваше дело, конечно, но для новичка разобраться будет сложновато. Имхо.

Поделиться