Документация userPages для MODX3

Компонент для создания и редактирования ресурсов пользователями сайта


Основные свойства

  • Работает со стандартными ресурсами и товарами MiniShop3
  • WYSIWYG-редактор Pell
  • Загрузка файлов и изобажений с возможностью использования Dropzone
  • Поддержка TV-параметров (с учётом источников файлов), MIGX-полей, а также галереи, полей и опций товаров MiniShop3
  • Возможность сохранения черновика
  • Email-уведомления менеджеров
  • Настраиваемые всплывающие уведомления
  • Системные события для плагинов

Установка

Пакет устанавливается стандартным образом через установщик MODX3.

Системные настройки

up_css_url Путь к основному CSS-файлу относительно корня сайта {assets_url}components/userpages/js/default.css
up_js_url Путь к основному JS-файлу относительно корня сайта {assets_url}components/userpages/js/default.js
up_notifications Скрипт для всплывающих уведомлений. Поддерживаются Notyf и SweetAlert2 (требуется установка), а также можно указать miniShop3, FetchIt или AjaxForm для использования уведомлений этих компонентов (если они установлены). Notyf

Пример формы



Сниппет userPages

Выводит форму добавления / редактирования ресурса, подключает все необходимые скрипты и стили.

class Класс ресурса (modResource/msProduct) modResource
parent Родительский ресурс
template Шаблон ресурса [[++default_template]]
published Публиковать ли ресурс сразу после добавления [[++publish_default]]
required Обязательные поля через запятую pagetitle,content
migxFields MIGX-поля для вывода в форме (через запятую). Параметр используется для построения табличных виджетов.
tplCreateForm Чанк-шаблон формы создания ресурса up_create_form
tplEditForm Чанк-шаблон формы редактирования ресурса up_edit_form
errorText Чанк-шаблон текста ошибки (при невозможности создания/редактирования) up_error_text
notifications Скрипт всплывающих уведомлений [[++up_notifications]]
userGroups Группы пользователей через зяпятую, которые могут работать с userPages Administrator
emailFrom Адрес отправителя [[++emailsender]]
emailManager Почтовые адреса менеджеров для уведомлений [[++emailsender]]
emailManagerSubject Тема письма менеджерам [[%up_manager_subject]]
emailManagerTpl Чанк-шаблон письма менеджерам up_email_tpl
Примеры

Минимальный вызов:

[[!userPages]]

Fenom

{'!userPages' | snippet : []}

Работа с товаром miniShop3 в категории с id=15, модерацией ('published' => 0), cвоими чанками форм и адресами менеджеров:

{'!userPages' | snippet : [
    'class' => 'msProduct',
    'parent' => 15,
    'published' => 0,
    'tplCreateForm' => 'my_create_form',
    'tplEditForm' => 'my_edit_form',
    'emailManager' => 'manager1@gmail.com,manager2@gmail.com',
]}

Помимо этого можно указать любое предустанавливаемое значение для ресурса с учетом префикса.

Префиксы полей
Без префикса Поле ресурса (таблица modx_site_content) pagetitle | longtitle | content
tv_ TV-параметр tv_tvname
migx_ TV-параметр типа MIGX migx_tvname
ms_ Поле товара miniShop3 (таблица modx_ms3_products) ms_price | ms_new | ms_vendor
mso_ Опции товара miniShop3 (таблица modx_ms3_product_options) mso_fieldname

Указание полей в вызове перекрывает данные из формы, то есть если указано &parent=`15`, а в форме есть поле с name="parent", то что-бы пользователь в нем не проставил, родителем будет ресурс с ID=15.

Если используете предуставноленные поля типа MIGX, то значения указывайте в JSON-формате:

[[
    ...
    &migx_chars=`[ [ { "title":"Высота","value":"1500"},{"title":"Ширина","value":"500"} ] ]`
    ...
]]

Сниппет upCheck

Сниппет используется в форме редактирования для вывода значений полей ресурса (выбранные селекты, отмеченные чекбоксы).

rid ID ресурса
field Поле с префиксом
value Значение
type Тип вывода (selected - для списков, пусто - для checkbox и radio)

В комплекте идут чанки с примерами форм (поддерживается Fenom и стандартный синтаксис). В форме редактирования доступен плейсхолдер rid, который выводит ID редактируемого ресурса и его можно использовать для вывода значений полей через модификатор resource:

{$rid | resource : 'fieldname'}
Префиксы полей
Без префикса Поле ресурса (таблица modx_site_content) pagetitle | longtitle | content
tv_ TV-параметр tv_tvname
migx_ TV-параметр типа MIGX migx_tvname
ms_ Поле товара miniShop3 (таблица modx_ms3_products) ms_price | ms_new | ms_vendor
mso_ Опции товара miniShop3 (таблица modx_ms3_product_options) mso_fieldname

Поле ресурса:

<input name="pagetitle" value="{$rid | resource : 'pagetitle'}" placeholder="{'up_pagetitle' | lexicon}">

