loading...

Авторизация ...

Имя пользователя :
Пароль :
я всё забыл!

Советы, В помощь вебмастеру, PHPКак написать модуль для DLE 7.5 с админпанелью?

Написал snakez, 13 марта 2009 | 18 комментариев | рейтинг новости не нравится   +12   нравится Версия для печати
Данный урок поможет новичкам понять принцип построения модулей для DLE.
Не судите строго, статья моя первая, прогер я (всм по похапе) начинающий, статья актуальна для пользователей DLE 7.5 (и вероятно 7.2 - точно не знаю).

И так - вступление.
Недавно отрыл в паблике подобный урок, но судя по всему он был расчитан на DLE младше версии 7.2 - ибо админпанель отказалась работать вобще. Поковыряв код сам я решил обратиться за помощью на канал #php в наш любимый IRC, вот только любителей даталафа там не отыскалось и я отправился ковырять дальше сам. Всё, что я наковырял - 100% рабочее!
В этом уроке я попутно к коду буду писать подробные коменты (в меру своих познаний).
Приступаем!
Для начала на надо определить, что же будет делать наш модуль (вобще - за основу можно взять любой php скрипт, подправить его под DLE и всё будет ок), а пока задумка такая:
Наш модуль будет выводить 5 строк, значения которых будут задаваться в админпанели, например:
строка 1 - Это типа мой модуль
строка 2 - v.1.0
строка 3 - Мой самый первый модуль для LDE 7.5
строка 4 - Он совсем простой
строка 5 - но потом будет сложнее!

Как сказано выше - любую из строк можно изменить в админпанели. И так создаём основу нашему модулю

создаём файл mymodule.php в папке engine/modules


В него пишем:

<?php
// Защита от взлома
  if (!defined("DATALIFEENGINE"))
  {
    die("Hacking Attemp!");
  }
// Защита от взлома
// подгружаем файл с настройками модуля, в нём будут храниться те самые 5 строк
require_once (ROOT_DIR.'/engine/data/config.mymodule.php');
//подгрузили файл с настройками модуля

//Создаём переменную с НЕИЗМЕНЯЕМЫМ значением
$myword = 'Тестовый модуль';
//создали

// подгружаем оболочку к нашему модулю - это есть часть темы DLE
     $tpl->load_template('mymodule.tpl');

// подставляем в оболочке за место всех mymmodyle и т.д. значения наших переменных
$tpl->set('{mymodule}', $myword);
$tpl->set('{mymone}', $wordone = $mymodconf['word_one']);
$tpl->set('{mymtwo}', $mymodconf['word_two']);
$tpl->set('{mymfree}', $mymodconf['word_free']);
$tpl->set('{version}', $mymodconf['version']);
$tpl->set('{detail}', $mymodconf['detail']);
// заменили все {blabla} на значения переменных

// хз
     $tpl->compile('content');
     $tpl->clear();
// хз
?>


Можно сказать, что основная састь самого модуля готова, перейдём к созданию раздела для нашего модуля в админке

Лезем в engine/inc и создаём два файла - mymodule.functions.php и mymod_adm.php


В файл mymod_adm.php мы запишем скрипт, который будет брать значения, которые мы пропишем в админ панели для нашего модуля и записывать их в конфиг модуля, файл mymodule.functions.php содержит в себе HTML код для нашего раздела в админпанели, по идее - этот HTML можно было сразу вписать в mymod_adm.php - но тогда код выглядел бы совсем не понятно.

И так, в mymod_adm.php пишем:

<?php
// Подгружаем файл оформления для админпанели
require_once (ENGINE_DIR.'/inc/mymodule.functions.php');

// Подгружаем наш конфиг
require_once (ENGINE_DIR.'/data/config.mymodule.php');

