С MODx Revolution я познакомился совсем недавно – всего полгода назад, однако сразу же влюбился в него. Каждый раз удивляюсь, насколько все просто и интересно реализовано.
Рассказать хотелось бы о том, как я делал админку для сайта на основе MODx.
Готовых рецептов я не нашел, поэтому решил использовать свои знания и официальную документацию.
Необходимо было сделать как можно более понятный интерфейс с минимумом лишних кнопок, настроек и прочего – только заголовок и текст.
Начал я с того, что написал сниппет addResource, который будет создавать новый ресурс с указанным заголовком и прочими параметрами:
Кроме него у меня есть сниппет editResource, соответственно для редактирования ресурсов, созданных ранее:
Теперь нам надо в эти сниппеты значения все-таки передать. Создаем две странички – страница добавления материала и страница редактирования материала. Для форм я использовал сниппет FormIt.
Страница добавления материалов:
Для страницы редактирования материалов я написал сниппет getContent, который возвращает текущие значения параметров редактируемого ресурса:
Страница редактирования материалов:
Далее нам необходимо создать группу ресурсов (Безопасность -> Группы ресурсов), к которой нужно ограничить доступ, после чего добавить в эту группу обе наши странички и установить сниппет Login для того, чтобы можно было авторизовываться прямо на сайте.
Кроме того, для админки я подключил редактор из поста, хотя можно было использовать и TinyMCE.
А теперь скрины того, что получилось:
Главная страница админки:

Добавление ресурса:

Редактирование ресурса:

Единственное, в чем я не уверен, так это в безопасности такого типа админки. Если кому-то будет интересно поковыряться, могу выложить сайт на отдельный хостинг и дать ссылку.
Рассказать хотелось бы о том, как я делал админку для сайта на основе MODx.
Готовых рецептов я не нашел, поэтому решил использовать свои знания и официальную документацию.
Необходимо было сделать как можно более понятный интерфейс с минимумом лишних кнопок, настроек и прочего – только заголовок и текст.
Начал я с того, что написал сниппет addResource, который будет создавать новый ресурс с указанным заголовком и прочими параметрами:
<?php
// Сниппет будет получать данные из формы методом POST
$title = $_POST['title'];
$content = $_POST['content'];
$introtext = $_POST['introtext'];
$description = $_POST['description'];
$parent = $_POST['parent'];
$template = $_POST['template'];
$publishedon = date('Y-m-d H:i:s');
// Если некоторые значения не будут указаны,
// они будут установлены по умолчанию
if (!$introtext) $introtext = $title;
if (!$description) $description = $introtext;
if (!$parent) $parent = 1;
if (!$template) $template = 1;
// Создаем ресурс
$newResource = $modx->newObject('modResource');
// Заполняем нужные значения
$newResource->set('pagetitle',$title);
$newResource->set('longtitle',$title);
$newResource->set('description',$description);
$newResource->set('introtext',$introtext);
$newResource->set('content',$content);
$newResource->set('alias',$title);
$newResource->set('template',$template);
$newResource->set('published',1);
$newResource->set('parent',$parent);
$newResource->set('publishedon',$publishedon);
// Сохраняем ресурс
if ($newResource->save()) {
// Очищаем кеш, чтобы изменения были видны сразу
$modx->cacheManager->clearCache();
return true;
}
return false;
?>
Кроме него у меня есть сниппет editResource, соответственно для редактирования ресурсов, созданных ранее:
<?php
// Получаем данные из формы
$title = $_POST['title'];
$content = $_POST['content'];
$resId = $_POST['resId'];
// Получаем ресурс по id ресурса
$resource = $modx->getObject('modResource',array('id'=>$ resId));
// Устанавливаем нужные значения
$resource->set('pagetitle',$title);
$resource->set('longtitle',$title);
$resource->set('content',$content);
// Сохраняем ресурс
if ($newResource->save()) {
// Очищаем кеш, чтобы изменения были видны сразу
$modx->cacheManager->clearCache();
return true;
}
return false;
?>
Теперь нам надо в эти сниппеты значения все-таки передать. Создаем две странички – страница добавления материала и страница редактирования материала. Для форм я использовал сниппет FormIt.
Страница добавления материалов:
[[!FormIt?
&hooks=`addResource,redirect`
&validate=`title:required`
&redirectTo=`218`]]
<!--
&hooks - то, что будет выполняться при отправке формы.
В данном случае, это сниппет addResource и перенаправление
на страницу с сообщением об успехе.
&validate - проверка значений формы.
У нас title обязательно должен быть заполнен.
&redirectTo - id ресурса, на который будет перенаправляться пользователь,
если сниппет addResource вернет true.
-->
<form action="[[~[[*id]]]]" method="post" class="form">
<!-- Если нам нужно указать особенный шаблон, в форме передаем значение -->
<input type="hidden" name="template" id="template" value="9" />
<label for="title">Заголовок:<br />
<!-- Так как у нас при вызове сниппета FormIt указана проверка title:required,
указываем, где и как будет отображаться ошибка -->
<span style="color: #cc0000;">[[!+fi.error.title]]</span><br />
</label>
<input type="text" name="title" id="title" /><br />
<label for="introtext">Аннотация:<br /></label>
<input type="text" name="introtext" id="introtext" /><br />
<label for=" content ">Полный текст:<br /></label>
<textarea id="content" name="content"></textarea><br />
<input type="submit" value="Отправить!" />
</form>
Для страницы редактирования материалов я написал сниппет getContent, который возвращает текущие значения параметров редактируемого ресурса:
<?php
$output = '';
// Получаем ресурс по его id
$res = $modx->getObject('modResource',array('id'=>$id));
// В зависимости от того, что нам нужно получаем то или иное значение
switch ($need) {
case "title": $output = $res->get('pagetitle'); break;
case "content": $output = $res->get('content'); break;
case "introtext": $output = $res->get('introtext'); break;
}
return $output;
?>
Страница редактирования материалов:
[[!FormIt?
&hooks=`editResource,redirect`
&validate=`title:required`
&redirectTo=`221`]]
<form action="[[~[[*id]]]]" method="post" class="form">
<input type="hidden" name="resId" id="resId" value="3" />
<label for="title">Заголовок:<br />
<span style="color: #cc0000;">[[!+fi.error.title]]</span><br />
</label>
<!-- В значение поля вставляем вызовв сниппета getContent,
указав, что нам нужно получить title -->
<input type="text" name="title" id="title" value="[[!getContent? &need=`title` &id=`3`]]" /><br />
<label for="introtext">Аннотация:<br /></label>
<input type="text" name="introtext" id="introtext" value="[[!getContent? &need=`introtext` &id=`3`]]" /><br />
<label for=" content ">Полный текст:<br /></label>
<textarea id="content" name="content">[[!getContent? &need=`content` &id=`3`]]</textarea><br />
<input type="submit" value="Сохранить!" />
</div>
</form>
Далее нам необходимо создать группу ресурсов (Безопасность -> Группы ресурсов), к которой нужно ограничить доступ, после чего добавить в эту группу обе наши странички и установить сниппет Login для того, чтобы можно было авторизовываться прямо на сайте.
Кроме того, для админки я подключил редактор из поста, хотя можно было использовать и TinyMCE.
А теперь скрины того, что получилось:
Главная страница админки:

Добавление ресурса:

Редактирование ресурса:

Единственное, в чем я не уверен, так это в безопасности такого типа админки. Если кому-то будет интересно поковыряться, могу выложить сайт на отдельный хостинг и дать ссылку.