Переменная в теме письма, отправляемого с помощью eForm

  Дата публикации: 22.10.2012

  Просмотров: 2528

  Оценок: 1

Сниппет eForm является самым популярным решением для работы с формами в MODx Evolution (формы обратной связи, анкеты и прочее). Однако на практике мне пришлось столкнуться с тем, что заявленный в документации функционал сниппета отказывается работать должным образом.

История такая: мне требовалось использовать переменную в теме письма, отправляемого с помощью eForm. Форма отправляет резюме на размещенную на сайте вакансию (коих несколько, а форма одна). Тема письма должна выглядеть так: Резюме на вакансию «название вакансии», где название вакансии берется из заголовка предыдущей страницы (описания вакансии), с которой перешли на страницу «Отправить резюме».

Тема письма задается параметром subject в вызове сниппета eForm. И самым логичным решением было бы передавать переменную через плейсхолдер:

[!eForm? … &subject=`Резюме на вакансию [+ переменная +]`!]

И вот тут начинается самое интересное: в используемой мной версии eForm 1.4.4.6 (1.4.4.7 аналогично) сниппет отказывается воспринимать вызов плейсхолдера, хотя документация утверждает, что так он и вызывается. На деле же вызов плейсхолдера просто вырезается.

Идем курить код сниппета. В коде находим следующую строчку:

foreach( $params as $key=>$val ) $params[ $key ] = 
 str_replace( array('((','))'), array('[+','+]'), $val );

Из этого следует, что вызов плейсхолдера должен осуществляться так: (( плейсхолдер )), а сниппет уже потом сам исправит двойные скобки на [+ … +], подтверждение этой догадке я позднее нашел на форуме. Но и двойные скобки не решили проблемы. Экспериментируя с различными вариантами вызова плейсхолдера я пришел к выводу, что eForm некорректно парсит передаваемые параметры. Следовательно, нужно решение в обход. Как вариант, можно было править код сниппета eForm, но это не лучший вариант – при обновлении MODx или установке новой версии сниппета такой «костыль» может запросто потеряться (если о нем вовремя не вспомнить).

Поэтому мой «костыль» реализован иначе: он не затрагивает код сниппета eForm, а использует самописный сниппет и шаблон вывода формы. В чем фишка:

В вызове сниппета eForm параметр subject оставляем пустым:

[!eForm? … &subject=``!]

а нашу переменную мы будем выводить в специальном поле input формы. Для этого в шаблоне формы отправки между тегами <form> и </form> вставляем следующее:

  1. <div class='hidden'>
  2. <input type="text" name="subject" value='' />
  3. </div>

где [+VacancySubject+] – плейсхолдер с нашей переменной. Это значение eForm подставляет в тему письма.

Важно: я сделал это поле невидимым с помощью css. Для этого в таблице стилей я прописал класс hidden:

.hidden {visibility: hidden;}

Это был единственный способ скрыть поле, поскольку если писать

<input type=" hidden" name="subject" value='[+VacancySubject+]' />

– eForm отказывается писать плейсхолдер в параметр subject.

 

Теперь о главном – как записать в плейсхолдер нужное значение. Для этого я написал специальный сниппет TitleByURL:

  1. <?php
  2. if (isset($_GET['id']))
  3. {
  4. $id=$_GET['id'];
  5. }
  6. global $modx;
  7. $table = $modx->getFullTableName("site_content");
  8. $res = $modx->db->getValue
  9. ( $modx->db->select("pagetitle", $table, "id='". $id."'") );
  10. $sub = "Резюме на вакансию ".$res;
  11. $modx->setPlaceholder('VacancySubject',$sub);
  12. return $res;
  13. ?>

Как это работает:

    1. На странице подробного описания вакансии идет ссылка следующего вида:
<a title='Отправить резюме' href='[~6~]&id=[*id*]'>отправить нам резюме</a>

где 6 – это страница с формой отправки резюме. В ссылке передается id текущей страницы (с описанием вакансии) методом GET.

  1. Мой сниппет TitleByURL вызывается на странице отправки резюме (с формой eForm) и высасывает из GET id предыдущей страницы.
  2. Выбирает из базы заголовок страницы по id (заголовок и есть название вакансии).
  3. Записывает в строковую переменную $sub текст «Резюме на вакансию (название вакансии)».
  4. Записывает в плейсхолдер с именем VacancySubject значение переменной $sub.
  5. Выводит название вакансии (в заголовок страницы).

Как это используется:

Шаблон страницы с формой отправки выглядит следующим образом:

  1. <h1>Отправить резюме на вакансию [!TitleByURL!]</h1>
  2. [*content*]
  3. [!eForm? … &subject=``!]

Соответственно заголовок страницы будет иметь вид Отправить резюме на вакансию (название вакансии), а в теме письма с резюме будет Резюме на вакансию (название вакансии).

Форма отправки резюме

Переменная в теме письма eForm

  Оценили 1 человек   Понравилось

популярные заметки:

Счетчик просмотров страницы с сортировкой по популярности для MODx Evo

  29.09.2012

  3587

  10

Когда я уже заканчивал работу над своим сайтом, мне захотелось сделать для блога вывод популярных заметок.

подробнее »

Бесплатный PHP+MySQL хостинг для Вашего сайта

  09.05.2012

  2715

  0

Мы всегда стремились сократить расходы на создание и сопровождение сайтов, сделать сайт более доступным. И хостинг всегда являлся серьезной статьей расходов...

подробнее »