// Сохранение настроек модуля
// Если $action = "dosave" тогда выполняем следующие действия
if ($action == "dosave") {

// Проверяем - является ли пользователь меняющий настройки админом
// т.е. относится ли он к группе 1, если != 1 - т.е. не относится, тогда выводим
// сообщение о том, что у него нет доступа
if ( $member_id['user_group'] != 1 ) {
    msg ("error", $lang['opt_denied'], $lang['opt_denied']);
}
// вывели сообщение

// заменяем все окончания строк (символы новой строки и т.д.)
    $find[]     = "'r'";

// на пустоту
    $replace[]  = "";
    $find[]     = "'n'";
    $replace[]  = "";
// заменили - теперь у нас все значения однострочные

// создаём переменную $handler которая по суте есть наш конфиг, и теперь мы можем
// записать в эту переменную нужные нам значения (открыть файл на запись)
$handler = @fopen(ENGINE_DIR.'/data/config.mymodule.php', "wb");

// собственно записываем
// при записи ковычки надо коментировать обратным слешем
// символ обр.слеша n - означает переход на следующую строку
fwrite ($handler, "<?php nn//Наш конфиг
                         nn$mymodconf = array(
                         nn'version' => "v.1.0",nn");


// подставляем поочерёдно все значения из $save_con к переменным $name => $value
foreach ($save_con as $name => $value) {    
    $value = trim(stripslashes ($value));
    $value = htmlspecialchars  ($value, ENT_QUOTES);
    $value = preg_replace($find, $replace, $value);

// записываем значения
    fwrite($handler, "'{$name}' => "{$value}",nn");
}

// записали - закрываем файл конфига
fwrite($handler, ");nn?>");
fclose($handler);

// сообщаем о том, что настройки сохранены
msg ("info", "Строка изменена",
     "{$lang['opt_sysok_1']}<br /><br />
      <a href="{$PHP_SELF}?mod=mymod_adm">{$lang['db_prev']}</a>");
}


echoheader("Test", "Админпанель модуля test");

/**
* Вывод блока настроек
* Тут немного хтмл кода, в общем здесь то и есть грань, между граф. интерфейсом
* и кодом, тут мы к примеру вводим "куку" и наша переменная принимет
* значение "куку"
*/
open();
tableheader('Настройка модуля');
echo<<<HTML
<form action="" method="POST">
<table width="100%">
  <tr>
    <td class="option" style="padding:4px;">
      <b> Текст выводимой строки 1: </b><br />
      <span class="small"> например: Hello world </span>
    <td align="middle" width="400">
      <input class="edit" style="text-align:center" size="40" value="{$mymodconf['word_one']}" name="save_con[word_one]"></td>
  </tr>
    <tr>
    <td class="option" style="padding:4px;">
      <b> Текст выводимой строки 2: </b><br />
      <span class="small"> например: Hello world </span>
    <td align="middle" width="400">
      <input class="edit" style="text-align:center" size="40" value="{$mymodconf['word_two']}" name="save_con[word_two]"></td>
  </tr>
    <tr>
    <td class="option" style="padding:4px;">
      <b> Текст выводимой строки 3: </b><br />
      <span class="small"> например: Hello world </span>
    <td align="middle" width="400">
      <input class="edit" style="text-align:center" size="40" value="{$mymodconf['word_free']}" name="save_con[word_free]"></td>
  </tr>
  
  <tr><td background="engine/skins/images/mline.gif" height="1" colspan="2"></td></tr>
  
  <tr>
    <td class="option" style="padding:4px;">
       <b> Комментарий к тексту: </b><br />
       <span class="small"> например: Это ваш первый пример модуля с админпанелью </span>
    <td align="middle" width="400">
       <input class="edit" style="text-align:center" size="40" value="{$mymodconf['detail']}" name="save_con[detail]"></td>
  </tr>
  
  <tr><td background="engine/skins/images/mline.gif" height="1" colspan="2"></td></tr>
  
  <tr>
    <td class="option" style="padding-bottom:10px; padding-top:10px; padding-left:10px;" colspan="2">
      <input class="buttons" type="hidden" name="action" value="dosave" />
      <input class="buttons" type="submit" name="do" value=" Сохранить " /></td>
  </tr>
  
</table>
</form>
HTML;
close();



echofooter();
?>


В файл mymod.functions.php запишем следующее:
echo <<<HTML
<table width="100%">
    <tr>
        <td width="4"><img src="engine/skins/images/tl_lo.gif" width="4" height="4" border="0"></td>
        <td background="engine/skins/images/tl_oo.gif"><img src="engine/skins/images/tl_oo.gif" width="1" height="4" border="0"></td>
        <td width="6"><img src="engine/skins/images/tl_ro.gif" width="6" height="4" border="0"></td>
    </tr>
    <tr>
        <td background="engine/skins/images/tl_lb.gif"><img src="engine/skins/images/tl_lb.gif" width="4" height="1" border="0"></td>
        <td style="padding:5px;" bgcolor="#FFFFFF">
HTML;
}

function close() {
echo <<<HTML
    </td>
        <td background="engine/skins/images/tl_rb.gif"><img src="engine/skins/images/tl_rb.gif" width="6" height="1" border="0"></td>
    </tr>
    <tr>
        <td><img src="engine/skins/images/tl_lu.gif" width="4" height="6" border="0"></td>
        <td background="engine/skins/images/tl_ub.gif"><img src="engine/skins/images/tl_ub.gif" width="1" height="6" border="0"></td>
        <td><img src="engine/skins/images/tl_ru.gif" width="6" height="6" border="0"></td>
    </tr>
</table>
HTML;
}

function tableheader($value) {
echo <<<HTML
<table width="100%">
    <tr>
        <td bgcolor="#EFEFEF" height="29" style="padding-left:10px;">
          <div class="navigation">$value</div></td>
    </tr>
</table>
<div class="unterline"></div>
HTML;
}
?>


Вот в принципе и всё! Наш модуль готов и дело осталось за малым - просто подключить!
Извените за то, что к html коду мало коментариев - я в нём как свиня во француских дикалонах :)

И так о подключении: Открывем файл admin.php

ищем
'googlemap' => 'admin' );

