Pull to refresh

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

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

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

Articles