Динамическое изменение заголовков в поле emailSubject при отправке сообщений из FormIt
Задача была следующая — сделать так, чтобы поле emailSubject содержало некий уникальный номер и наименование товара, типа такого «Заявка №XXXX на товар [[*title]]». Проблема состоит в том, что компонент FormIt в MODX Revolution не обрабатывает эти поля так же как чанки, а просто помещает заданное значение в тему сообщения.
Разобьём поставленную задачу на части. Для начала хочу рассказать как делать динамические заголовки для сообщений, подставляя значение в поле `emailSubject`. Тут не надо изобретать велосипедов, всё уже предусмотрено в хуке email (FormIt.Hooks.email):
https://docs.modx.com/extras/revo/formit/formit.hooks/formit.hooks.email
Из документации следует, что достаточно в FormIt добавить параметр &emailUseFieldForSubject=`1`, а &emailSubject=`` оставить пустым.
[[!AjaxForm? &snippet=`FormIt` &form=`zayavkaForm` &hooks=`email` &emailUseFieldForSubject=`1` &emailSubject=`` &emailTo=`primer@domain.ru` &emailTpl=`zayavkaMessage` ]]
Значение для заголовка сообщения берется из поля формы (можно скрытого) с именем «subject»:
<input type="hidden" name="subject" value="Заявка №[[!mailID]] на товар [[*title]]" />
Как добавить в заголовок сообщения уникальный номер и сохранять сообщения в базе MODX Revolution
У FormIt имеется ещё один интересный хук FormItSaveForm (FormIt.Hooks.FormItSaveForm) для хранения заполненных форм в базе MODX (modx_formit_forms):
https://docs.modx.com/extras/revo/formit/formit.hooks/formit.hooks.formitsaveform
Предыдущий чанк вызова формы принимает следующий вид:
[[!AjaxForm? &snippet=`FormIt` &form=`zayavkaForm` &hooks=`mailID,email,FormItSaveForm` &formName=`Заявка с сайта` &formFields=`tovar,name,phone,message` &fieldNames=`tovar==Товар,name==Имя,phone==Телефон,message==Комментарий` &emailUseFieldForSubject=`1` &emailSubject=`` &emailTo=`primer@domain.ru` &emailTpl=`zayavkaMessage` ]]
В хуках добавились mailID (о нём поговорим чуть позже) и FormItSaveForm. Кроме того появились дополнительные параметры &formName, &formFields, &fieldNames. Они нужны чтобы озаглавить поля при сохранении формы в базе modx_formit_forms. Подробнее можно почитать в документации к FormItSaveForm.
Остался неизвестный хук `mailID`. На самом деле это мой снимет, который формирует уникальный номер для заполненной формы. Сниппет вызывается в некешированном виде и генерирует номера на основе ID записей в таблице modx_formit_forms, подставляя требуемое количество нулей перед цифрой при формировании номера сообщения. Вот его код:
<?php function numberFormat($digit, $width) { while(strlen($digit) < $width) $digit = '0' . $digit; return $digit; } $sql = "SELECT MAX(id) FROM modx_formit_forms;"; $statement = $modx->query($sql); $mailID = $statement->fetchColumn(); return numberFormat($mailID+1, 4);
Если считаете статью полезной,
не ленитесь ставить лайки и делиться с друзьями.