Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров28K
Здравствуйте. Данный топик хочу посветить созданию простейшего модуля для популярной 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).

Ах да, это моя первая статья на хабре, поэтому извините если что не так.
Теги:
Хабы:
Всего голосов 20: ↑8 и ↓12-4
Комментарии10

Публикации

Ближайшие события