Пример создания модуля [Обновлено 15.11.16]

Тема в разделе "Написание модулей/Помощь", создана пользователем Sanya222, 11 ноя 2016.

  1. Sanya222

    Sanya222 Автор Команда форума

    Регистрация:
    6 ноя 2014
    Сообщения:
    366
    Здравствуйте!

    Поскольку нигде толком нет документации по написанию модулей к vme, а некоторые хорошие люди стремятся создавать эти самые модули, было решено создать раздел, где обсуждались бы вопросы по написанию модулей и конкретные примеры. С одной стороны, программистам имеющим опыт в написании скриптов, это даст наводки, каким образом вообще устроена модульная система в движке. А другой стороны, для людей с идеями, но без знаний программирования, появится возможность заказывать модули у тех, кто может реализовать их идей без особого труда (т.к. отсутствие документации усложняет задачу, цена на модуль была значительно больше,чем при заказе напрямую у acrobyte.ru. Надеемся, данный раздел поможет решить данную проблему и заказывать модули будут не только у нас).

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

    Итак, .собственно тема-виновник: тык
    Человек хочет, чтобы в листинге было больше информации о серверах в буст списке.

    Что-то типа, чтобы вместо
    [BOOST] Место №16 занято сервером 195.133.48.224:7777. Кругов: 30
    было
    [BOOST] Место №16 занято сервером 195.133.48.224:7777. В бусте находится 8 дней 20 часов 11 минут (Кругов осталось: 30)

    Это совсем простой модуль, поэтому предлагать платные услуги я и не стал.
    Как и любую задачу, можно решить несколькими способами, модуль можно написать разными вариантами.
    Приведу пример того, как мне удобно. Одновременно рассматривая ситуацию со стороны не знания всего исходного кода, а лишь того, что можно посмотреть.

    1. Первым делом создадим рабочую директорию для нашего модуля и зарегистрируем его
    1. Заходим в include/modules/informal (директория неофициальных модулей)
    2. Создаем новую директорию (называем как хотим, например, listing_boost)
    3. Далее создаем файл, в котором будем писать модуль
    4. Заполняем стандартным содержимым
    5. Составим и выполним запрос для регистрации модуля
    [​IMG]
    [​IMG]
    [​IMG]
    [​IMG]

    2. Теперь нам необходимо открыть шаблон листинга, чтобы увидеть с какими переменными шаблона нам работать
    1. Открываем файл template/default/listing.tpl
    2. Анализируем файл
    [​IMG]
    [​IMG]
    То, что выделено красной рамкой, нас не интересует, т.к. там обычные переменные, для нашей текущей задачи они нам не нужны. Обращаем внимание на то, что выделено зеленой рамкой (там нужная для нас информация).
    Не выделенное нам совсем не нужно.
    Подробней рассмотрим нашу зеленую часть.
    {%*list_boost*} - открытие массива
    {*list_boost*%} - закрытие массива
    {*list_boost:num*}{*list_boost:address*}{*list_boost:rounds*} - элементы массива, судя по названиям и наглядного примера, можно понять, что в них, соответственно, содержатся: место, адрес сервера и количество оставшихся кругов.

    Нам необходимо создать еще один массив, в котором будет содержаться время нахождения сервера в бусте.

    3. Открываем файл модуля (в нашем случае:include/modules/informal/listing_boost/main.php)

    3.1. Делаем выборку из базы данных соответствующую списку буст серверов листинге. Путем анализа базы данных и самого списка, можно увидеть, что сортировка осуществляется по большему значению date_prolongboost
    3.2 Создаем массив данных, в котором будут отдельно храниться значения "время нахождение сервера в бусте"
    3.3 Поскольку нам нужно будет каким-то образом узнать где именно в цикле нам нужно выводить ту или иную информацию, будем также записывать место номер строки (совпадает с тем, что и в официальном модуле листинга т.к. используем одну и ту же сортировку. Без этого мы не сможем правильно "состыковать" время нахождения в бусте с нужным сервером - будут выводиться как им захочется).

    Рассмотрим код:
    PHP:
    <?php
        
    if(!defined('VMEngine_PRO')){ exit("Error access!"); }

        
    /*
            INSERT INTO `modules` (`name`, `path`, `activ`, `cron`, `author`, `skype_author`, `name_script`) VALUES
            ('Listing Boost', 'include/modules/informal/listing_boost/', 1, 0, 'AcrobaT', 'lionheart_name1', 'main.php');
        */

        // Делаем запрос к базе данных. Никаких подключений к бд делать не нужно, используем переменную движка (используется класс pdo).
        // Делаем выборку по date_addboost, остальные данные нам не нужны (в листинге они сами будут подставлены стандартным модулем листинга)
        
    $sql $db->query("SELECT `date_addboost` FROM `servers` WHERE `boost`='1' ORDER BY `date_prolongboost` DESC");
        
    $num_boost 1;
        
    // Строим массив для шаблон с нужными нам данными
        
    while($row $sql->fetch()){
       
            
    // Название массива (любое, но желательно с префиксом модуля)
            
    $DATA['lb_spenttime'][] = array(
            
    // Номер нужен для того, чтобы мы могли правильно сопоставить
            // сервер в листинге и "время нахождения в бусте" из нашего массива в модуле
            
    'num' => $num_boost,
            
    // Назовем наш элемент, например spenttime,
            // прибавив к нему префикс (во избежание совпадений системных имен движка и имен используемых  в модуле) lb
            
    'lb_spenttime' => @$newTime->dateDiff($row['date_addboost'], time()),
            
    // Функция dateDiff возвращает интервал времени, прошедшего между двумя временными отметками
       
            
    );
            
    $num_boost++;
        }
    ?>
    4. Работаем с шаблоном. Выводим новую переменную из нашего модуля в шаблоне в нужном месте в цикле
    4.1 Поскольку у нас уже есть готовый и рабочий код, он уже выполнятся при каждой загрузке страницы (позже мы это исправим и сделаем загрузку нашего модуля только на странице листинга, дабы не создавать не нужной нагрузки).
    4.2 Работаем с шаблоном, в файле template/default/listing.tpl
    Открываем цикл который мы создали в нашем модуле, внутри стандартного цикла (list_boost):
    {%*lb_spenttime*}
    Создаем условие (если номер текущей строки стандартного цикла равен номеру строки нашего цикла, то...):
    {?*list_boost:num=lb_spenttime:num*} (то выводим следующее) В бусте {*lb_spenttime:lb_spenttime*} (название цикла:название элемента цикла, будет заменена на "время нахождения в бусте")
    Закрываем наше условие (обратите внимание, когда открываем условие, знак вопроса впереди, когда закрываем - в конце):
    {*list_boost:num=lb_spenttime:num*?}
    Закрываем цикл (то же самое, только вместо знака вопроса - %):
    {*lb_spenttime*%}
    Цельная строка:
    {%*lb_spenttime*}{?*list_boost:num=lb_spenttime:num*}В бусте {*lb_spenttime:lb_spenttime*}{*list_boost:num=lb_spenttime:num*?}{*lb_spenttime*%}

    Вставляем ее в нужное нам место в шаблоне (туда, где мы хотим видеть этот текст).

    Получается примерно такой кусок
    HTML:
    {%*list_boost*}
    [<font color="#d53737"><b>BOOST</b></font>]
    Место №{*list_boost:num*}</font>
    занято сервером
    <b>{*list_boost:address*}</b>. {%*lb_spenttime*}{?*list_boost:num=lb_spenttime:num*}В бусте {*lb_spenttime:lb_spenttime*}{*list_boost:num=lb_spenttime:num*?}{*lb_spenttime*%}
    Кругов: {*list_boost:rounds*}<br/>
    {*list_boost*%}

    [​IMG]

    Результат:
    [​IMG]

    5. Оптимизируем
    5.1 Чтобы наш модуль каждый раз не выполнял код при загрузке страниц сайт используем переменную $opendir[].
    В данном массиве хранятся открытые в текущий момент времени страницы. Например, если мы откроем страницу domain.ru/main/myserv, переменная $opendir будет следующего вида = array (0 => main, 1 => myserv).
    Исходя из этого создадим проверку на страницу listing. Если открыта страница listing - выполняем код.
    В таких случаях, я предпочитаю использовать switch.

    Получается такой код
    PHP:
    // ...
    // Выполняем код только на странице листинга
        
    switch($opendir[0]){
            case 
    'listing':
            
    // ....
            
    break;
        }
    //..
    6. Модуль готов
    6.1 Если собираемся продавать или распространять бесплатно - пишем мануал по установке.
    6.2 Скачать готовый модуль
     
    Последнее редактирование: 14 ноя 2016
    Andrey нравится это.
  2. xalk

    xalk Постоянный

    Регистрация:
    28 янв 2015
    Сообщения:
    302
    хорошая высол полностью поддерживаю
     
    Sanya222 нравится это.
  3. Andrey

    Andrey Новичок

    Регистрация:
    10 ноя 2016
    Сообщения:
    9
    Очень полезная информация благодарю)))
     
    Sanya222 нравится это.
  4. horreodor

    horreodor Активный

    Регистрация:
    1 окт 2015
    Сообщения:
    163
    эх раньше этого не хватало, когда писал модули =)) приходилось в личку вас донимать... полезная вещь
     
  5. Sanya222

    Sanya222 Автор Команда форума

    Регистрация:
    6 ноя 2014
    Сообщения:
    366
    Никогда не поздно начать снова писать. И от вас статьи тоже будем рады видеть :)
     

Поделиться этой страницей