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

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

http://punbb.ru/downloads/anycodetool.7z
http://punbb.ru/downloads/anycodetool.zip

Данное расширение предназначено для разработчиков, но может быть использовано кем угодно.
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 и функцию экспорта, чтобы можно было выгружать решения в обычные расширения и продавать буржуям.

http://punbb.ru/downloads/anycodetool.7z
http://punbb.ru/downloads/anycodetool.zip

Захочешь — найдешь время, не захочешь — найдешь причину.
+ 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.

И еще - нам было бы приятно, если бы это расширение появилось в этом списке: http://punbb.informer.com/wiki/punbb13/extensions

Сайт 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.

Я вобщем-то написал уже, что в планах есть сделать экспорт в расширение.
Спасибо за приглашение на http://punbb.informer.com/wiki/punbb13/extensions обязательно добавлюсь.

8k84 пишет:

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

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

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

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

Поделиться

7 (28.11.2008 04: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 (07.12.2008 20: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 (21.12.2008 12: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
Имена хуков жестко заданы в исходниках, так что если хочешь изменить поведение движка - открывай код и изучай.

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

Поделиться