Наверх

Очень простое добавление кастомных объектов в MODX

Все знают, что Василий Наумкин разработал «заготовку» для создания собственных компонентов — modExtra. Чтобы создать компонент нужно только описать модель и подготовить интерфейс — всё зависит от фантазии разработчика.

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

Периодически я вижу, что на сайтах, например, заявки или каталог, наполняемый с фронтенда реализуется с помощью ресурсов. Но ресурсы не всегда подходят для этого. Сегодня я покажу, как просто и быстро добавить новый объект в MODX. Да, в очередной раз =)

Сегодня речь пойдет о компоненте customExtra. С его помощью мы будем сохранять просьбы перезвонить в админке.

customExtra — это полностью то же самое, что и modExtra, только в нем помимо полей name, description и active добавлено 10 строковых полей, 10 числовых полей (integer) и 5 тестовых областей (textarea). Ну, и еще этот компонент размещен в репозитории, чтобы можно было скачать и установить, а не «собирать».

После установки в системных настройках нужно указать, сколько полей каждого вида нам надо.


Там же можно указать, какие из чекбоксов вам нужны, и в каком порядке их выводить в окнах создания и редактирования.

Все заголовки полей редактируются в словарях


В форме заявок нужно добавить хук, назовём его, к примеру saveRequest
[[!FormIt?  
    &hooks=`spam,saveRequest,email,redirect`  
    &emailTo=`ilyautkin@mail.ru`  
    &emailSubject=`Заказ обратного звонка`
    &emailTpl=`tpl.mail.contact`
    &redirectTo=`5`
]]
В сниппете создадим объект и сохраним его
<?php
$modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/');
$request = $modx->newObject('customExtraItem');
$request->set('name', $_POST['name']);
$request->set('string1', $_POST['contact']);
$request->set('description', $_POST['text']);
$request->save();
return true;
У меня используется FormIt, но будет работать и с AjaxForm.

Теперь заявки не только отправляются на почту, но и сохраняются в базе данных, причем их можно увидеть в админке:


Созданные объекты можно вывести и на самом сайте — с помощью pdoTools. Нужно только указать класс объектов и по какому полю сортировать:
[[pdoResources?
  &class=`customExtraItem`
  &loadModels=`customextra`
  &sortby=`id`
  &tpl=`tpl.requests`
]]


