Главная » PHP » Создание модуля для MODx
Куда Вы попали?

Информационная связь с потребителем, безусловно, реально стабилизирует социометрический рейтинг, не считаясь с затратами. Стиль менеджмента стабилизирует конвергентный анализ зарубежного опыта, оптимизируя бюджеты. Емкость рынка вырождена. Стратегический маркетинг, не меняя концепции, изложенной выше, основан на тщательном анализе данных.
А если серьёзно, это просто блог.

Нужен сайт?

Тогда, возможно, Вы попали туда куда нужно.
Я занимаюсь созданием сайтов "под ключ".
Оцените качество работы, посмотрев
портфолио. Если Вы не рассчитываете на демпинг, связаться со мной можно при помощи формы обратной связи.



Для "спасибо"
Установите Flash-плеер

Авторизация

Есть что сказать?


Создание модуля для MODx

В данном уроке будет рассказано как создать простой модуль для CMS, которую я считаю лучшей из существующих (в том числе из коммерческих). Я перепробывал очень много систем управления сайтом, также был опыт разработки собственной, но с тех пор как я узнал о MODx, у меня пропало желание создать свою собственную CMS, потаму что я понял, что создать что-то удобнее и универсальнее невозможно. Модуль который будет создан в этом уроке будет служить для заметок по типу записной книжки. Это совсем простой модуль (и не очень-то полезный), но его можно будет использывать как заготовку для создание других более сложных модулей.

Итак, для начала нам нужно создать пустой модуль в MODx. Идем в "Модули" → "Управление модулями". Жмем кнопку "Новый модуль", даем ему какое-то название, например "MODx Notes". Далее хорошо бы получить информацию о конфигурации системы для которой мы будем делать модуль. Выводим массив с конфигурационными данными:

echo "<pre>";
print_r($modx->config);
echo "</рre>";

Создаем "переменные окружения", которые будем использовать в модуле (хотя по сути это константы, но не важно).

$dbname = $modx->db->config['dbase']; //имя базы данных
$dbprefix = $modx->db->config['table_prefix']; //префикс таблиц
$mod_table = $dbprefix."manager_notes"; //таблица модуля
$theme = $modx->config['manager_theme']; //тема админки
$basePath = $modx->config['base_path']; //путь до сайта на сервере

Для передачи данных в модулях MODx удобнее всего использовать метод POST. Создадим форму со скрытыми полями и JavaScript-функцию для удобного переключения действий:

<script language="JavaScript" type="text/javascript">
function postForm(action, id){
  document.module.action.value=action;
  if (id != null) document.module.item_id.value=id;
    document.module.submit();
  }
</script>
 
<form name="module" method="post">
<input name="action" type="hidden" value="" />
<input name="item_id" type="hidden" value="" />

Эту конструкцию я подсмотрел здесь. Вот пример кнопки (ссылки) с данной JS-функцией:

<a href="#" onclick="postForm(\'install\',null);return false;">Установить модуль</a>

Создаем конструкцию Switch и первое действие (создание таблицы в БД для модуля):

switch($action) {
////Установка модуля (создание таблицы в БД)
case 'install':
  $sql = "CREATE TABLE $mod_table (id INT(11) NOT NULL AUTO_INCREMENT, title VARCHAR(255), description VARCHAR(255), PRIMARY KEY (id))";
  $modx->db->query($sql);
  header("Location: $_SERVER[REQUEST_URI]");
break;
}

Дальнейшие мои пояснения, думаю бессмысленны, лучше приведу полный код модуля, из комментариев в котором, будет всё понятно:

 
/***********************************
*
* http://wdevblog.net.ru 
* MODx Notes - простой модуль для MODx (заготовка)
* 
***********************************/
 
$dbname = $modx->db->config['dbase']; //имя базы данных
$dbprefix = $modx->db->config['table_prefix']; //префикс таблиц
$mod_table = $dbprefix."manager_notes"; //таблица модуля
$theme = $modx->config['manager_theme']; //тема админки
$basePath = $modx->config['base_path']; //путь до сайта на сервере
 
echo '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"  lang="en" xml:lang="en">
<head>
  <link rel="stylesheet" type="text/css" href="media/style/'.$theme.'/style.css" />
</head>
<body>
 
<br />
<div class="sectionHeader">Записная книжка</div>
 
  <div class="sectionBody">
 
<script language="JavaScript" type="text/javascript">
function postForm(action, id){
  document.module.action.value=action;
  if (id != null) document.module.item_id.value=id;
    document.module.submit();
  }
</script>
 
<form name="module" method="post">
<input name="action" type="hidden" value="" />
<input name="item_id" type="hidden" value="" />
';
 
$action = isset($_POST['action']) ? $_POST['action']:'';
 
