в MODx CMS, Разработка

Форма обратной связи MODx Revo

Создадим простую форму обратной связи с полями: Имя, Емейл, Тема, Текст сообщения. После нажатия кнопки «Отправить» FormIt отправит два письма, одно — вам, а другое — пользователю с текстом подтверждения отправки. Для подтверждения отправки нам нужно будет создать дополнительный сниппет и чанк. Чанк будет шаблоном отправляемого письма, сниппет будет использовать этот шаблон и выполнять функцию отправки.

Вызов и форма отправки на странице

[[!FormIt?
    &hooks=`spam,email,emailUser,redirect`
    &emailTo=`адрес_вашего_мейла`
    &emailSubject=`[[+subject]]`
    &emailFromName=`[[+name]]`
    &emailTpl=`ContactTpl`
    &redirectTo=`6`
]]

<div>[[+fi.error.error_message]]</div>

<form action="[[~[[*id]]]]" method="post">

    <input type="hidden" name="nospam:blank" value="" />

    <div>
        <label for="name">Имя: </label>
        <input type="text" name="name:required" id="name" value="[[+fi.name]]" />
        <span>[[+fi.error.name]]</span>
    </div>

    <div>
        <label for="name">Email: </label>
        <input type="text" name="email:email:required" id="email" value="[[+fi.email]]" />
        <span>[[+fi.error.email]]</span>
    </div>

    <div>
        <label for="subject">Тема: </label>
        <input type="text" name="subject:required:stripTags" id="subject" value="[[+fi.subject]]" />
        <span>[[+fi.error.subject]]</span>
    </div>

    <div>
        <label for="message">Текст сообщения: </label><span>[[+fi.error.message]]</span> <br/>
        <textarea name="message:required:stripTags" id="message" cols="55" rows="7">[[+fi.message]]</textarea>
    </div>

    <div>
        <input type="submit" value="Отправить" name="Submit"/>
    </div>

</form>

Код состоит из двух частей. Вызов сниппета FormIt и html-код самой формы. Единственное на что вы должны обратить внимание — это
дополнительный hook в вызове FormIt сниппета: emailUser.

 

Шаблон письма, отправляемого из формы

Нужно создать чанк с именем ContactTpl и прописать в него следущее:

Это сообщение [[+name]] ([[+email]]) отправлено с помощью формы обратной связи:
<br/>
[[+message]]

Шаблон подтверждения отправки сообщения

Нужно создать чанк с именем ConfirmationTpl и вставить в него код:

<p>
  Здравствуйте, [[+name]],<br/>
  Мы получили Ваше письмо и постараемся ответить на него скорейшим образом.
</p>

<p>
  Текст Вашего сообщения:<br/>
  [[+message:nl2br]]
</p>

Сниппет emailUser

Создадите новый сниппет с именем emailUser. Вставьте в него следущий код:

<?php
//конфигурация
$mailFrom = $modx->getOption('emailsender'); //используйте свой;
$mailFromName = $modx->getOption('site_name'); //используйте свой;
$mailSender = $modx->getOption('site_name'); //используйте свой;
$mailSubject = 'YOUR SUBJECT';
$mailReplyTo = $mailFrom;

//получаем значения полей, которые будут заменены в шаблоне мейла
$confirmationFields['message'] = $scriptProperties['fields']['message'];
$confirmationFields['name'] = $scriptProperties['fields']['name'];

//получаем адрес мейла пользователя
$mailTo= $scriptProperties['fields']['email'];

$message = $modx->getChunk('ConfirmationTpl', $confirmationFields);

$modx->getService('mail', 'mail.modPHPMailer');
$modx->mail->set(modMail::MAIL_BODY,$message);
$modx->mail->set(modMail::MAIL_FROM,$mailFrom);
$modx->mail->set(modMail::MAIL_FROM_NAME,$mailFromName);
$modx->mail->set(modMail::MAIL_SENDER,$mailSender);
$modx->mail->set(modMail::MAIL_SUBJECT,$mailSubject);
$modx->mail->address('to',$mailTo);
$modx->mail->address('reply-to',$mailReplyTo);
$modx->mail->setHTML(true);

if (!$modx->mail->send()) {
    $modx->log(modX::LOG_LEVEL_ERROR,'An error occurred while trying to send the email: '.$err);
return false;
}
$modx->mail->reset();
return true;


Несколько моментов, которые можно сделать в сниппете

  1. Можно изменить тему письма, адрес в разделе конфигурации
  2. Настроить свои поля, которые будут использоваться в шаблоне письма
  3. В вызове сниппета FormIt вам нужно указать свой ID документа (куда нужно перенаправлять пользователя после отправки сообщения) в параметре &redirectTo=`6`

 

Чтобы выбрать язык вывода сообщений ошибок (не правильно заполнено поле  и тд.) необходимо в настройках системы поменять значение cultureKey на соответствующее, например на ru или en.

Если хотите отредактировать само сообщение, то нужно зайти в Управление словарями, выбрать нужный сниппет (в данном случае это FormIt), соответствующую языковую версию и найти в списке интересующее сообщение об ошибке.

Несколько форм на одной странице

rtfm.modx.com/display/ADDON/FormIt
1. Пункт №13 в таблице Available Properties. Параметр «placeholderPrefix», сделайте его разным для каждой из форм.
2. Пункт №3 там же. Параметр «submitVar», также должны быть разные.

submitVar обязательно нужно указывать свой для каждой формы, и он в точности должен совпадать с свойством name тега input типа submit форм.

Если хотим установить капчу, то в вызове сниппета FormIt, в hooks, нужно добавить recaptcha (если там несколько параметров, то через зяпятую) и перед div с submit-ом написать вызов самой капчи. В нашем случае будет вот так:

<div>
 <label for="message">Введите код: </label><span>[[!+fi.error.recaptcha]]</span><br/>
 [[!+formit.recaptcha_html]]
</div>

Написать комментарий

Комментарии

