Здравствуйте. Данный топик хочу посветить созданию простейшего модуля для популярной CMS Datalife Engine. В России, как впрочем и в странах СНГ она пользуется достаточно большой популярностью, однако на хабре статей об этой cms почему-то до сих пор нету. Я попытаюсь исправить это недоразумение. В этой статье вы узнаете о том, как сделать простейший модуль для этой CMS, а также познакомитесь со структурой движка.
Хотелось бы отметить, что система пользуется спросом у сайтов развлекательной тематики. Оно и понятно, система проста в использовании, имеет достаточное количество модулей и шаблонов. Да и почти все нужное есть «из коробки». Однако бывает, что чего-нибудь не хватает. Эту проблему мы постараемся решить.
Вы наверняка заинтересуетесь, почему я выбрал именно эту CMS. Ответ простой: достаточно логичная структура самого движка, отделение шаблонов от кода, довольно простой шаблонизатор, опять же довольно логичное размещение всего внутри — легко разобраться что к чему. Плюс к этому система остается относительно легкой и удобной. Она не так функциональна как, например, Друпал, но все же мне она нравится.
Для начала нам нужно знать кое-что о структуре движка. Нельзя творить на сервере бардак, поэтому мы будем хранить все в своих папках.
Модули для работы движка принято помещать в папку /engine/modules/.
В папке /engine/inc/ находятся файлы панели администратора.
Начиная с версии 8.х появилось подключать модули прямо в шаблоне. Шаблон находится в папке /templates/имя_шаблона/. В этой папке есть файл main.tpl Это корневой файл шаблона, обычно в нем расположена основная структура шаблона. Обычно модуль можно подключить так:
{include file=«engine/modules/mod_category.php»}
Где mod_category.php – файл, находящийся в категории /engine/modules/. Думаю с этим все понятно, поехали дальше.
Давайте сделаем модуль для вывода последних комментариев с кэшированием. Для этого создадим файл в папке /engine/modules/ и назовем его mod_lastcomm.php Далее я привожу листинг кода этого файла с подробными комментариями.
Данный код полностью рабочий. И в нем конечно же есть недостатки. Например не проверяется для ссылок — включено ли ЧПУ. Или при переходе по ссылке на профиль пользователя мы попадаем сразу в его профиль, а не на окошечко jQuery с краткой информацией. Вообщем есть что доработать. Но все эти вещи не были включены сюда только по одной причине — не дать запутаться новичку. Также советую проанализировать другие файлы, например topnews.php. Если у вас возникнут вопросы по написанию модулей или вообще по системе — я с радостью отвечу на них.
На этом у меня все, если эта тема кому-нибудь покажется интересной, то я сделаю цикл статей про cms Datalide Engine (DLE).
Ах да, это моя первая статья на хабре, поэтому извините если что не так.
Введение
Хотелось бы отметить, что система пользуется спросом у сайтов развлекательной тематики. Оно и понятно, система проста в использовании, имеет достаточное количество модулей и шаблонов. Да и почти все нужное есть «из коробки». Однако бывает, что чего-нибудь не хватает. Эту проблему мы постараемся решить.
Почему DLE?
Вы наверняка заинтересуетесь, почему я выбрал именно эту CMS. Ответ простой: достаточно логичная структура самого движка, отделение шаблонов от кода, довольно простой шаблонизатор, опять же довольно логичное размещение всего внутри — легко разобраться что к чему. Плюс к этому система остается относительно легкой и удобной. Она не так функциональна как, например, Друпал, но все же мне она нравится.
Структура
Для начала нам нужно знать кое-что о структуре движка. Нельзя творить на сервере бардак, поэтому мы будем хранить все в своих папках.
Модули для работы движка принято помещать в папку /engine/modules/.
В папке /engine/inc/ находятся файлы панели администратора.
Начиная с версии 8.х появилось подключать модули прямо в шаблоне. Шаблон находится в папке /templates/имя_шаблона/. В этой папке есть файл main.tpl Это корневой файл шаблона, обычно в нем расположена основная структура шаблона. Обычно модуль можно подключить так:
{include file=«engine/modules/mod_category.php»}
Где mod_category.php – файл, находящийся в категории /engine/modules/. Думаю с этим все понятно, поехали дальше.
Давайте сделаем модуль для вывода последних комментариев с кэшированием. Для этого создадим файл в папке /engine/modules/ и назовем его mod_lastcomm.php Далее я привожу листинг кода этого файла с подробными комментариями.
Код
<?php
/* Проверяем на существование константы '<i>DATALIFEENGINE</i>'. Эта константа определяется в index.php
и ее значение TRUE символизирует о том, что файл подключен с помощью include/require, а не просто запущен. */
if(!defined('DATALIFEENGINE'))
{
die("Hacking attempt!");
}
/* Подключаем класс api, для того чтобы нам можно было использовать функции для работы с кэшем. */
include ('engine/api/api.class.php');
/* Пытаемся прочетать информацию, сохраненную в кэше с именем lastcomm. Рекомендую давать осмысленные имена
всему тому, что мы сохраняем в кэше. По сути <b>lastcomm</b> – это файл в папке <i>/engine/cache/</i>,
а <b>60</b> – это время жизни кэша в секундах.
В данном случае, если с создания файла прошло больше времени, чем 60 секунд, то нам снова придется лезть в бд. */
$lastcomm=$dle_api->load_from_cache( "lastcomm", 60);
/* Проверяем – есть у нас кэш или нету. Если нету, то лезем в бд. */
if (!$lastcomm) {
/* Собственно запрос в бд. Он выполняется с помощью функции класса $db.
Константа PREFIX содержит префикс, указанный при установки cms.
Названия столбцов названы вполне нормально, я думаю не нужно объяснять что они делают.
Индефикатор запроса заносим в переменную $sql. */
$sql = $db->query("SELECT comments.post_id, comments.text, comments.autor, post.id, post.flag,
post.category, post.date as newsdate, post.title, post.alt_name
FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post
WHERE post.id=comments.post_id
ORDER BY comments.date DESC LIMIT 0,20");
/* С помощью функции get_row() класса $db считываем последовательно каждую строку из результатов выборки.
Информация заносится в массив $row с индексами равными именам полей таблиц */
while ($row = $db->get_row($sql))
{
/* Если нужно обрезаем заголовок новости */
if (strlen($row['title']) > 50) {
$title = substr($row['title'], 0, 50)."...";
} else {
$title = $row['title'];
}
/* Формируем ссылку на профиль пользователя. Аналогично */
$aname=urlencode($row['autor']);
$name= "<a href=\"".$config['http_home_url']."user/".$aname."/\">". $row['autor'] .'</a>';
/* Формируем текст комментария и если надо обрезаем его */
$text = htmlspecialchars($row['text']);
if (strlen($text) > 1024) $text= substr($text, 0, 1024)."...";
/* Формируем ссылку на новость. Массив $config содержит все настройки системы.
В частности $config['http_home_url'] - это урл домена. */
$newslink = $config['http_home_url'].$row['post_id']."-".$row['alt_name'].".html";
$hint = "onMouseover=\"showhint('$text', this, event, '');\"";
$title = "<a title=\"".$text."\" href=\"".$newslink."\">".stripslashes($title)."</a>";
/* Итоговая запись для одного комментария */
$lastcomm.="От $name в новости: <br /> $title <br /><br />";
}
$db->free();
/* Кэшируем полученные данные. Чтобы получше разобраться с функциями кэширования,
откройте файл 'engine/api/api.class.php' там отлично все закомментировано */
$dle_api->save_to_cache ( "lastcomm", $lastcomm);
}
/* Выводим полученный результат */
echo $lastcomm;
?>
Заключение
Данный код полностью рабочий. И в нем конечно же есть недостатки. Например не проверяется для ссылок — включено ли ЧПУ. Или при переходе по ссылке на профиль пользователя мы попадаем сразу в его профиль, а не на окошечко jQuery с краткой информацией. Вообщем есть что доработать. Но все эти вещи не были включены сюда только по одной причине — не дать запутаться новичку. Также советую проанализировать другие файлы, например topnews.php. Если у вас возникнут вопросы по написанию модулей или вообще по системе — я с радостью отвечу на них.
На этом у меня все, если эта тема кому-нибудь покажется интересной, то я сделаю цикл статей про cms Datalide Engine (DLE).
Ах да, это моя первая статья на хабре, поэтому извините если что не так.