К содержанию

Сохранение полей формы в новой версии 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 724
Реклама

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

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

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

    И раз нашли ошибки — то сообщите разработчику, пожалуйста, а то каждый раз после обновления править код не очень хорошо.
    Aleksandr PL
    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
      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
          Andrey Grachov Старожил
          02 апреля 2015, 11:05
          Да, все верно.
            Василий Наумкин
            Василий Наумкин Администратор
            02 апреля 2015, 11:57
            Добавил правку и обновил пакет в репозитории, проверяйте.
              Андрей Сухомозгий
              Андрей Сухомозгий Проверенный
              02 апреля 2015, 12:00
              проверил, работает!) спасибо:)
                Василий Наумкин
                Василий Наумкин Администратор
                02 апреля 2015, 12:06
                Ура!
                  Andrey Grachov
                  Andrey Grachov Старожил
                  02 апреля 2015, 14:02
                  Осталось только удалить issue чтобы не шокировать разработчиков FormIt :)
                  Сергей Фещуков
                  Сергей Фещуков Проверенный
                  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
                    Andrey Grachov Старожил
                    04 апреля 2015, 14:53
                    Повторюсь еще раз — эти правки всего лишь заменяют фатальную ошибку нефатальной, всегда необходимо находить безошибочное решение :)
              Андрей Сухомозгий
              Андрей Сухомозгий Проверенный
              02 апреля 2015, 08:17
              получается, issue зря написал) значит проблему можно решить на стороне AjaxForm?
              Хулио Надда
              Хулио Надда Проверенный
              05 апреля 2015, 00:47
              А не подскажете случаем как отравлять в шаблоне сообщения ID самой заявки?
                Andrey Grachov
                Andrey Grachov Старожил
                06 апреля 2015, 13:44
                Если применить изменения, то можно будет использовать в шаблоне письма плейсхолдеры [[+savedForm.*]] с полями сохраненной формы (например, [[+savedForm.id]] для ID заявки).
                  Хулио Надда
                  Хулио Надда Проверенный
                  06 апреля 2015, 16:45
                  Попробовал на двух сайтах, не получилось. Пользуюсь AjaxForm
                    Andrey Grachov
                    Andrey Grachov Старожил
                    06 апреля 2015, 23:23
                    Могу предположить, что причина может быть в неправильном порядке вызова хуков. Вот демка с модифицированным сниппетом FormItSaveForm, пробуйте пока она жива:
                    s1509.h3.modhost.pro/manager/
                    s1509 / 721QTQutryPt
                      Хулио Надда
                      Хулио Надда Проверенный
                      06 апреля 2015, 23:37
                      Андрей, ну мне даж добавить нечего поменял порядок хуков все магическим образом заработало! Просто огромное человеческое спасибо!
                        Julia Phoenix
                        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
                            Julia Phoenix Старожил
                            21 декабря 2015, 08:22
                            Илья, спасибо большое!!! Не догадалась на твоем сайте посмотреть. Спасибо, буду пробовать.
                  Николай Загумённов
                  Николай Загумённов Проверенный
                  07 мая 2015, 18:35
                  Пробывал ли кто делать импорт csv сохраненных форм?
                  У меня в csv какая-то проблема с кодировкой. Только где не знаю =(

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

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