Поле товара miniShop3:

<label>
    <input type="checkbox" name="ms_popular" value="1"> {'up_popular' | lexicon}
</label>

Селект производителей товаров miniShop3 (чанк up_vendor_option идёт в комплекте):

<select name="ms_vendor_id">
    {'pdoResources' | snippet : [
        'class' => 'MiniShop3\Model\msVendor',
        'sortby' => '{ "name":"ASC" }'
        'tpl' => 'up_vendor_option',
        'rid' => $rid
    ]}
</select>

Категории товара miniShop3 (чанк up_category_tpl идёт в комплекте):

<select name="ms_vendor_id">
    {'pdoResources' | snippet : [
        'parents' => 0,
        'where' => '{ "class_key:LIKE":"%Category%" }',
        'limit' => 0,
        'sortby' => '{ "pagetitle":"ASC" }'
        'tpl' => 'up_category_tpl'
        'rid' => $rid
    ]}
</select>

TV-параметр с именем instock:

<input name="tv_instock" value="{$rid | resource : 'instock'}">

У TV с типом image или file скрипт проверит источник файлов, создаст там директорию с ID нового ресурса и загрузит файлы в неё.

MIGX-параметры

Табличный виджет при загрузке проверяет что прописано у данного TV в названии и параметрах ввода (конфигурация MIGX или вкладки формы) и формирует соответствующую таблицу, в которой можно добавлять и удалять строки, перемещать их местами и т.д.

Пример вывода виджета для поля с именем chars (обратите внимание на id="migx_chars_widget" у контейнера и атрибуты name и id, а также плейсхолдер {$migx_chars} скрытого textarea):

<div id="migx_chars_widget" class="tablewidget"></div>
<textarea name="migx_chars" id="migx_chars" class="up-hidden">{$migx_chars}</textarea>
Поле с текстовым редактором

У контейнера должен быть data-field со значением, соответствующим name скрытого textarea:

<div class="up-richeditor" data-field="content"></div>
<textarea name="content" class="up-hidden">{$rid | resource : 'content'}</textarea>
Поля Dropzone

Виджет поддерживает мультизагрузку и изменение порядка файлов.

Для настройки виджета используются data-атрибуты у контейнера:

data-field Имя поля
data-files Максимальное кол-во файлов 5
data-types Типы файлов. Можно указывать как непосредственно расширения, так и типы. image/*
data-size Размер одного файла в МБ 5

Например, есть TV-параметр file для файлов типа PDF,XLSX,DOCX и нужно ограничить количество файлов тремя, чтобы каждый весил не более 10МБ:

<div class="up-dropzone dropzone" data-field="tv_files" data-files="3" data-types=".pdf,.xlsx,.docx" data-size="10"></div>
<textarea name="tv_files" class="up-hidden">{$rid | resource : 'files'}</textarea>

Если для TV-поля указан источник файлов, отличный от Filesystem, то в форме редактирования для вывода существующего значения используйте сниппет upCheck без параметра value (он выведет чистые данные из базы):

<textarea name="tv_files" class="up-hidden">
    {'!upCheck' | snippet : ['rid' => $rid, 'field' => 'tv_files']}
</textarea>

Галерея товара miniShop3 с Dropzone и настройками по умолчанию (чанк up_gallery_tpl идёт в комплекте):

<div class="up-dropzone dropzone" data-field="ms_gallery"></div>
<textarea name="ms_gallery" class="up-hidden">{'!msGallery' | snippet : ['product' => $rid, 'tpl' => 'up_gallery_tpl']}</textarea>

Системные события для плагинов:

upOnBeforeChangeResource

Вызывается перед созданием / редактированием ресурса.
Принимает массив $data с входящими данными. Должен также возвращать $data.
Если добавить $date['error_message'] выведется соответствующее сообщение об ошибке и скрипт прекратит работу.

Например, нужно проверить TV-параметр tv_seotitle на длину и если она больше 70 знаков вывести сообщение об ошибке, а если нет, добавить фразу ", купить недорого":

<?php
switch($modx->event->name){
    case 'upOnBeforeChangeResource':
        if(mb_strlen($data['tv_seotitle']) > 70){
            $data['error_message'] = 'Слишком длинный заголовок';
        }else{
            if(mb_stripos($data['tv_seotitle'], ', купить недорого') === false){
                $data['tv_seotitle'] = $data['tv_seotitle'].', купить недорого';
            }
        }
        $modx->event->returnedValues['data'] = $data;
    break;
}
upOnAfterChangeResource

Вызывается после сохранения ресурса.
Принимает объект ресурса $object, ничего не возвращает.

Например, нужно все внешние ссылки в контенте заменить на [ссылка]:

<?php
switch($modx->event->name){
    case 'upOnAfterChangeResource':
        if($object){
            $content = preg_replace('/(?:https?|ftp):\/\/[^\s]+|www\.[^\s]+/', '[ссылка]', $object->get('content'));
            $object->set('content', $content);
            $object->save();
        }
    break;
}