18 комментариев

  1. Eugene Generalov 09 декабря 2015, 10:13 # 0
    Добрый день, Илья.
    Подскажите, а будет ли работать параметр &where? И как правильно его указать?
    1. Илья Уткин 09 декабря 2015, 10:41 # 0
      Конечно будет. Указывать так же, как и всегда:
      [[pdoResources?
        &class=`customExtraItem`
        &loadModels=`customextra`
        &sortby=`id`
        &where=`{"active":1,"string1:LIKE":"%@mail.ru%","id1:>":1000}`
        &tpl=`tpl.requests`
      ]]
    2. Игорь 09 декабря 2015, 11:17(Комментарий был изменён) # 0
      А как убрать лишние чекбоксы?
      1. Илья Уткин 09 декабря 2015, 12:41 # 0
        Обновите компонент до новой версии — там добавилось управление чекбоксами — прямо в системных настройках указываете, какие чекбоксы и в каком порядке выводить
        1. Игорь 10 декабря 2015, 03:12 # 0
          Шикарно! Спасибо большое.
      2. Саня Boshnik 11 декабря 2015, 06:52 # 0
        Круто.
        А можно ли сделать для нескольких форм?

        в голову приходит только скрытое поле, для каждой формы. Но было бы круто сделать фильтр по этому полю как в FormSave, чтобы можно было выбрать необходимую форму.
        1. Илья Уткин 11 декабря 2015, 07:06 # 0
          Думаю, можно выделить какое-то поле из 34, чтобы хранить в нем тип формы…
          <?php
          $modx->addPackage('customextra', $modx->getOption('core_path').'components/customextra/model/');
          $request = $modx->newObject('customExtraItem');
          $request->set('name', $_POST['name']);
          $request->set('string1', $_POST['contact']);
          switch ($modx->resource->id) {
            case 16:
              $request->set('string2', 'Форма на странице контактов');
              break;
            case 21:
              $request->set('string2', 'Форма в футере');
              break;
            default:
              $request->set('string2', 'Другая форма');
              break;
          }
          $request->set('description', $_POST['text']);
          $request->save();
          return true;
          В админке фильтров нет, но есть сортировка по любому полю.
        2. Max 20 декабря 2015, 17:10 # 0
          Т.е. получается установил customExtra один раз, настроил форму, заголовки и это только для одного раза? А если надо подобное проделать для многих ресурсов? Как это реализовать?
          1. Илья Уткин 20 декабря 2015, 18:09 # 0
            В смысле — на нескольких сайтах?

            Если надо иметь один функционал и один набор полей на нескольких сайтах, то нужно брать modExtra и писать свой компонент.

            customExtra нужен для быстрой реализации каконо-то кастомного функционала, который вряд ли где-то еще понадобится копировать.

            Например, недавно надо было реализовать генерацию номера заявки — вот, просто сохраняешь заявки в базе и на основе id-шника присваиваешь заявке номер.
            1. Max 20 декабря 2015, 19:25(Комментарий был изменён) # 0
              Извините, наверное не правильно выразился. customExtra появляется в меню один раз и реализует какой то один функционал для админки. А если бы мне таких несколько надо? Вот у вас в примере: Заявка на обратный звонок. А хочется ещё добавить: Заявка на резервирование продукта допустим, или анкетные данные собрать и вот так вывести, этак много customExtra. И чтобы не в меню, а в дереве ресурсов выводилось, во вкладке «Доп.поля».
              1. Илья Уткин 20 декабря 2015, 19:58 # 0
                А, ну да, в админке только одна страничка с одной табличкой.

                И чтобы не в меню, а в дереве ресурсов выводилось, во вкладке «Доп.поля»
                Для этого, к сожалению, придется MIGX использовать…
              2. Алексей Мелешин 28 апреля 2016, 17:11 # 0
                Илья, добрый день!!!

                Во-первых — спасибо тебе большое за твой труд!!! Молодец!!! Очень много интересной, а, главное, полезной информации.

                Вот у меня вопрос, а точнее небольшой затык.

                Может быть и не сюда мне нужно писать, но я незнаю куда правильно написать, а вопрос в следующем:

                ты пишешь «Например, недавно надо было реализовать генерацию номера заявки — вот, просто сохраняешь заявки в базе и на основе id-шника присваиваешь заявке номер.» А можешь поподробнее рассказать как это сделано.

                Вот что я хочу добиться у себя на сайте:

                Есть ряд форм (AjaxForm+FormIt), в которых указываются имя, телефон, емайл и прикрепляется файл. И при успешной отправке, на странице нужно выводить сообщение "[[Имя]], Ваша заявка принята. Номер Вашей заявки [[Номер заявки]]." И информацию из заполненных полей формы записывать в БД.

                Так вот вопрос (я не очень селен в бэкэнде, да и с xPDO только начал разбираться), как реализовать во всплывающем сообщении показ присвоенного номера заявки? И, если не составит труда, расскажи, как записать файл в БД. (Или как сохранить файл в какую-нибудь директорию на сервере, а в БД записать путь к этому файлу).

                Спасибо!
                1. Илья Уткин 28 апреля 2016, 17:35 # +1
                  Вот именно для таких случаев я и собрал customExtra. В FormIt есть понятие «хук» — это сниппет, который что-то делает, нужное разработчику. В форме нужно указать наименование сниппета
                  [[!FormIt?  
                      &hooks=`saveRequest,email`
                  ]]
                  Тогда сначала будет выполнен этот сниппет. А в сниппете уже писать код, который сохранит и выведет все поля (в статье пример есть).

                  Но, конечно, без навыков программирования, реализовать это будет сложно. Если хочется разобраться самому, то не надо жалеть времени и читать, пробовать. Если нужно для коммерческого сайта реализовать, проще написать объявление о работе на modx.pro — там немало специалистов, готовых помочь даже в такой мелкой проблеме.
                  1. Алексей Мелешин 29 апреля 2016, 13:24 # 0
                    Пример как сохранить поля есть, да… а можно пример как вывести значение поля при отправке, например во всплывающее окно, которое генерирует AjaxForm, ну или в любое другое место…
                    Вот если я пишу вот так:

                    Вызов формы:
                    [[!AjaxForm?
                    	&snippet = `FormIt`
                    	&form = `freecons-form`
                    	&hooks = `SaveOrder`
                    	&emailSubject = `Заказ консультации`
                    	&emailTo = `email@email.ru`
                    	&emailTpl = `freecons-tpl`
                    	&validate = `email:email`
                    	&validationErrorMessage = `Не все поля формы заполнены или заполнены не корректно`
                    	&successMessage = `Ваша заявка направлена.
                    Номер заявки <strong>[[+numord]]</strong>.
                    Мы свяжемся с Вами в ближайшее время.`
                    ]]
                    
                    Сниппет «SaveOrder»:
                    <?php
                    $order = $modx->newObject('Orderform');
                    $order->set('name', $_POST['name']);
                    $order->set('email', $_POST['email']);
                    $order->set('phone', $_POST['phone']);
                    $order->set('fromform', $_POST['fromform']);
                    $order->save();
                    
                    $num = $order->get('id');
                    $modx->setPlaceholder('numord', $num);
                    return true;
                    
                    то в БД запись происходит, но вот вывод значения в плейсхолдер numord не происходит.

                    Я думаю, что я где-то близко, только не пойму, что я не так делаю.

                    Если не трудно, можешь поделиться опытом, и подсказать что я делаю не так?

                    Спасибо!!!
            2. Ден Ефремов 27 декабря 2015, 02:55 # 0
              А возможно ли эти объекты зависимыми сделать?
              Чтобы заказы удалились, вместе с пользователем.
              1. Илья Уткин 09 января 2016, 14:05 # 0
                Только если прописать собственные процессоры или внести изменения в модель. Можно вот таким плагином, кстати, чтобы изменения не затёрлись при обновлении.
              2. Александр 09 октября 2016, 12:44 # 0
                Я использую customExtra для сохранения полей формы formit. Там среди прочих полей есть загрузка картинки. Как вывести её в customExtra?
                1. Илья Уткин 09 октября 2016, 13:43 # 0
                  Надо менять файлы компонента. Вот небольшая шпаргалка: ilyaut.ru/cheats/attaching-pictures-to-an-object-in-extjs/

                Авторизация

                через сервис Loginza:


                Шаблоны MODX

                1 2 Дальше »

                Объектная
                модель
                MODX