над ни пишем
// Мой модуль
'mymod_adm' => 'admin',


Этот длинный список - есть перечень файлов админок модулей, например в данный момент, мы указали, что к файлу mymod_adm.php имеет доступ только админ .

Далее лезим в engine/engine.php

Ищем
    case "comments" :
        include ENGINE_DIR . '/modules/comments.php';
        break;

Ниже пишем
// Мой модуль
case "mymod" :
include ENGINE_DIR.'/modules/mymodule.php';
break;


Это мы донесли, что если кто то перейдёт по ссылке index.php?do=mymod - то откроется наш моудль, в общем говоря - сделали модуль доступным

Теперь ползём в engine/inc/options.php

Ищем
'name' => $lang['opt_google'],
'url' => "$PHP_SELF?mod=googlemap",
'descr' => $lang['opt_googlec'],
'image' => "googlemap.png",
'access' => "1"
)

над ним пишем
array(
'name' => "мой модуль",
'url' => "$PHP_SELF?mod=mymod_adm",
'descr' => "типа мой первый мод",
'image' => "my.png",
'access' => "1",
),


Это мы собственно создали раздел в админке, тут:

array(
'name' => "мой модуль",                            <--- Название
'url' => "$PHP_SELF?mod=mymod_adm",    <--- Ссылка на файл админки
'descr' => "типа мой первый мод",              <--- Краткое описание
'image' => "my.png",                                 <---  Иконка
'access' => "1",                                         <--- Доступ - 1 = админ
),


Ближе к завершению - адаптировать ваш модуль, к вашему шаблону. т.е. показать всё так, как надо и там где надо, лезем в templates/ваша_тема/ и создаём файл mymodule.tpl, в него запишем:
<html>
<body>
{mymone} - <i>{version}</i>
<p>{mymtwo}</p> А да, и ещё - {mymfree}....  {detail}
</body>
</html>


Тут {version}, {mymfree} и т.д. - это наши переменные со своими значениями, теми, что мы прописали в админпанели, вы можите их использовать как вам только захочется!

Последний шаг - engine/data создайте файл config.mymodule.php, в него ничего не пишите, просто установите CHMOD 644 (права на доступ к файлу), обычно конфиг для модулей создаётся специальным файлом install.php, и от всяких муторных "залезте туда, надите то, выше напишите это", можно избавиться с помощью специального хака который выкладывал Hamer - _http://4dle.ru/2008/01/11/klass_zameny_fajjlov_dlja_intsall.html , но это уже отдельная тема...


ВОТ И ВСЁ! Теперь вы можете залезть в админ панель, "настроить" ваш модуль и перейдя по ссылке www.vash-sait.com/index.php?do=mymod увидить плоды своего старания!
У меня на написания данного подобия модуля ушло ровно 15 мин. :) На самом деле всё очень быстро, просто я пытался создать подробный урок. По данному принципу можно писать какие угодно модули, главное помните - сердце модуля - это engine/modules/блаблабла.php - в нём можно написать всё что душе угодно! Удачи в эксперементах!



Комментарии пользователей

  Экспорт комментариев в RSS
 Сортировать по рейтингу, по дате

Написал snakez, 13 марта 2009 в 18:23 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
ай блин, парсер вырезал обратные слеши из
// заменяем все окончания строк (символы новой строки и т.д.)
ВНИМАНИЕ!!! - тут выделенный жирным / надо заменить на обратный слешь (точно такой же, только в зеркальном отражении!
Заменяйте ТОЛЬКО ЖИРНЫЕ СЛЕШИ!
$find[] = "'/r'";
$replace[] = "";
$find[] = "'/n'";
$replace[] = "";

ниже
fwrite ($handler, " "v.1.0",/n/n");

$name => $value
foreach ($save_con as $name => $value) {
$value = trim(stripslashes ($value));
$value = htmlspecialchars ($value, ENT_QUOTES);
$value = preg_replace($find, $replace, $value);
fwrite($handler, "'{$name}' => "{$value}",/n/n");
}
fwrite($handler, ");/n/n?>");[/i]

в общем перед каждой отдельной буквой n и r (вначале) надо воткнуть обратный слешь

Написал AVET, 13 марта 2009 в 20:23 плохой комментарий   0   хороший комментарий
Новостей: 17, комментариев: 535, Редактор
Карма: 12±
в ТХТ ... тут парсер всё хавает )

