Создание простого модуля для CMS Datalife Engine (DLE)

Здравствуйте. Данный топик хочу посветить созданию простейшего модуля для популярной CMS Datalife Engine. В России, как впрочем и в странах СНГ она пользуется достаточно большой популярностью, однако на хабре статей об этой cms почему-то до сих пор нету. Я попытаюсь исправить это недоразумение. В этой статье вы узнаете о том, как сделать простейший модуль для этой CMS, а также познакомитесь со структурой движка.

Введение


Хотелось бы отметить, что система пользуется спросом у сайтов развлекательной тематики. Оно и понятно, система проста в использовании, имеет достаточное количество модулей и шаблонов. Да и почти все нужное есть «из коробки». Однако бывает, что чего-нибудь не хватает. Эту проблему мы постараемся решить.

Почему 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).

Ах да, это моя первая статья на хабре, поэтому извините если что не так.

Similar posts

AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 10

    +4
    Я не знаю как принято писать код в DLE, но ваш пример кода ужасен, извините за откровенность.
    Вы когда-нибудь слышали про такие понятия как: разделение данных и представления, константах(magic numbers), ну и множества других приемов программирования, улучшающих качество кода?

    Про всякие die(«Hacking attempt!»), лучше промолчу.
      +2
      >>>Я не знаю как принято писать код в DLE
      В DLE (во всяком случае, я смотрел внутрь 9.0) такой код и есть. И это печально.
        –2
        Объясните что плохого в этом коде. Этот код служит всего лишь для того, чтобы сценарий нельзя было запустить напрямую. Без него можно было обойтись, но это плохое решение.
        –2
        Ну die(«Hacking attempt!») это стандартная проверка, так во всех файлах движка и со своей задачей справляется, не вижу ничего плохого.

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

        Насчет разделения данных и представления: это пример простого модуля, тут идея в том, что все в одном файле, все доступно и понятно. Можно было сделать на шаблонах, но здесь это не нужно, поверьте мне.
          0
          Ну а в целом, мне кажется, качество кода довольно хорошее

          Значит вы просто не видели код «хорошего качества». Ваш код ужасен. Не тратьте времени даром, качайте Yii или Symfony — изучайте их исходники, параллельно читайте Макконела и Фаулера.
          0
          я когда однажды код DLE ковырял с целью модификации, у меня волосы на голове шевелились. Никогда бы не взялся поддерживать и расширять такое добровольно
          –1
          DLE is die(«Hacking attempt!»)

          з.ы. такого добра во всем движке хватает

          по поводу написания модулей — мне интересно
            0
            Не знаю структуру таблиц dle, но в код $row['autor'] выводится без проверки, так же как и $row['alt_name']. Насколько понятно из название полей, это все пользовательские данные. И при определенных обстоятельсвах, можно нарватья на xss.
              0
              Вот это полезное замечание, спасибо. Но имя пользователя фильтруется при регистрации, поэтому тут все нормально.
              0
              А лицензия на DLE есть у вас?

              Only users with full accounts can post comments. Log in, please.