Сохранение полей формы в новой версии FormIt 2.2.2
Привет!
Сегодня днем я тут спрашивал как настроить новую версию FormIt так, что бы он сохранял значения формы.
К сожалению, разработчики компонента не отредактировали документацию и было совершенно не понятно как это должно работать.
Установив новую версию, я попробовал подключить хук FormItSaveForm. Вроде как это должно было сработать и значения полей должны были записаться в базу. Но нет…
К сожалению опыта у меня не так много и найденные мной недочеты в коде некоторым могут показаться очевидными, но тем не менее я заставил компонент работать как надо.
В сниппете FormItSaveForm необходимо в двух местах поправить запрос на получение id текущего ресурса и имени текущего контекста:
вместо
а вместо
в 82 строке нужно было написать
Форма заработала и значения начали сохраняться. Но не так как хотелось) Имена полей были на латинице и совпадали с именами инпутов.
Немного порывшись в коде понял, что следует делать вызов формы со следующими параметрами (привожу полный вызов):
В
В
В
Ну и в
Например, если указывать имена как
В результате в админке появились вот такие приятные записи:
Все это написал, в первую очередь для тех, кто сам так же как и я не особо искушен в написании своих компонентов и только начинает свой путь в этом направлении. Получилось очень размашисто, но зато вроде все сказал)
P.S. А кто хочет, что бы у него панель с сохраненными полями была на русском, просто скачайте вот эти файлики (перевел сам):
Дефолтные словари (перевел только название и описание пункта меню)
Словари для панели (перевел все)
Кто не помнит: файлы положить надо в /core/components/formit/lexicon/ru/
Спасибо)
Сегодня днем я тут спрашивал как настроить новую версию 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/
Спасибо)
Комментарии: 30
Читать интересно. У тебя живой приятный язык. Пиши еще)
Кстати, раз уж начал осваивать компоненты и перевел лексиконы, сделай пулл-реквест автору, чтобы новая версия уже была с русским языком. Вот репозиторий компонента: https://github.com/modxcms/FormIt, вот инструкция, как сделать пулл-реквест: Как начать участвовать в Open Source
Кстати, раз уж начал осваивать компоненты и перевел лексиконы, сделай пулл-реквест автору, чтобы новая версия уже была с русским языком. Вот репозиторий компонента: https://github.com/modxcms/FormIt, вот инструкция, как сделать пулл-реквест: Как начать участвовать в Open Source
думал об этом тоже… пожалуй так и сделаю)
Спасибо за подсказки, а то автор только обещал написать документацию по работе с новыми функциями.
И раз нашли ошибки — то сообщите разработчику, пожалуйста, а то каждый раз после обновления править код не очень хорошо.
И раз нашли ошибки — то сообщите разработчику, пожалуйста, а то каждый раз после обновления править код не очень хорошо.
Послал Issues разработчикам на GitHub)
Скажите, а зачем вы правите FormItSaveForm? — это нужно для совместимости с AjaxForm?
То есть я добавил только
&hooks=`email,FormItSaveForm,…
&formFields=
&fieldNames=
в вызов FormIt и все заработало, правда использую FormIt без AjaxForm
То есть я добавил только
&hooks=`email,FormItSaveForm,…
&formFields=
&fieldNames=
в вызов FormIt и все заработало, правда использую FormIt без AjaxForm
да, мне нужно, что бы компонент работал через AjaxForm… без него вроде все работает как надо. наверное стоило указать это где-нибудь в заметке.
Теперь с AjaxForm работает все как надо. FormItSaveForm не изменял.
Правки FormItSaveForm похоже были первоапрельской шуткой — хорошая попытка заменить Fatal error на Notice (Trying to get property of non-object). Чтобы все работало правильно, AjaxForm должен подменять $modx->resource, иначе не будут нормально (правильно) работать любые хуки FormIt, которые зависят от текущей страницы ($modx->resource), на которой находится форма.
В последней версии я там добавил отправку id страницы, на которой запущена форма.
Видимо, нужно еще добавить загрузку этой страницы в $modx->resource? Я правильно понял проблему?
Видимо, нужно еще добавить загрузку этой страницы в $modx->resource? Я правильно понял проблему?
Да, все верно.
Добавил правку и обновил пакет в репозитории, проверяйте.
проверил, работает!) спасибо:)
Ура!
Осталось только удалить issue чтобы не шокировать разработчиков FormIt :)
У меня не заработало с ходу. Заработало только после внесения правок из поста.
До правок возвращало 500 ошибку в строках 35 и 82, где присутствовало:
До правок возвращало 500 ошибку в строках 35 и 82, где присутствовало:
35: $modx->resource->get('id')
82: $modx->resource->get('context_key')
FormIt 2.2.2-pl, AjaxForm 1.0.7-pl
Повторюсь еще раз — эти правки всего лишь заменяют фатальную ошибку нефатальной, всегда необходимо находить безошибочное решение :)
получается, issue зря написал) значит проблему можно решить на стороне AjaxForm?
А не подскажете случаем как отравлять в шаблоне сообщения ID самой заявки?
Если применить изменения, то можно будет использовать в шаблоне письма плейсхолдеры [[+savedForm.*]] с полями сохраненной формы (например, [[+savedForm.id]] для ID заявки).
Попробовал на двух сайтах, не получилось. Пользуюсь AjaxForm
Могу предположить, что причина может быть в неправильном порядке вызова хуков. Вот демка с модифицированным сниппетом FormItSaveForm, пробуйте пока она жива:
s1509.h3.modhost.pro/manager/
s1509 / 721QTQutryPt
s1509.h3.modhost.pro/manager/
s1509 / 721QTQutryPt
Андрей, ну мне даж добавить нечего поменял порядок хуков все магическим образом заработало! Просто огромное человеческое спасибо!
Андрей, подскажите пожалуйста. Какой порядок должен быть у хуков? Аналогично, как в посте не работает, а демка умерла просто давно уже)
Попробуйте поставить customExtra и сохранять формы в нем.
В форме заявок нужно добавить хук, назовём его, к примеру saveRequest
В сниппете создадим объект и сохраним его
ilyaut.ru/addons/very-easy-to-add-custom-objects-in-modx/
В форме заявок нужно добавить хук, назовём его, к примеру 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/
Илья, спасибо большое!!! Не догадалась на твоем сайте посмотреть. Спасибо, буду пробовать.
Пробывал ли кто делать импорт csv сохраненных форм?
У меня в csv какая-то проблема с кодировкой. Только где не знаю =(
При этом в базе русские символы кодируются так:
У меня в csv какая-то проблема с кодировкой. Только где не знаю =(
При этом в базе русские символы кодируются так:
Нашел решение с импортом форм в базу?
Нет, не нашел
Спасибо вам большое! Сэкономили мне кучу времени. :)
Что с FormItSaveForm что с FormSave ужасная кодировка. С utf-8 не работает, кто знает как исправить?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.