Написал Tweek, 13 марта 2009 в 19:01 плохой комментарий   +2   хороший комментарий
Новостей: 5, комментариев: 344, Пользователи
Карма: 24±
Советую в txt закинуть...или html... а то парсер тут бешоооный..

Написал rainbowsix, 13 марта 2009 в 19:38 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 39, Пользователи
Карма:
Спасибо за статью! ay

Написал Silas, 13 марта 2009 в 20:20 плохой комментарий   +1   хороший комментарий
Новостей: 1, комментариев: 53, Пользователи
Карма:
Прикольно ты PHP обозвал - "похапе". laughing

Написал flashripper, 13 марта 2009 в 22:12 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
Выложите все пожалуйста в rar архив, а то отсюда код нереально взять

Написал Sander1, 13 марта 2009 в 23:32 плохой комментарий   +1   хороший комментарий
Новостей: 38, комментариев: 314, Пользователи
Карма: 21±
Статейка в принципе хорошая, но много пропусков и неясностей...
Чтобы я добавил:
1. require_once (ROOT_DIR.'/engine/data/config.mymodule.php');
Не написал содержание этого файла...
$tpl->set('{mymodule}', $myword);

$myword - вот кто догадается, что эта переменная просто лежит в config.mymodule.php ;)

2. В mymod_adm.php лучше вот это:
if ( $member_id['user_group'] != 1 ) {
    msg ("error", $lang['opt_denied'], $lang['opt_denied']);
}

перенести в начало
Парсер тут конечно жестокий :) В сохранении не обязательно две \n\n Можно одну \n.

3. В mymodule.tpl совсем ненужны тэги:
<html><body></body></html>

Потому что модуль выводится на месте контента в main.tpl Там уже есть боди и хтмл.

PS. Ну вобщем молодец! Новичкам очень полезно будет!

Написал snakez, 13 марта 2009 в 23:39 плохой комментарий   +1   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
Как просили, выкладываю в архиве, правда там по коду коментариев меньше, но я думаю, что вы разберётесь :) Сцылко

Написал snakez, 14 марта 2009 в 01:21 плохой комментарий   +1   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
Sander1, ну в принципе да, код не оптимизированный, вот только касаемо конфига - переменные впишутся сами, когда данные будут введены в админпанели )


Да народ - помогите, где можно взять список стандартных функций для DLE 7.5 ?

и переменных тоже )

Написал sinvlad, 14 марта 2009 в 15:29 плохой комментарий   +1   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
Для ЧПУ вставляем в .htaccess перед
RewriteRule ^([^/]+).html$ index.php?do=static&page=$1 [L]
строку
RewriteRule ^mymod.html$ index.php?do=mymod [L]


Написал grimweb, 15 марта 2009 в 01:02 плохой комментарий   0   хороший комментарий
Новостей: 6, комментариев: 446, Модератор
Карма: 23±
Актуально на данный момент. Спасибо.

Написал bugger, 18 марта 2009 в 10:33 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
Никто не проверял, для дле 7.2 модуль с таким построением пойдёт?

Написал SuRS, 20 марта 2009 в 08:37 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
как подключать xfields?

Написал Cayz, 20 марта 2009 в 15:40 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
Текст файла mymod.functions.php не полный(без начала). Рапидшара не хочет отдавать архив с файлами. Без этого весь остальной материал смысла не имеет.

Написал maxic, 9 июня 2009 в 18:18 плохой комментарий   0   хороший комментарий
Новостей: 7, комментариев: 115, Пользователи
Карма:
Народ, помоему очень актуальная тема!!!! Я бы хотел, что бы администрация открыла новую ветку(!) на форуме по написанию модулей для DLE. Я думаю,что модулей бы прибавилось! Да и народу(в частности мне) оч помогла данная статья! Хотелось бы побольше таких.

Написал Sylar, 10 июня 2009 в 21:10 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 74, Пользователи
Карма:
а без админки как можно внедрять сторонние скрипты в ДЛЕ ? напишите так же подробно как писать модули по выводу какой либо инфы в блоке например как блок topnews

Написал grindcore, 1 июля 2009 в 02:16 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 0, Гости
Карма: ±
верхняя ссылко битая. Вот та же самая статья.
_http://rapidshare.com/files/250469069/sovet.rar.html

Написал Романыч, 22 сентября 2010 в 11:23 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 3, Пользователи
Карма:
все ссылки битые! а от туда не реально его прать там парсер херачит все. перезалейте плиз

Информация



Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
Анализ Тиц и PR сайта

[removed][removed] [removed] (adsbygoogle = window.adsbygoogle || []).push({}); [removed]