Начал я с того, что написал сниппет addResource, который будет создавать новый ресурс с указанным заголовком и прочими параметрами:
// Сниппет будет получать данные из формы методом POST $title = $_POST['title']; $content = $_POST['content']; $introtext = $_POST['introtext']; $description = $_POST['description']; $parent = $_POST['parent']; $template = $_POST['template']; $color = $_POST['color']; // Это значение будем заносить // в TV-параметр color // Если некоторые значения не будут указаны, // они будут установлены по умолчанию if (!$introtext) $introtext = $title; if (!$description) $description = $introtext; if (!$parent) $parent = 1; if (!$template) $template = 1; // Создаем ресурс $response = $modx->runProcessor('resource/create', array( 'pagetitle' => $title, 'longtitle' => $title, 'description' => $description, 'introtext' => $introtext, 'content' => $content, 'template' => $template, 'published' => 1, 'parent' => $parent)); if ($response->isError()) { return $modx->error->failure($response->getMessage()); } $newResource = $response->response['object']; // Устанавливаем значение TV-параметра color $tv = 3; // id-шник TV-параметра $value = $_POST['color']; // значение TV-параметра $tvar = $modx->newObject('modTemplateVarResource'); $tvar->set('contentid', $newResource['id']); $tvar->set('tmplvarid', $tv); $tvar->set('value', $value); $tvar->save(); // Очищаем кеш, чтобы изменения были видны сразу $modx->cacheManager->refresh(); return true;Кроме него у меня есть сниппет editResource, соответственно для редактирования ресурсов, созданных ранее:
// Получаем данные из формы $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 ($resource->save()) { // Очищаем кеш, чтобы изменения были видны сразу $modx->cacheManager->clearCache(); return true; } return false;Теперь нам надо в эти сниппеты значения все-таки передать. Создаем две странички – страница добавления материала и страница редактирования материала. Для форм я использовал сниппет FormIt.
Страница добавления материалов:
[[!FormIt? &hooks=`addResource,redirect` &validate=`title:required` &redirectTo=`218`]] <form action="[[~[[*id]]]]" method="post" class="form"> <input type="hidden" name="template" id="template" value="9" /> <label for="title">Заголовок:<br /> <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="color">Цвет (TV-параметр):<br /></label> <input type="text" name="color" id="color" /><br /> <label for=" content ">Полный текст:<br /></label> <textarea id="content" name="content"></textarea><br /> <input type="submit" value="Отправить!" /> </form>
- &hooks — то, что будет выполняться при отправке формы. В данном случае, это сниппет addResource и перенаправление на страницу с сообщением об успехе.
- &validate — проверка значений формы. У нас title обязательно должен быть заполнен.
- &redirectTo — id ресурса, на который будет перенаправляться пользователь, если сниппет addResource вернет true.
Для страницы редактирования материалов я написал сниппет getContent, который возвращает текущие значения параметров редактируемого ресурса (хотя, как я сейчас уже знаю, можно было не изобретать велосипед, а воспользоваться сниппетом getResourceField):
$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> <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="Сохранить!" /> </form>Далее нам необходимо создать группу ресурсов (Безопасность -> Группы ресурсов), к которой нужно ограничить доступ, после чего добавить в эту группу обе наши странички и установить сниппет Login для того, чтобы можно было авторизоваться прямо на сайте.
Получилась такая вот симпатичная админка:

UPD. Обновил топик, отредактировал код сниппетов благодаря советам в комментариях. Огромное спасибо bezumkin и valikras. G+
Оригинал статьи community.modx-cms.ru/blog/tips_and_tricks/7489.html
При добавлении валидация срабатывает, но в итоге пишет ошибка сервера, опыта мало с ModX, может что не так делаю? подскажите.
Перекапываю заново
да я не спорю свой велосипед всегда чище едет, Но он как правило заточен под конкретную задачу.
любой cms как таковой имеет избыточный код. следовательно работает медленнее нативного решения.
modx чем то схож с gentoo — делай что хочешь но знай что ты хочешь — отсюда выше требования к знаниям.
Слушай вопрос. Вот редактирование документа:
Это твой который.
У меня 2 вопроса:
1. Выставляем id в примере на 3, т.е. ресурс номер 3. А это от какого ресурса id. Я вот тут не въехал.
2. И подскажи как проводить валидацию xpdo а то все что не введешь в формы то и попадает.
А по поводу проверки, мне свои проверки писать или можно использовать какие то встроенные в Modx? Я вот только не нашел встроенных или просто плохо искал
По умолчанию Jevix вырезает все теги script, iframe вместе с их содержимым.
Решаю аналогичную задачу. Форму отправляю через Formit, сниппет публикующий ресурсы свой. Проблема в следующем:
Formit вырезает весь html код из формы. А мне нужно в форме использовать wysiwyg-редактор для контента. У тебя, как я вижу, тоже используется wysiwyg. Как ты обошёл эту проблему?
Интересует возможность предоставить выбор шаблона (выпадающий список) из определенной категории, не смог найти в официальной документации.
Заранее благодарю за наводки.
По умолчанию в MODX такой функции нет.
Указал дефолтные значения $parent и $tamplate в addResource, прописал имя и айдишник своего tv
При добавлении ресурса редирект выполняется, то есть addResource возвращает true,
Но якобы созданный ресурс не появляется.
Добавление происходит со страницы личного кабинета, доступного только зарегистрированным пользователям.
В группу ресурсов, доступных этим пользователям страница с формой добавления ресурса добавлена.
Что не так?
Все равно не добавляется публикация
хороший вопрос
Но даже при правах Super User — 0 и дефолтной политике Resource форма отрабатывает, addResource отрабатывает, а ресурс не создается.
Уже все перелопатил(
Нужно было назначить alias
В форме добавления ресурса нужна такая конструкция для ввода TV:
Возвращает только одно значение, не смотря на то, что это multiselect.
т.е. не зависимо от того сколько позиций выбрано, публикуется только одна (похоже последняя)
Мучусь уже почти сутки, не могу понять как получить все введенные значения.
Прошу помощи.
Во-первых селект должен быть таким:
И во-вторых в «первой части» addResource переменную нужно обрабатывать как массив:
Как-то так?
записывать ее в переменную на стадии записи значения в ТВ?
но как это сделать не понятно.
В ТВ в конечном итоге должны попасть значения из мультиселекта через запятую
Удобно в случае если эта ТВ потом используется для вывода ресурсов по их ID, скажем с помощью какого-то getResouces.
Имя поля обозначаем так: А запись значения в ТВ делаем так: в addResouces
вот и все!
При редактировании выдало такое:
Fatal error: Call to a member function save() on a non-object in
.../core/cache/includes/elements/modsnippet/37.include.cache.php on line 27
а строка 27 — это сброс кеша
Заменить на это:
редактирует, но почему-то не редиректит formit
вместо этого:
работает это:
В editResource (где устанавливаем нужные значения), что TV записываем так:
ну а из get их получаем так же.
P.S. Хотя это наверное очевидно
как я понял тут я что-то не то сделал, т.к. pub_date сохранился в Описании и Аннотации.
Илья подскажи пожалуйста, как можно запелить добавление файла?
В addResource указал id-ки ТВ и иего имя
Форму добавил:
Прошу помощи, спасибо!
Сначала файл надо загрузить, потом сохранить в нужной папке, после чего записать данные файла в нужный ТВ-параметр.
Кроме того нужно учесть, что:
А ещё, файлы надо позволить менять (загружать новые), а, значит, старые надо как-то удалять. Тут тоже нужен свой алгоритм.
Так что если нет большого опыта в программировании, проще найти кого-то, кто сделает это за деньги. Разместите объявление о работе на https://modx.pro/ — там вам наверняка помогут.
Есть еще один вариант — использовать Tickets. В этом компоненте загрузка файлов уже предусмотрена «из коробки»
Настроил всё по статье + добавил это из комментария
Работает, обновляет страницу /edit/ (аналогично &redirectTo=`[[*id]]`)
Я имел ввиду обновлять эту /edit/?id=12 или после редактирования редиректило на только что отредактированную страницу
Пробовал такое: &redirectTo=`[[!get? &need=`id`]]`, почему не заработало еще не разобрался
сделал плейсхолдер [[+id]], на результат не повлияло.
Ладно, буду смотреть в сторону ajaxform
Есть ли решение для создания и редактирования тикетов от Василия во фронтенде?
Стандартный не устраивает отсутствием выбора каталогов тикета.
Спасибо
Нашел код динамического добавлений изображений:
его можно переделать под MODX?
и по идеи работает на jquery.filedrop.js. Именно когда я пытаюсь загрузить на хостинг фотографии через modx, то там выскакивает ошибка самого скрипта (jquery.filedrop.js). Если без modx, то работает замечательно.
Так что буду думать как исправить.
P.S. Все равно спасибо за совет.
Консоль браузера пишет ошибку:
Uncaught SyntaxError: Unexpected token <
e.extend.parseJSON @ jquery-1.7.1.min.js:2
$.fn.filedrop.xhr.onload @ jquery.filedrop.js:342
Но теперь возник другой вопрос. Когда перехожу на страницу редактирование, то все параметры передаются нормально, но при сохранении изменений выдает ошибку
Fatal error: Call to a member function get() on a non-object in ....ru/core/cache/includes/elements/modsnippet/46.include.cache.php on line 8
как я понял ошибка в сниппете getContent, он у меня 46, брал его с этой статьи, только добавил еще несколько полей. Так же пытался поменять его на getresourcefield, так же все значения полей передает, но при сохранении он перебрасывает меня с edit/?id=140 на просто edit/, при этом изменения не сохраняет.
Из бесплатных могу посоветовать CKEditor
Каждый редактор устанавливается по-своему, на каждом сайте есть инструкция и документация.
Спасибо за ответ.
и ресурс не удаляется, в принципе это и нужно было.
Делаю так:
Я новичок)) Подскажи правильно ли я делаю, и как эту ошибку обработать.
Еще планирую это:
заменить на $doc->remove(); так наверно правильней чтобы с корзины сразу удалялось?
Но он не заполняет поля где есть чекбоксы или селекты с множественными значениями, как сделать чтобы он брал массив значений и заполнял форму корректно? Спасибо заранее.
Допустим через pdoTools выводятся ресурсы, как к каждому прикрутить кнопку?
А удалить навсегда так: