Сохранение полей формы в новой версии FormIt 2.2.2

Привет!
Сегодня днем я тут спрашивал как настроить новую версию FormIt так, что бы он сохранял значения формы.
К сожалению, разработчики компонента не отредактировали документацию и было совершенно не понятно как это должно работать.

Установив новую версию, я попробовал подключить хук FormItSaveForm. Вроде как это должно было сработать и значения полей должны были записаться в базу. Но нет…
К сожалению опыта у меня не так много и найденные мной недочеты в коде некоторым могут показаться очевидными, но тем не менее я заставил компонент работать как надо.
В сниппете FormItSaveForm необходимо в двух местах поправить запрос на получение id текущего ресурса и имени текущего контекста:
вместо
$formName = $modx->getOption('formName', $formit->config, 'form-'.$modx->resource->get('id'));
в 35 строке сниппета нужно было написать
$formName = $modx->getOption('formName', $formit->config, 'form-'.$modx->resource->id);

а вместо
'context_key' => $modx->resource->get('context_key')

в 82 строке нужно было написать
'context_key' =>$modx->context->key

Форма заработала и значения начали сохраняться. Но не так как хотелось) Имена полей были на латинице и совпадали с именами инпутов.



Немного порывшись в коде понял, что следует делать вызов формы со следующими параметрами (привожу полный вызов):
[[!AjaxForm?
	&snippet=`FormIt`
	&form=`tpl.AjaxForm.example`
	&hooks=`math,email,FormItSaveForm,FormItAutoResponder`
	&formName=`Форма на странице контактов`
	&formFields=`name,email,message`
	&fieldNames=`name==Имя отправителя,email==Эл.почта отправителя,message==Комментарий отправителя`
	&emailTpl=`emailTmpl` 
	&emailSubject=`Сообщение с сайта 3musictver.org.`
	&emailTo=`suhomozgy.andrey@gmail.com`
	&validate=`name:required,email:required,message:required,math:required`
	&validationErrorMessage=`В форме содержатся ошибки!`
	&successMessage=`Сообщение успешно отправлено`
	&fiarTpl=`backToUserEmail`
    &fiarSubject=`Спасибо за ваш вопрос!`
    &fiarToField=`email`
    &fiarFromName=`Детская школа искусств им. В.В. Андреева`
    &fiarFrom=`no-reply@3musictver.org`
    &mathMinRange=`1`
    &mathMaxRange=`5`
]]


В
&hooks=`...email,FormItSaveForm...`
делаем сохранение значений после отправки письма.

В
&formName=`Форма на странице контактов`
говорим как будет называться наша форма. Это что бы в админке можно было фильтровать по названию.

В
&formFields=`name,email,message`
перечисляем поля, которые необходимо сохранить. Иначе будут сохранены все и получится как на картинке выше.

Ну и в
&fieldNames=`name==Имя отправителя,email==Эл.почта отправителя,message==Комментарий отправителя`
перечисляем нужные поля с присвоением им имен. Порядок написания важен.
Например, если указывать имена как
...Имя отправителя==name...
то получите такую картинку



В результате в админке появились вот такие приятные записи:



Все это написал, в первую очередь для тех, кто сам так же как и я не особо искушен в написании своих компонентов и только начинает свой путь в этом направлении. Получилось очень размашисто, но зато вроде все сказал)

P.S. А кто хочет, что бы у него панель с сохраненными полями была на русском, просто скачайте вот эти файлики (перевел сам):
Дефолтные словари (перевел только название и описание пункта меню)
Словари для панели (перевел все)

Кто не помнит: файлы положить надо в /core/components/formit/lexicon/ru/

Спасибо)
Андрей Сухомозгий
Андрей Сухомозгий
31 марта 2015, 16:51
modx.pro
12 466

Комментарии: 30

Илья Уткин
31 марта 2015, 20:48
Читать интересно. У тебя живой приятный язык. Пиши еще)

Кстати, раз уж начал осваивать компоненты и перевел лексиконы, сделай пулл-реквест автору, чтобы новая версия уже была с русским языком. Вот репозиторий компонента: https://github.com/modxcms/FormIt, вот инструкция, как сделать пулл-реквест: Как начать участвовать в Open Source
Aleksandr PL
31 марта 2015, 21:26
Спасибо за подсказки, а то автор только обещал написать документацию по работе с новыми функциями.

И раз нашли ошибки — то сообщите разработчику, пожалуйста, а то каждый раз после обновления править код не очень хорошо.
Aleksandr PL
31 марта 2015, 21:38
Скажите, а зачем вы правите FormItSaveForm? — это нужно для совместимости с AjaxForm?

То есть я добавил только
&hooks=`email,FormItSaveForm,…
&formFields=
&fieldNames=

в вызов FormIt и все заработало, правда использую FormIt без AjaxForm

    Андрей Сухомозгий
    31 марта 2015, 21:40
    да, мне нужно, что бы компонент работал через AjaxForm… без него вроде все работает как надо. наверное стоило указать это где-нибудь в заметке.
      Роман Ильин
      02 мая 2017, 08:50
      Теперь с AjaxForm работает все как надо. FormItSaveForm не изменял.
    Andrey Grachov
    02 апреля 2015, 03:16
    Правки FormItSaveForm похоже были первоапрельской шуткой — хорошая попытка заменить Fatal error на Notice (Trying to get property of non-object). Чтобы все работало правильно, AjaxForm должен подменять $modx->resource, иначе не будут нормально (правильно) работать любые хуки FormIt, которые зависят от текущей страницы ($modx->resource), на которой находится форма.
      Василий Наумкин
      02 апреля 2015, 05:47
      В последней версии я там добавил отправку id страницы, на которой запущена форма.

      Видимо, нужно еще добавить загрузку этой страницы в $modx->resource? Я правильно понял проблему?
        Andrey Grachov
        02 апреля 2015, 11:05
        Да, все верно.
          Василий Наумкин
          02 апреля 2015, 11:57
          Добавил правку и обновил пакет в репозитории, проверяйте.
            Андрей Сухомозгий
            02 апреля 2015, 12:00
            проверил, работает!) спасибо:)
            Сергей Фещуков
            03 апреля 2015, 11:17
            У меня не заработало с ходу. Заработало только после внесения правок из поста.
            До правок возвращало 500 ошибку в строках 35 и 82, где присутствовало:
            35: $modx->resource->get('id')
            82: $modx->resource->get('context_key')
            FormIt 2.2.2-pl, AjaxForm 1.0.7-pl
              Andrey Grachov
              04 апреля 2015, 14:53
              Повторюсь еще раз — эти правки всего лишь заменяют фатальную ошибку нефатальной, всегда необходимо находить безошибочное решение :)
        Андрей Сухомозгий
        02 апреля 2015, 08:17
        получается, issue зря написал) значит проблему можно решить на стороне AjaxForm?
        Хулио Надда
        05 апреля 2015, 00:47
        А не подскажете случаем как отравлять в шаблоне сообщения ID самой заявки?
          Andrey Grachov
          06 апреля 2015, 13:44
          Если применить изменения, то можно будет использовать в шаблоне письма плейсхолдеры [[+savedForm.*]] с полями сохраненной формы (например, [[+savedForm.id]] для ID заявки).
            Хулио Надда
            06 апреля 2015, 16:45
            Попробовал на двух сайтах, не получилось. Пользуюсь AjaxForm
              Andrey Grachov
              06 апреля 2015, 23:23
              Могу предположить, что причина может быть в неправильном порядке вызова хуков. Вот демка с модифицированным сниппетом FormItSaveForm, пробуйте пока она жива:
              s1509.h3.modhost.pro/manager/
              s1509 / 721QTQutryPt
                Хулио Надда
                06 апреля 2015, 23:37
                Андрей, ну мне даж добавить нечего поменял порядок хуков все магическим образом заработало! Просто огромное человеческое спасибо!
                  Julia Phoenix
                  17 декабря 2015, 20:59
                  Андрей, подскажите пожалуйста. Какой порядок должен быть у хуков? Аналогично, как в посте не работает, а демка умерла просто давно уже)
                    Илья Уткин
                    18 декабря 2015, 00:18
                    Попробуйте поставить customExtra и сохранять формы в нем.

                    В форме заявок нужно добавить хук, назовём его, к примеру saveRequest
                    [[!FormIt?  
                        &hooks=`saveRequest,email,redirect`  
                        &emailTo=`your@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;



                    ilyaut.ru/addons/very-easy-to-add-custom-objects-in-modx/
                      Julia Phoenix
                      21 декабря 2015, 08:22
                      Илья, спасибо большое!!! Не догадалась на твоем сайте посмотреть. Спасибо, буду пробовать.
            Николай Загумённов
            07 мая 2015, 18:35
            Пробывал ли кто делать импорт csv сохраненных форм?
            У меня в csv какая-то проблема с кодировкой. Только где не знаю =(

            При этом в базе русские символы кодируются так:

            Scorp Satex
            02 июля 2015, 19:55
            Спасибо вам большое! Сэкономили мне кучу времени. :)
              Lori
              12 ноября 2016, 12:49
              Что с FormItSaveForm что с FormSave ужасная кодировка. С utf-8 не работает, кто знает как исправить?
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                30