Pull to refresh

Реализация админки во фронтэнде сайта на 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.
А теперь скрины того, что получилось:
Главная страница админки:
Главная страница админки


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


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


Единственное, в чем я не уверен, так это в безопасности такого типа админки. Если кому-то будет интересно поковыряться, могу выложить сайт на отдельный хостинг и дать ссылку.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.