Если кому не лень подсказать, пожалуйста помогите. Использую migx чтобы создать динамические поля формы. То есть на разных страницах разное количество полей. Теперь вот вопрос, как сделать так, чтобы значения этих полей отправлять на почту и сделать их обязательными. Я на сейчас сделал так. Перебираю migx с полями формы. Затем составляю список полей для формы и список обязательных полей (в виде просто строки) и потом подставляю это все в AjaxForm{set $pall = json_decode($_modx->resource.pall, true)} {set $listQuest = ''}{* список вопросов *} {foreach $pall as $questions} {set $validate = ''} {set $idAnswer = $questions.MIGX_id}{* id вопроса *} {set $listQuest = $listQuest ~ '<p><b>{{+quest_' ~ $idAnswer ~ '}}</b>: ' ~ '{{+answer_' ~ $idAnswer ~ '}}' ~ ' (Другое: ' ~ '{{+answer_' ~ $idAnswer ~ '_oth}})'} {* записываем все поля для отправки на почту получается строка в виде: <b>{{+quest_1}}</b>: {{+answer_1}} и так далее. Это для шаблона письма*} {if $questions.required == 1} {set $validate = $validate ~ "answer_" ~ $idAnswer ~ ":required,"} {* отмечаем все обязательные поля получается строка в виде: answer_1:required,answer_2:required и тд *} {/if} {/foreach}{$_modx->runSnippet('!AjaxForm', [ 'snippet' => 'FormIt', 'form' => 'opros.tpl', 'hooks' => 'email, spam', 'spamEmailFields'=> 'phone, name', 'emailSubject' => 'Опрос с сайта', 'emailTo' => $_modx->config.emailto, 'emailTpl' => '@INLINE <p>Опрос с сайта</b> <p>Страница: <b>{{+page}}</b> <p>Имя: <b>{{+name}}</b> <p>Телефон: <b>{{+phone}}</b> <p>Ответы:' ~ $listQuest, 'emailFrom' => '[email protected]', 'validate' => $validate ])}Наверное это жуткий костыль. Но в целом все работает. Только вот два вопроса. Почему-то $validate когда я подставляю, поля не становятся required, хотя сама переменная правильно выглядит, если вручную из прописать, то все норм. И я не могу проверить заполнено ли поле, поэтому на почту приходят все поля, а хотелось бы как-то проверить заполнено ли поле и отправить только заполненные поля. А ну и чанк формы самой:<form action="" method="post"> <input type="hidden" name="page" value="{$_modx->resource.pagetitle}"/> {set $pall = json_decode($_modx->resource.pall, true)} {* список вопросов *} {set $counter = 1} {foreach $pall as $questions} {set $answers = json_decode($questions.answers, true)} {* вопросы и ответы *} {set $idAnswer = $questions.MIGX_id} <h4>{$questions.question}{if $questions.required == 1}<span>*</span>{/if}</h4> <input type="hidden" name="quest_{$idAnswer}" value="{$questions.question}"> {switch $questions.type} {* выбираем тип вопроса *} {case "1"} {* radio button *} <div> {foreach $answers as $answer} <div> <label><input type="radio" name="answer_{$idAnswer}" value="{$answer.answers}"> {$answer.answers}</label> </div> {/foreach} {if $questions.more == 1} <label>Другое</label> <input type="text" name="answer_{$idAnswer}_oth" value=""> {/if} <span>[[fi.error.answer_{$idAnswer}]]</span> <hr> </div> {case "2"}{* checkbox *} <div> {foreach $answers as $answer} {set $counter = 1} {set $lenght = count($answer)} {if $counter == 1} <input type="hidden" name="answer_{$idAnswer}[]" value="" /> {set $counter = $counter + 1} {/if} <div> <label><input type="checkbox" name="answer_{$idAnswer}[]" value="{$answer.answers}"> {$answer.answers}</label> </div> {/foreach} {if $questions.more == 1} <label>Другое</label> <input type="text" name="answer_{$idAnswer}_oth" value=""> {/if} <span>[[fi.error.answer_{$idAnswer}]]</span> <hr> </div> {case "3"}{* просто текст *} <div> <input type="text" name="answer_{$idAnswer}" value="{$answer.answers}"> <label></label> <span>[[fi.error.answer_{$idAnswer}]]</span> {if $questions.more == 1} <label>Другое</label> <input type="text" name="answer_{$idAnswer}_oth" value=""> {/if} <hr> </div> {case "4"}{* выпадающий список *} <div> {set $counter = 1} {set $lenght = count($answer)} {foreach $answers as $answer} {if $counter == 1} <select name="answer_{$idAnswer}" > {set $counter = $counter + 1} {/if} <option value="{$answer.answers}" [[!+fi.color:FormItIsSelected=`{$answer.answers}`]] >{$answer.answers}</option> {/foreach} {if $counter == $lenght} </select> {/if} <hr> </div> {/switch} {/foreach} <div> <label for="call_name">[[!%r.main_form_name]]</label> <input type="text" value="[[+fi.name]]" name="name" placeholder="[[!%r.main_form_name]]"> <span>[[+fi.error.name]]</span> </div> <div> <label for="call_phone">[[!%r.main_form_phone]]</label> <input type="text" name="phone" value="[[+fi.phone]]" placeholder="[[!%r.main_form_phone]]" name="phone"> <span>[[+fi.error.phone]]</span> </div> <input type="hidden" name="polit[]"> <input checked type="checkbox" name="polit[]" value="check"> <label for="conf-checkbox">[[!%r.forms_privacy_policy]]<span>[[+fi.error.polit]]</span></label> <button type="submit">[[!%r.forms_send]]</button> </form>
modx.pro
Обработка полей перед отправкой AjaxForm+FormIt / modx.pro
Данные отправляются средствами AjaxForm[[!AjaxForm? &snippet=`FormIt` &hooks=`spam,email,FormItSaveForm` &formName=`Заявка с сайта ` &formFields=`name,phone` &fieldNames=`name==Имя,phone==Номер телефона` &form=`tpl.ajaxform.club` &emailTpl=`tpl.message.form` &emailSubject=`Заявка с сайта` &emailFrom=`[email protected]` &emailTo=`[[+addressTo]]` &validate=`phone:required,addressTo:required` &validationErrorMessage=`В форме содержатся ошибки!` &successMessage=`Сообщение успешно отправлено!` ]] Форма работает. Все отлично. Теперь на сайте необходимо сделать синхронизацию форм со сторонним сервисов.
Вот что прислала поддержка сервиса:
ссылку мы дадим вам чуть позже — пока попробуйте подготовить верно параметры, чтобы получалась верная подпись.
когда подпись настроите — скажите.
пост или гет — безразницы
с параметрами определились:
host=www.fitness.ru&name=Иванов Иван Иванович&phone=79160413045&[email protected]×tamp=63680656072&signature=c20ad4d76fe97759aa27a0c99bff6710
фио можно разбить:
fname=Иван&lname=Иванов&pname=Иванович
в utf8 все
urlencoded
в запрос вставляется timestamp — времся в секундах… есть вроде в пхп
оно нужно для придания уникальности
все это пдписывается подписью
т.е. — signature- это md5 от конкатенации всех параметров
+ secret
для проверки md5:
name=Ivanov×tamp=63680656065&phone=71111111112
secret=r8Sdk#4kfpfekf913
signature=md5(Ivanov.63680656065.71111111112.r8Sdk#4kfpfekf913)
15a0379c74e94f47fd6ad1de2b9c6f2d
как проверите получение подписи- сообщите
если что непонятно — говорите
host- это имя сайта с которого ты постиш
парамтеры по факту и по пост и по гет можно посылать
время ставь реально сервака
?name=Ivan×tamp=63680656065&phone=71111111112&signature=86adf70905ae2c1c9ee645c1c5a5ff21
еще одна строка для проверки
ответ в формате Json
code=0 — нет ошибок…
в другом случае будет не 0 и в desc — описание
Если сделать отправку данных с такой обработкой средствами PHP отдельным сниппетом, то думаю проблем не будет, тут не сложно.
Но менеджеры кто админят сайт, пользуются для статистики отображением писем в админке сайта в меню FormIt, где их можно отсортировать по видам форм и дат.
И будет перезагружаться страница сайта при отправке писем, что не хотелось бы.
Реально ли сделать дополнительные обработки с полями, перед отправкой письма средствами AjaxForm?
Необходимо чтобы письма с формы отправлялись на почту, сохранялись в админке сайта, синхронизировались по правилам со сторонним сервисом.
Помогите! В какую сторону копать? Либо возьмите в работу, готов обсудить цену.
modx.pro
Перезагружается форма на AjaxForm / modx.pro
Проблема: форма отправки письма (на FormIt, через AjaxForm) отправляет письмо без перезагрузки только пока ты на странице, при этом в лог сыпется:
Если со страницы на которой находиться форма ушел и вернулся через пару дней, то при попытке отправить форму происходит перезагруз страницы, а в логе пусто.
Так происходит не зависимо кастомная форма или стандартная. Поправить это можно лишь очисткой кеша в ручную.
Вот вызов:
[[!AjaxForm? &snippet=`FormIt` &form=`tpl.AjaxForm.contacts` &hooks=`email` &emailSubject=`с сайта YURVICE` &emailTo=`[email protected]` &emailFromName=`[[+name]]` &emailTpl=`tpl.email-contacts2` &validate=`name2:required,email2:required,message2:required` &validationErrorMessage=`В форме содержатся ошибки!` &successMessage=`Сообщение успешно отправлено` ]] И форма:<form action="" method="post"> <div> <label for="af_name">[[%af_label_name]]</label> <div> <input type="text" name="name2" value="[[+fi.name]]" placeholder="[[%af_label_name]]"> </div> </div> <div> <label for="af_email">[[%af_label_email]]</label> <div> <input type="email" name="email2" value="[[+fi.email]]" placeholder="[[%af_label_email]]"> </div> </div> <div> <label for="af_message">[[%af_label_message]]</label> <div> <textarea name="message2" rows="3" placeholder="[[%af_label_message]]">[[+fi.message]]</textarea> </div> </div> <div> <div> <button type="submit" ><i></i> [[%af_submit]]</button> <input type="hidden" name="two"> </div> </div> [[+fi.success:is=`1`:then=` <div>[[+fi.successMessage]]</div> `]] [[+fi.validation_error:is=`1`:then=` <div>[[+fi.validation_error_message]]</div> `]] </form>В чем может быть проблема и как это победить? Спасибо за участие.
modx.pro
Проблемы с AjaxForm. / modx.pro
Буду рад помощи. Организовываю отправку форм на почту на MODX. И решил воспользоваться FormIt в связке с AjaxForm. Проблема в следующем. FormIt отправляет на раз, AjaxForm — не отправляет совсем. Вот вызов ajax [[!AjaxForm? &snippet=`FormIt` &hooks=`email` &emailFrom=`[email protected]` &form=`tpl.AjaxForm` &emailTpl=`email_tpl` &emailTo=`[email protected]` &emailSubject=`Заказ звонка с сайта` &validate=`name:required` &validationErrorMessage=`Пожалуйста, заполните поля помеченные *` &successMessage=`Сообщение успешно отправлено` ]]Сама форма tpl.AjaxForm<form action="[[~[[*id]]]]" method="post"> <input type="text" name="name"/> <button name="submit">ПЕРЕЗВОНИТЕ МНЕ</button> </form>Шаблон письма email_tpl<p>От кого: [[+name]]</p>Все упрощено чтобы понять в чем ошибка. Сначала AjaxForm совсем не работал, по ошибкам в консоли я понял, что версия JQuery не подходит, понизил версию с 3.1 до 1.7 и о чудо, ошибки в консоле пропали и стали появляться всплывающие сообщения. Однако почта не приходит, даже если сообщение утверждает, что все отлично. В спаме нет, хостинг не блокирует, ведь с Formit прилетают, да и просто через PHP тоже отлично приходит. Замечу, что вызов Ajax Form происходит внутри модального окна FancyBox, возможно тут есть какие-то подводные камни… В общем буду рад если покажите, в каком именно месте я туплю. Спасибо.
PS. Решил добавить еще один вопрос, все равно он зреет)
Подскажите пожалуйста, как получить контроль над сообщениями успеха или ошибок от AjaxForm?
Я понимаю, что текст их выводится в плейсхолдеры и ими можно воспользоваться как хочешь, но не получается. К примеру взять текст из них и вывести в модальном окне вместо формы. Из чанка, в котором находится форма я совсем убрал их. [[+fi.success:is=`1`:then=` <div>[[+fi.successMessage]]</div> `]]Оставил только голую форму, однако сообщения упорно всплывают. Но это ладно, это можно победить покопавшись в скрипте компонента. А вот почему не получается просто вывести текст [[+fi.successMessage]] внутри формы… Что у меня работает неправильно, кроме головы ?)