108 Комментария

  1. Спасибо огромное, Ваша статья очень сильно мне помогла!!! Доступная и работоспособная!

  2. 1. Насколько проблематично расширить количество полей?
    2. Сложно сделать совместную работу с сниппетом Login? Чтобы авторизованным пользователям не нужно было вводить e-mail и подтверждать его?

    • 1. Не проблематично.
      Просто добавляете новый инпут с соответствующим идентивикатором.
      Например, вы хотите добавить поле Название компании, тогда нужно написать:


      < input type="text" name="company" value="[[+fi.company]]" />
      где указать name="company"
      плейсхолдер [[+fi.company]]

      Тогда в шаблоне письма, которое будет вам приходить, нужно не забыть указать:

      Компания: [[+company]]
      где [[+company]] - это наш новых плейсхолдер.

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

      2. Не так быстро, но не сложно. Вам нужно написать сниппет, который будет проверять статус авторизации пользователя.
      Если да, то берем из базы указанный при регистрации мейл и вставляем его в инпут, иначе — инпут остается пустым.

    • Адрес мейла указывается в вызове самого сниппета:

      [[!FormIt?
      &hooks=`spam,email,emailUser,redirect`
      &emailTo=`адрес_вашего_мейла`
      &emailSubject=`[[+subject]]`
      &emailFromName=`[[+name]]`
      &emailTpl=`ContactTpl`
      &redirectTo=`6`
      ]]

  3. Как я понял, эта уже рабочая форма?? Здесь только нужно вставить свое мыло и все??

    • Да, указать свой мейл и не забыть создать соответствующие чанки для шаблонов.
      Форма рабочая.

  4. Большое спасибо, уважаемый.
    Первый пример Formit по-русски, который сразу заработал.
    Грамотно и доступно.

    • Капча не нужна, в форме установлен скрытый инпут, который защищает ее от заполнения роботами. «Пробить» его они не могут. Пользуйтесь смело, проверено.

      • Тоже всегда пользовался скрытым полем, но в последнее время начал через него пробиваться спам. Менял name скрытого поля на другие — результата ноль…

  5. Vega :
    Капча не нужна, в форме установлен скрытый инпут, который защищает ее от заполнения роботами. “Пробить” его они не могут. Пользуйтесь смело, проверено.

    А как он работает, не могли бы пояснить? Тоже хотелось бы убедиться, что «стена» железная 🙂

  6. Не хотите сделать рассказ про установку поиска на MODX? Вы очень интересно, а главное, практично (работает то, что Вы пишете) рассказываете!

  7. Создал вписал свой мейл не работает, не переходит даже на страницу которую я указал в &redirectTo=`51`

    В чем может быть проблема ???

    • Сам сниппет FormIt установили, ни где нет ошибки в прописании чанков и тд? Не могу точно сказать, нужно смотреть на месте.

  8. Здравствуйте.
    Установила такую форму на сайт, но письма не отправляются и не могу понять почему. Может ли быть причиной — localhost? Сервер через xampp создала(может в нем проблема). Раньше ошибку выдавало, связанную с localhost: 25 (или 587). Сейчас такой ошибки нет(включила smtp), но все равно не доходят письма. Использую MODX Revolution 2.2.2-pl (traditional).

    • Здравствуйте.
      Обычно локально не работает, попробуйте выгрузить на глобальный сервер.

      • А можете ли вы подсказать по системе комментирования Quip? У меня отображается дата некорректно ��� 12, 2012 at 12:59. Все файлы перековыряла(php,js,чанки,сниппеты), нашла вывод %b %d, %Y at… Везде, где только можно изменила %b(не знаю что это) на %m — в итоге бесполезно: так и не нашла то место, откуда выводится эта дата на экран.

    • Здравствуйте! Если вы хотите отправить письмо от localhost, то оно попадает в tmp/!sendmail. У меня происходит так на denwere. Возможно и у вас также. Поищите такую папку.

  9. Спасибо большое…. очень всё грамотно и чётко написано, а главное всё легко понять и сделать даже не имея особых знаний HTML Спасибо.=)

  10. Где указывать имя отправителя? т.е. когда пользователь получает письмо у него написан адрес отправителя, т.е. мой сайт. Если я правильно понимаю — это $mailFromName? Я указал свой адрес. Но при получении письма адреса нет. No adress, либо неизвестно. Спасибо

      • emailsender — это системная настройка email. Не надо ничего менять, как не надо менять и в переменную site_name
        $mailFromName = $modx->getOption(‘site_name’); //используйте свой site_name;
        $mailSender = $modx->getOption(‘site_name’); //используйте свой site_name;

        Все это заполняется в настройках сайта… И снипет отлично работает

  11. Здравствуйте, поставил как описано, не происходит редирект на указанный ID документа, в адресной строке браузера так и остается http://ptznew.ru/contact.html Письма уходят только куда указано в вызове сниппета, т.е. на &emailTo=`адрес_вашего_мейла`, на адрес, который вводит пользователь в форме обратной связи письмо не приходит. В журнале ошибок Modx после отправки появляется такая запись (ERROR @ /index.php) An error occurred while trying to send the email: Подскажите пожалуйста где искать проблему.

  12. при отправке получаю вот такой текст с ошибкой, повторяющийся несколько раз

    Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : XML declaration allowed only at the start of the document in X:\home\aq.aq\www\core\model\modx\rest\modrestclient.class.php on line 229

  13. Подскажите пожалуйста!!! Делаю форму, посетитель должен из списка выбрать город в котором живет. И видимо что то делаю не правильно т.к.
    в самой форме почему то два поля. Первое мое со списком городов, а второе пустое. И если в это поле самому вписать город тогда в письме это город прописывается, а если город выбрать из списка то письмо приходит без указания города.

    Спасибо. Если, что могу выложить код.

  14. Дмитрий, спасибо за внятную инструкцию! А то тут есть такие спецы, которые так понапишут, что только создают дополнительные проблемы для новичков своей писаниной. Например вот тут: http://modx.ws/blog/uroki-modx-revolution/urok-9-sozdanie-kontakt-formyi-s-ispolzovaniem-formit.html

    А не подскажете как сделать, чтобы после отправки формы всё содержимое странички (контент и сама форма) исчезало и показывалось сообщение — ПИСЬМО ОТПРАВЛЕНО! — по этому-же URL адресу, где и сама форма ( domain.com/contact.html ). А то сейчас у меня просто переадресация по ID на другую страничку — так нехорошо, потому-что в URL отображается её адрес http://domain.com/spasibo-za-vashe-soobshhenie.html

    • Это стандартная функциональонсть сниппета. Чтобы сделать так, как хотите — нужно дорабатывать скрипт.

  15. Звучит немного странно — функциональность стандартная, но её нужно дорабатывать 🙂 Какая-же она тогда стандартная! 🙂

  16. Добрый вечер. Использую formsave + formit, сохраняю данные формы в базу. Но вот вытащить их не получается. Может подскажите как это сделать?

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

  18. Не корректно работал сниппет emailUser. Письмо подтверждающее отправку сообщения приходило к отправителю без моего адреса и без моего имени. Исправил, заработало:
    <?php
    //конфигурация
    $mailFrom = 'elektrik@yandex.ru'; //используйте свой;
    $mailFromName = 'Частный электрик Юрий'; //используйте свой;
    $mailSender = 'elektrik@yandex.ru'; //используйте свой;
    $mailSubject = 'Услуги частного электрика в Петербурге.';
    $mailReplyTo = $mailFrom;\\

    Спасибо за урок.

  19. Скажите, пожалуйста, как сделать так, чтобы при отправке формы письмо, которое уходит пользователю с подтверждением дублировалось скрытой копией на другой адрес email?

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

      • Да, если указать через запятую, то он будет виден в поле «Кому», а это нежелательно. Нужна именно скрытая копия. Что нужно дописать в скрипте?

  20. Здравствуйте! Спасибо за полезную статью! Подскажите, а есть ли в ModX revo способы проверить существование емейла в базе и не отправлять данные формы дальше, если он совпадает? Спасибо!

  21. Здравствуйте!
    Очень интересная статья. Спасибо!
    Можете подказать или объяснить как подключить к форме проверку, например «сколько будет 22+36 = » было бы очень полезно!!!
    Спасибо огромное заранее!

  22. Здравствуйте! Все сделал как описано. ПЗаполняю поля, жму «Отправить», после открывается страница редиректа с сообщением что сообщение отправлено, но в почту ничего не приходит (…. Что мог сделать не так не пойму (, помогите, плиз…

  23. Добрый день- такой вопрос- человек заполнил форму, отправил, письмо улетело мне на почту, но я хочу, что-бы на следующей странице человек увидел введенные им данные, т.е. после отправки идет редерикт на другую страницу, вот как сделать там, что-бы он увидел все что вводил?
    Нашел, что нужно пользоваться- $_SESSION[‘mystuff’] = array(‘itemOne’ => ‘value1’, ‘itemTwo’ => ‘value2’, …);
    но в сессиях не селен, подскажите, как передать параметры на следующую страницу?

  24. Привет, сделала свою форму soplik.ru , не знаю, по какой причине, но нормальная отправка сообщения происходит только в Хроме. В мазиле, чтоб отправить, надо 3 раза нажать на кнопку, из оперы вообще не отправляется. Что делать, с чем это связано?

  25. Здравствуйте!

    Большое спасибо за форму — действительно работоспособная.
    Маленький нюанс — часто письма от клиентов попадают в спам. Для Gmail эту проблему можно решить введя [nospam] в тему письма.
    Подскажите, как можно модифицировать вашу форму для подстановки [nospam] в тело письма.

    Заранее спасибо!

  26. Спасибо за статью! Объясните, пожалуйста, как сделать чтобы на странице могли работать две и более форм? Спасибо.

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

  28. Форма работает, но не отправляет почту адресанту указанному в поле «Email» на форме. Понять не могу в чем проблема. Почта сайта указана специально внешняя mail.ru доходит все чисто. В чем может быть проблема? (Отправка идет через почтовик sendmail на VDS)

  29. Здравтсвуйте!
    А как сделать так, чтобы пользователь мог выбирать тему письма из выпадающего списка?

  30. Здравствуйте!
    А как сделать, чтобы на сайте было 2 таких формы, но на разных страницах?
    1. Ведь придется поменять все чанки, а также сам сниппет (имена и данные в них), но где они прописаны — непонятно, кроме первого чанка (его вызов указан в вызове FormIt-а).
    2. Если добавить/изменить поля, то придется в сниппете прописывать их вызов?

    Плих хелп! (можно за доплату)

  31. Здравствуйте, большое спасибо за Вашу статью, очень помогла. Только в моеми случае почему-то после отправки формы, не приходит письмо к отправителю формы о ее благополучной отправке. Как вы думаете почему так происходит?

  32. Подскажите, как отправить через formit отправить письмо на 2 ящика. Почитал про fiar, но второе письмо так и не приходит.
    Вот вызов:
    [[!FormIt?
    &hooks=`spam,shk_fihook,email,fiar,redirect`
    &emailTpl=`tpl_myOrder`
    &emailTo=`xxx@gmail.com`
    &redirectTo=`78`
    &fiarTpl=`tpl_myOrder2`
    &fiarReplyTo=`xxx2@gmail.com`
    &fiarFrom=`[[++emailsender]]`
    &fiarSubject=`Тут тема`
    &fiarToField=`xxx2@gmail.com`
    &submitVar=`get_order`
    &validate=`fullname:required,phone:required,email:email:required`

    ]]

  33. Добрый день. Спасибо за статью. У меня вот такой вопрос, форма добавилась на страницу, а вот чанки и сниппеты не создаются, пишут, что имя чанка недопусимо! Что не так?

  34. пытаюсь воспользоваться вашей формой, у меня ни редикта ни оправки письма, ничего не работает. если вам не сложно можете проверить? доступ к админ панели я вышлю вам на почту

  35. Привет, а как сделать так, чтобы письмо для самого отправителя было отправлено не неизвестным отправителем, а было написано что от компании такой-то(в поле письма от кого — неизвестный отправитель) ??

    также интересно, что означает [[+message:nl2br]] «-nl2br» ?

    • >Привет, а как сделать так, чтобы письмо для самого отправителя было отправлено не неизвестным отправителем, а было написано что от компании такой-то(в поле письма от кого – неизвестный отправитель) ??

      Все написано в конфиге:
      //configuration
      $mailFrom = $modx->getOption(’emailsender’); //OR USE YOUR OWN ;
      $mailFromName = $modx->getOption(‘site_name’); //OR USE YOUR OWN ;
      $mailSender = $modx->getOption(‘site_name’); //OR USE YOUR OWN;
      $mailSubject = ‘Заказ услуги’;

      emailsender — берется значение из поля «Логин», аккаунта менеджера, то есть администратора сайта. Поля «От» и «Отправитель» — это имя сайта, то есть site_name.

      >также интересно, что означает [[+message:nl2br]] “-nl2br” ?

      http://php.net/manual/ru/function.nl2br.php

  36. Спасибо за форму! Подскажите пожалуйста, на сервере должны быть произведены какие-нибудь настройки? Почты или что-нибудь подобное

  37. Добрый день!

    А если нужно отправить на несколько адресов, но только их нужно задать в снипете emailUser.

    пример:
    $email1 = ’email1′;
    $email2 = ’email2, email3′;

    //получаем адрес мейла
    // adress = 1,2,3… выбирается в форме
    $mailTo= $email[$scriptProperties[‘fields’][‘adress’]];

    выбираем 1 — почта отправляется отлично.
    выбираем 2 — не отправляется ни на одну почту((

    Спасибо за внимание!

  38. Добрый день, спасибо за статью, очень помогла!

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

  39. Использую клонирование элементов формы, атрибут name представлен в виде массива () . contactTpl видит значения полей нормально. confirmationTpl видит их как [[+message]].
    Догадываюсь, что необходимо провести правки инициализации переменных в emailUser:

    $confirmationFields[‘message’] = $scriptProperties[‘fields’][‘message’];

    Подскажите, как правильно прописать, что переменная представлена в виде массива?

        • Есть вот такой сниппет https://docs.modx.com/extras/revo/getresourcefield В инпуте, в форме, в value=»» добавьте вызов сниппета, например так , тогда в инпут подставится тайтл текущей страницы, на которой отображается форма. Или же укажите вместо [[*id]] ее значение, например 1, тогда pagetitle со страницы id, которой равен 1 подставится в инпут

          • Да, это понятно. Но я на этой странице вывожу например 10 товаров, у каждого есть кнопка «Заказать» и все эти кнопки ведут на 1 форму с которой должен отправиться емейл менеджеру с пометкой с какого именно товара была нажата кнопка.

          • Каждой кнопке «Заказать» присвойте id равный id-документу товара. Джаваскриптом по клику на копку, считывайте этот id и вставляйте в сниппет формы отправки заявки- Форму открывайте в попапе

      • Например, когда на странице не одна кнопка вызова а несколько, а в письме надо указать с какого именно товара был заказан обратный звонок.