]]>
]]>
Рейтинг@Mail.ru

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

Материал из Веб программирование.

Перейти к: навигация, поиск


В данном уроке будет рассказано как создать модуль для 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;
}


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

/***********************************
*                                                  *
* 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 (API функции и API по работе с базой). Для того чтобы было понятно как они работают обязательно посмотрите их полный код.

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

]]>
Google+
]]>
Личные инструменты
Хочешь еще цитату? xxx: Солдатам, пока горит спичка, надо раздеться и лечь, а с утра, пока горит спичка, одеться и заправить кровать.
xxx: У IT-шников, пока вырубается комп, раздеться и лечь, а пока он врубается, одеться и сесть за комп) в одном из чатов
веб-программирование
Просмотры
чтим

Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/webproger/data/www/webproger.ru/1c6a72389c0fd92079ac7ae7cd356173/sape.php on line 218 Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/webproger/data/www/webproger.ru/1c6a72389c0fd92079ac7ae7cd356173/sape.php on line 224

]]>
Rambler's Top100
]]>
]]>
]]>