uk en pl it
Web Monarx
BACK NEXT

Пишем модуль для DLE


Новый пост для рубрики Очумелые ручки.

Где-то полгода стабильно пишу модули для DLE, спрос достаточно хороший, правда цены низкие (по сравнению с тем же WP). В этом посте опишу процесс создания двух типов модулей: внутренний и внешний (позже объясню, в чем различие). Перед прочтением учтите, что писалось все это 14 февраля 2011 года, когда финальная версия DLE обозначалась, как 9.2. Возможно, в вашем мае 2033 года уже все изменилось.

Чтобы добавить свой функционал для DLE, нужно знать:

  1. Язык программирования PHP на уровне новичка.
  2. Архитектуру базы DLE и основные встроенные в двиг функции и классы.

Введение в DLE

Весь код в DLE достаточно прост для понимания. Каждая строка — будто бы пример в книге PHP для начинающих. Соответственно, и модули крепятся к каркасу посредством напильника, без всяких изысков, как в WP или Joomla.

Ядро

Архитектура — типичная для большинства самописных CMS. Все начинается с контроллера engine/engine.php. Открываем этот файл, ищем блок:

HTML
Текст


  1. switch ( $do ) {
  2.    //...
  3.    case "deletenews" :
  4.    include ENGINE_DIR . \'/modules/deletenews.php\';
  5.    break;
  6.    //Еще куча вариантов переменной $do
  7. Читатель, знакомый с PHP. уже понял, что это и есть ядро (контроллер) DLE. В конструкции switch-case перечисляют варианты GET переменной $do в адресной строке (?do=deletenews) и, в зависимости от значения этой переменной, подключается тот или иной обработчик. В данном случае — engine/modules/deletenews.php. Что нам мешает добавить свой обработчик для урл «?do=testmodule»? Ничего! Вот, мы уже вплотную приблизились к разгадке тайны написания модулей для DLE.

    Контроллер админки

    У админки свое ядро и свой контроллер. Открываем engine/inc/options.php, видим массив-контроллер (ключ массива (config) — категория в общем меню):

    HTML
    Текст


    1. $options[\'config\'] = array (
    2.    array (
    3.         \'name\' => $lang[\'opt_all\'],
    4.         \'url\' => "$PHP_SELF?mod=options&action=syscon",
    5.         \'descr\' => $lang[\'opt_allc\'],
    6.         \'image\' => "tools.png",
    7.         \'access\' => "admin"
    8.     ),
    9.    //Тут еще куча элементов массива
    10. }

    В этом массиве перечисляются элементы главного меню админки («список всех разделов»), предполагается, что у каждого модуля есть отдельный элемент в этом меню. Каждый элемент массива — еще один маленький массив со следующими элементами (строками):

    • name — название модуля
    • url — урл админки, по которому вызывается данный модуль. В GET переменной mod содержится название php файла из папки engine/inc, который будет подключен при запросе юзером данного уро.
    • desc — описание модуля
    • image — картинка модуля
    • access — права достапа (какие бывают возможные значения — смотрите в options.php)

    Да, установка любого модуля реализована достаточно тупо — пользователя заставляют копировать файлы, открывать исходный код контроллеров и вручную добавлять обработчики. Главное правило, которое программист должен внушать пользователю — «работает — не трожь!!!» тут не действует, пользователь обязан тронуть код, чтобы добавить сторонний модуль.

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

    Работа с базой

    Структура базы DLE очень простая. Открываем базу в phpmyadmin, тратим 10 минут на изучение. Никаких выкрутасов, как в WP, нет. Все банально — таблица постов, таблица категорий, таблица юзеров… Никаких связывающих таблиц, пост привязывается к нескольким категориям посредством перечисления ID категорий а поле category таблица dle_post.

    Для работы с базой есть встроенный класс $db. Работать с ним очень просто:

    HTML
    Текст


    1. $result = $db->query("SELECT * FROM `".PREFIX."_post` WHERE `category` = 1");
    2. while($row = $db->get_row($result)) {
    3.    print_r($row);
    4. }

    PREFIX — префикс таблиц из конфига engine/data/dbconfig.php (см. и другие конфиги папки engine/data, это пригодится).
    Или, если необходимо вернуть одну строку:

    $row = $db->super_query("SELECT * FROM `".PREFIX."_post` WHERE `category` = 1")
    print_r($row);

    Очистка строки (mysqli_real_escape_string):

    $str = $db->savesql($str);

    Вернуть ID последней вставленной строки:

    $id= $db->insert_id();

    Остальные функции класса смотрите в engine/classes/mysql.class.php

    Функции

    Все основные функции DLE перечислены в engine/inc/include/functions.inc.php. Раскладывать их по полочкам здесь нет смысла.

    Написание модуля DLE

    Давайте напишем модуль, который будет… Ну, скажем, выводить все загруженные на сайт картинки на одной странице (типа галереи). О, пока не забыл — стоит рассказать о том, что такое (лично для меня) внешний и внутренний модуль. Внешний модуль — это файл (или несколько файлов), который(ые) нужно скопировать в корень сайта и запустить в браузере. Такой модуль уместен в случае, если это парсер или другой скрипт, который добавляет или модифицирует новости сайта, пользователю достаточно скопировать один файл в корень, без ковыряния движка. Внутренний модуль — это набор файлов, которые добавляют функционал сайту (без ковыряния кода тут уже не обойтись). Начнем с внутреннего модуля (галерея, если кто-то забыл).

    Шаг 1. Добавляем обработчики. Для этого в engine/engine.php в конструкцию switch добавляем новый вариант для $do:

    HTML
    Текст


    1. case "galery" :
    2. include ENGINE_DIR . \'/modules/galery.php\';
    3. break;

    Теперь добавим элемент меню для админки. В engine/inc/options.php ищем массив $options[\'config\'] и добавляем туда новый элемент:

    HTML
    Текст


    1.    array (
    2.         \'name\' => "Галерея",
    3.         \'url\' => "$PHP_SELF?mod=galery",
    4.         \'descr\' => \'Галерея DLE\',
    5.         \'image\' => "rules.png",
    6.         \'access\' => "admin"
    7.     ),

    Мы присвоили нашему модулю урл /admin.php?mod=galery. При каждом обращении к этому урл, будет подключаться файл engine/inc/galery.php (его содержание рассмотрим позже). Вообще, массив $options не является контроллером, это всего-лишь перечисление элементов меню. Можно просто создать файл engine/inc/galery.php и обращаться к нашему модулю через адресную строку браузера.

    Кстати, не совсем понимаю, почему разработчики DLE заставляют прописывать обработчик в engine/engine.php. Ведь можно, как в админке, искать переданный в урл файл в определенной папке, поключать его автоматически, если он существует.

    Шаг 2. Создаем engine/modules/galery.php (обработчик ?do). Важно: файл должен начинаться с проверки «на вшивость»:

    if(!defined(\'DATALIFEENGINE\')) die("Hacking attempt!");

    Так мы обезопасим наш модуль от вызова напрямую, без обработки $_GET[do] ядром двига.
    Далее, получаем все загруженные картинки одним запросом к базе (они хранятся в таблице dle_images), забиваем картинками переменную $content. Немного усложним задачу, пусть атрибут alt картинок содержит заголовок поста, к которому привязана данная картинка.

    HTML
    Текст


    1. <?php
    2. //Защита от хакеров
    3. if(!defined(\'DATALIFEENGINE\')) die("Hacking attempt!");
    4. //В этой переменной и будет html код с картинками
    5. $content = \'\';
    6. //Получаем все картинки
    7. $imagesres = $db->query("SELECT * FROM `".PREFIX."_images`");
    8. //Проходимся в цикле по всем картинкам
    9. while($image = $db->get_row($imagesres)) {
    10.    //Получаем заголовок записи, к которой картинка привязана
    11.    $post = $db->super_query("SELECT `title` FROM `".PREFIX."_post` WHERE `id` = \'$image[news_id]\'");
    12.    //Картинок в одной записи может быть несколько, они разделены "|||"
    13.    $image = explode(\'|||\', $image[\'images\']);
    14.    //Каждую картинку добавляем в $content
    15.    foreach($image as $i) {
    16.        $content .= "<img src=\\"/uploads/posts/$i\\" alt=\\"$post[title]\\" /><br />";
    17.    }
    18. }
    19. //Тут подключаем шаблон
    20. ?>

    Красава! Теперь в $content содержится код вывода всех картинок на сайте. Осталось только подключить шаблон. А это вообще проще простого. Создаем в файл templates/tplname/galery.tpl, вписываем туда {content} и ничего больше. Шаблон готов, осталось только указать на него в нашем модуле. Как вы уже поняли, шаблонизатор DLE занимается преобразованием меток (типа {content}) в html код. Давайте скажем шаблонизатору, что надо подключить шаблон galery.tpl и заменить в нем {content} на содержимое $content. В engine/modules/galery.php добавляем код:

    HTML
    Текст


    1. $tpl->load_template(\'galery.tpl\');
    2. $tpl->set(\'{content}\', $content);
    3. $tpl->compile(\'content\');
    4. $tpl->clear();

    Все, при вызове /?do=galery, наш шаблон galery.tpl вставится внутрь основного шаблона (main.tpl) в нужном месте с уже замененной на html код меткой {content}. Проверяйте. Чтобы узнать подробнее о шаблонизаторе, можете поковырять класс $tpl, он, как и другие классы DLE, находится в engine/classes.

    Шаг 3. Бредово я раскидал процесс по шагам, но, думаю, никто не будет сильно психовать по этому поводу. В общем, тут мы создадим страницу нашего модуля в админке. Я не знаю, что бы такого добавить туда, поэтому дам вам шанс пофантазировать. Настройки там какие-нибудь добавьте или еще чего. Я же покажу, как создать пустую страницу с заголовком «hello, world!».

    Урл нашего модуля — /admin.php?mod=galery, значит создаем файл engine/inc/galery.php следующего содержания:

    HTML
    Текст


    1. <?php
    2. echoheader("galery", \'Управление галереей\');
    3. ?>
    4. <h1>Hello, world!</h1>
    5. <p>Вот и все. Тут можно форму добавить, выше - обработчик формы. В форме чего-то посылать, в обработчике - чего-то сохранять.</p>
    6. <?php
    7. echofooter();
    8. ?>

    Вроде готово. Раскрыто далеко не все, лишь основы. Но, поверьте, пока будете писать свой первый модуль, станете профессиональным модулеписателем, потому что DLE прост, как три копейки.

    Внешний модуль DLE

    Выше я писал, что подразумеваю под внешним модулем. Суть в том, чтобы подключить к файлу все API от DLE, далее работать также, как через ядро описанным выше способом. Делается это в 4 строки:

    HTML
    Текст


    1. <?php
    2. define(\'DATALIFEENGINE\', true);
    3. define(\'ROOT_DIR\', dirname (__FILE__));
    4. define(\'ENGINE_DIR\', ROOT_DIR . \'/engine\');
    5. require_once(ROOT_DIR.\'/engine/init.php\');
    6. //Все, тут можно писать сам модуль.
    7. ?>

    Это в 100 раз удобнее, чем внедряться через ядро engine.php. Скопировать файл (файлы) на сервер и запустить — все, что требуется от пользователя.

    Бонус. Давайте еще добавим сквозную метку для всего сайта. Открываем index.php, ищем строку

    $tpl->compile ( \'main\' );

    Это компиляция шаблона main.tpl. Перед этой строкой вставляем:

    $tpl->set ( \'{SUPERMETKA}\', \'Привет, мир!\' );

    Готово. Теперь строка {SUPERMETKA} в main.tpl будет заименена на «Привет, мир».

Свежие новости: Новости космоса | Обзор: Гаджеты

Сайт является частным собранием материалов и представляет собой любительский информационно-образовательный ресурс. Вся информация получена из открытых источников. Администрация не претендует на авторство использованных материалов. Все права принадлежат их правообладателям