Как стать автором
Обновить

Реализация админки во фронтэнде сайта на MODx

С MODx Revolution я познакомился совсем недавно – всего полгода назад, однако сразу же влюбился в него. Каждый раз удивляюсь, насколько все просто и интересно реализовано.
Рассказать хотелось бы о том, как я делал админку для сайта на основе 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.
А теперь скрины того, что получилось:
Главная страница админки:
Главная страница админки


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


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


Единственное, в чем я не уверен, так это в безопасности такого типа админки. Если кому-то будет интересно поковыряться, могу выложить сайт на отдельный хостинг и дать ссылку.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.