switch($action) {
 
////Установка модуля (создание таблицы в БД)
case 'install':
  $sql = "CREATE TABLE $mod_table (id INT(11) NOT NULL AUTO_INCREMENT, title VARCHAR(255), description VARCHAR(255), PRIMARY KEY (id))";
  $modx->db->query($sql);
  header("Location: $_SERVER[REQUEST_URI]");
break;
 
////Удаление таблицы модуля
case "uninstall":
  $sql = "DROP TABLE $mod_table";
  $modx->db->query($sql);
  header("Location: $_SERVER[REQUEST_URI]");
break;
 
////Добавление записи
case 'add':
  if (!empty($_POST['item_id'])){//редактирование записи
    $data = mysql_fetch_array($modx->db->select("title, description", $mod_table, "id = $_POST[item_id]", "", ""));
    $id = $_POST['item_id'];
    $title = $data['title'];
    $description = $data['description'];
    $save = "update";
  }else{//если запись новая
    $id = '';
    $title = '';
    $description = '';
    $save = "save";
  }
  echo '
Заголовок<br /><input type="text" name="title" value="'.$title.'" /><br />
Запись<br /><textarea name="description" cols="40" rows="5">'.$description.'</textarea><br />
<a href="#" onclick="postForm(\''.$save.'\',\''.$id.'\');return false;"><img src="media/style/'.$theme.'/images/icons/save.gif" align="absmiddle" />Сохранить</a>
&nbsp;
<a href="#" onclick="postForm(\'reload\',null);return false;"><img src="media/style/'.$theme.'/images/icons/cancel.gif" align="absmiddle" />Отмена</a>
';
break;
 
////Сохранение записи в БД
case 'save':
  $sql = "INSERT INTO $mod_table VALUES (NULL,'$_POST[title]','$_POST[description]')";
  $modx->db->query($sql);
  header("Location: $_SERVER[REQUEST_URI]");
break;
 
////Обновление записи в БД
case 'update':
  $fields = array(
     "title" => $_POST['title'],
     "description" => $_POST['description']
     );
  $query = $modx->db->update($fields, $mod_table, "id = ".$_POST['item_id'].""); 
  header("Location: $_SERVER[REQUEST_URI]");
break;
 
 
////Перезагрузка страницы (сброс $_POST)
case 'reload':
  header("Location: $_SERVER[REQUEST_URI]");
break;
 
////Удаление записи в БД 
case 'delete':
  $modx->db->delete($mod_table, "id = $_POST[item_id]");
  header("Location: $_SERVER[REQUEST_URI]");
break;
 
////Страница модуля
default:
  if (mysql_num_rows(mysql_query("show tables from $dbname like '$mod_table'"))==0){
  //если таблицы не существует, выводим кнопку "Установить модуль"
  
    echo '<a href="#" onclick="postForm(\'install\',null);return false;">Установить модуль</a>';
 
  }else{
  //если же модуль уже установлен, выводим его
  
    echo '
    </form>
    <a href="#" onclick="postForm(\'add\',null);return false;"><img src="media/style/'.$theme.'/images/icons/newdoc.gif" align="absmiddle" />Добавить</a>
    ';
 
    $data_query = $modx->db->select("*", $mod_table, "", "id ASC", ""); 
 
    echo '
<br /><br />
<table width="98%" border="0" cellpadding="2" cellspacing="1" bgcolor="#707070">
  <thead>
  <tr>
    <td><b>Заголовок</b></td>
    <td><b>Текст записи</b></td>
    <td><b></b></td>
    <td><b></b></td>
  </tr>
  <thead>
  <tbody>
';
 
    while ($data = mysql_fetch_array($data_query)){//выводим записи
    echo '
  <tr bgcolor="#FFFFFF">
    <td>'.$data["title"].'</td>
    <td>'.$data["description"].'</td>
    <td align="center"><a href="#" title="Редактировать" onclick="postForm(\'add\','.$data["id"].');return false;"><img src="media/style/'.$theme.'/images/icons/logging.gif" align="absmiddle" /></a></td>
    <td  align="center"><a href="#" title="Удалить" onclick="if(confirm(\'Вы уверены?\')){postForm(\'delete\','.$data["id"].')};return false"><img src="media/style/'.$theme.'/images/icons/delete.gif" align="absmiddle" /></a></td>
  </tr>';
    }
 
    echo '
  </tbody>
</table>
<br /><br />
<a href="#" onclick="if(confirm(\'Вы уверены?\')){postForm(\'uninstall\',null)};return false;"><img src="media/style/'.$theme.'/images/icons/delete.gif" align="absmiddle" />Удалить все записи</a>
';
 
  }
break;
} 
 
echo '
</div>
</body>
</html>
';

Для управления данными в БД я использовал в том числе и стандартные функции MODx. Для того чтобы было понятно как они работают обязательно посмотрите их полный код.

Для вывода на сайте данных, созданных в модуле, обычно используется плагин или сниппет. Возможно позже напишу и о них.



Написать комментарий

  • Обязательные для заполнения поля помечены знаком *.
Код подтверждения:


Комментарии с 1 по 4 из 10 | Следующие | В конец
Евгений
Ответов: 10
Комментарий
Re: Создание модуля для MODx
Ответ #10 дата : Thu June 03, 2010, 17:42:56
Так как же потом эти данные выводить в шаблоне?
Игорь Лысенко
Ответов: 10
Комментарий
Re: Создание модуля для MODx
Ответ #9 дата : Sun March 14, 2010, 13:07:13
Согласен с автором - после знакомства с MODx нет никакого желания пользоваться другими CMS.
А за статью вообще огромный плюс - как раз искал, как можно курсы валют в админку ввести. Пригодилось.
Strazur
Ответов: 10
Комментарий
Re: Создание модуля для MODx
Ответ #8 дата : Thu February 25, 2010, 09:45:39
Спасибо за статью все очень понятно
и работает :-)
Vitalick
Ответов: 10
Комментарий
Re: Создание модуля для MODx
Ответ #7 дата : Mon February 08, 2010, 00:07:57
спасибо за заготовку!
Комментарии с 1 по 4 из 10 | Следующие | В конец