Php на dle

Периодически веб-мастер сталкивается с необходимостью внедрения в код своего сайта стороннего PHP-скрипта. DataLife Engine не предусматривает эту возможность в стандартных установках системы (не считая тега {include}). В связи с этим мы представляем простой, но эффективный хак, благодаря которому любой PHP-код будет работать на любом шаблоне сайта.

Откройте файл index.php в корневой папке сайта (если у вас версия движка ниже 10.0) или файл main.php в папке /engine/modules/ (если dle 10.0 и выше) найдите строчку:

echo $tpl->result['main'];

и замените ее на:
eval (' ?' . '>' . $tpl->result['main'] . '<' . '?php ');

Если все сделано правильно, сторонние скрипты заработают на вашем сайте. Для проверки можете попробовать в шаблоне вашего сайта между

<body></body>

вставить код:
<?php echo "Hello, world!"; ?>

И если на сайте появилось сообщение «Hello, world!» — значит вы все сделали правильно, и в дальнейшем можете использовать php вставки на вашем сайте.

Давайте напишем модуль, который будет… Ну, скажем, выводить все загруженные на сайт картинки на одной странице (типа галереи). О, пока не забыл — стоит рассказать о том, что такое (лично для меня) внешний и внутренний модуль. Внешний модуль — это файл (или несколько файлов), который(ые) нужно скопировать в корень сайта и запустить в браузере. Такой модуль уместен в случае, если это парсер или другой скрипт, который добавляет или модифицирует новости сайта, пользователю достаточно скопировать один файл в корень, без ковыряния движка. Внутренний модуль — это набор файлов, которые добавляют функционал сайту (без ковыряния кода тут уже не обойтись). Начнем с внутреннего модуля (галерея, если кто-то забыл). Шаг 1. Добавляем обработчики. Для этого в engine/engine.php в конструкцию switch добавляем новый вариант для $do: HTML Текст case «galery» : include ENGINE_DIR . \’/modules/galery.php\’; break; Теперь добавим элемент меню для админки. В engine/inc/options.php ищем массив $options[\’config\’] и добавляем туда новый элемент: HTML Текст array ( \’name\’ => «Галерея», \’url\’ => «$PHP_SELF?mod=galery», \’descr\’ => \’Галерея DLE\’, \’image\’ => «rules.png», \’access\’ => «admin» ), Мы присвоили нашему модулю урл /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 Текст query(«SELECT * FROM `».PREFIX.»_images`»); //Проходимся в цикле по всем картинкам while($image = $db->get_row($imagesres)) { //Получаем заголовок записи, к которой картинка привязана $post = $db->super_query(«SELECT `title` FROM `».PREFIX.»_post` WHERE `id` = \’$image[news_id]\'»); //Картинок в одной записи может быть несколько, они разделены «|||» $image = explode(\’|||\’, $image[\’images\’]); //Каждую картинку добавляем в $content foreach($image as $i) { $content .= «\\»$post[title]\\»
«; } } //Тут подключаем шаблон ?> Красава! Теперь в $content содержится код вывода всех картинок на сайте. Осталось только подключить шаблон. А это вообще проще простого. Создаем в файл templates/tplname/galery.tpl, вписываем туда {content} и ничего больше. Шаблон готов, осталось только указать на него в нашем модуле. Как вы уже поняли, шаблонизатор DLE занимается преобразованием меток (типа {content}) в html код. Давайте скажем шаблонизатору, что надо подключить шаблон galery.tpl и заменить в нем {content} на содержимое $content. В engine/modules/galery.php добавляем код: HTML Текст $tpl->load_template(\’galery.tpl\’); $tpl->set(\'{content}\’, $content); $tpl->compile(\’content\’); $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 Текст
Hello, world!

Вот и все. Тут можно форму добавить, выше — обработчик формы. В форме чего-то посылать, в обработчике — чего-то сохранять.

Вроде готово. Раскрыто далеко не все, лишь основы. Но, поверьте, пока будете писать свой первый модуль, станете профессиональным модулеписателем, потому что DLE прост, как три копейки. Внешний модуль DLE Выше я писал, что подразумеваю под внешним модулем. Суть в том, чтобы подключить к файлу все API от DLE, далее работать также, как через ядро описанным выше способом. Делается это в 4 строки: HTML Текст Это в 100 раз удобнее, чем внедряться через ядро engine.php. Скопировать файл (файлы) на сервер и запустить — все, что требуется от пользователя. Бонус. Давайте еще добавим сквозную метку для всего сайта. Открываем index.php, ищем строку $tpl->compile ( \’main\’ ); Это компиляция шаблона main.tpl. Перед этой строкой вставляем: $tpl->set ( \'{SUPERMETKA}\’, \’Привет, мир!\’ ); Готово. Теперь строка {SUPERMETKA} в main.tpl будет заименена на «Привет, мир».