We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 9302
    • 4 Posts
    Добрый день.
    Сразу хочу сказать что в программировании я мало что понимаю, но потребовалось сделать вот что.
    Встала жёстакая потребность для создания формы обратной связи которая в зависимости выбранного значения (города) отсылает письмо на закреплённый за эти значением (городом) список e-mail адресов.

    как это сделать стандартными ср-ми не разобрался и написал свой снипет.

    <?php

    // Выставляем локали
    setlocale(LC_ALL, ’ru_RU.CP1251’, ’rus_RUS.CP1251’, ’Russian_Russia.1251’);

    // Убираем ненужные символы из GPC
    if ( get_magic_quotes_gpc() )
    {
    if ( $_GET ) array_stripslashes($_GET );
    if ( $_POST ) array_stripslashes($_POST );
    if ( $_COOKIE ) array_stripslashes($_COOKIE);
    }

    // Объявляем некоторые переменные
    $showForm = true; // Показывать форму
    $errors = array(); // Список ошибок

    // Переменные для описания полей письма

    $mailFrom = isset($_POST[’from’ ]) ? $_POST[’from’ ] : null; // e-mail Отправителя
    $mailRecipient = isset($_POST[’recipient’]) ? $_POST[’recipient’] : null; // e-mail Получателя
    $mailImy = isset($_POST[’imy’ ]) ? $_POST[’imy’ ] : null; // Имя отправителя
    $mailText = isset($_POST[’text’ ]) ? $_POST[’text’ ] : null; // Текст письма


    // Проверяем пост-данные
    if ( $_POST )
    {
    // Форма была отправлена, выполняем обработку

    // Проверяем адрес получателя по шаблону регулярных выражений


    // Адрес получателя указан правильно, пробуем отправить письмо

    // Подготавливаем заголовки письма
    $mailHeaders = array();
    $mailHeaders[] = ’Content-Type: text/plain; charset=windows-1251’;
    $mailHeaders[] = ’Content-Transfer-Encoding: 8bit’;
    $mailHeaders[] = ’From: ’. $mailFrom;

    // Пробуем отправить письмо
    if ( mail($mailRecipient, $mailSubject, $mailText, join("\n", $mailHeaders)) )
    {
    // Письмо успешно отправлено
    ?>
    <p>Ваш вопрос успешно отправлен!</p>
    <p><a href="/">На главную</a></p>
    <?php
    // Запрещаем вывод формы
    $showForm = false;
    }
    else
    {
    // Отправка письма провалилась
    $errors[’mailsend’] = ’Не удалось задать вопрос.’;
    }
    }

    // Показ формы для отправки сообщения
    if ( $showForm )
    {
    ?>
    <!-- Форма отправки письма -->

    <p>Для отправки вопроса заполните данную форму и нажмите кнопку "Отправить".</p>

    <form method="POST">
    <table>
    <?php
    if ( $errors )
    {
    // Вывод сообщений об ошибках
    ?>
    <tr>
    <td colspan="2">
    <div class="errors"><?php echo join(’
    ’. PHP_EOL, $errors)?></div>
    </td>
    </tr>
    <?php
    }
    ?>

    <tr>
    <td>Имя</td>
    <td><input type="text" name="imy" size="40" value="Ваше имя" /></td>
    </tr>
    <tr>
    <td>e-mail</td>
    <td><input type="text" name="from" size="40" value="Ваш e-mail" /></td>
    </tr>
    <tr>
    <td>Город</td>
    <td><select name="recipient" id="type-select">
    <option value="[email protected]">Москва</option>
    <option value="[email protected],[email protected]">Питер</option>
    </select>
    </tr>
    <tr>
    <td>Текст письма</td>
    <td><textarea name="text" cols="42" rows="10">Текст вопроса</textarea></td>
    </tr>
    <tr>
    <td colspan="2" align="right"><input type="submit" value="Отправить" /></td>
    </tr>
    </table>
    </form>

    <?php
    }

    // Вывод нижней части страницы

    /**
    * Экранирование опасных символов html
    *
    * @param string $html
    * @return string
    */
    function hEscape($html)
    {
    return strtr
    (
    $html,
    array
    (
    ’&’ => ’&amp;’ ,
    ’"’ => ’&quot;’,
    ’\’’ => ’’’,
    ’<’ => ’&lt;’ ,
    ’>’ => ’&gt;’
    )
    );
    }

    /**
    * @desc Убирает слэши из строки или массива
    * @param array|string $data Входящие данные, где нужно убрать кавычкм
    * @return void
    */
    function array_stripslashes (& $data )
    {
    if ( is_array($data) )
    array_walk($data, __FUNCTION__);
    else
    $data = strtr($data, array(’\\\\’ => ’\\’, ’\\\’’ => ’\’’, ’\\"’ => ’"’));
    }
    ?>

    Но в данной форме нет защиты от спама, а соответственно вопрос. Как прикрутить сюда стандартную капчу или подскажите как сделать стандартными средствами то что мне нужно.
    Спасибо за внимание.
    ps: при вставке кода в тэг [ code ] возникает проблема с кодировкой.
      • 785
      • 2,113 Posts
      В eForm используйте параметр &to со списком адресов и &mailselector. Я примерно для такой же задачи дополнительно использовал сниппет преобразования выбранных значений в числа, то есть перед eForm вызывал сниппет EmailOffices:
      <?php
      function EmailOffices ( &$fields ){
      $allOffices = array ("Первый" => 1, "Второй" => 2);
      $fields[’officeID’] = $allOffices[$fields[’orderOffice’]];
      return true;
      }
      ?>
      А в вызове указывал параметры &eFormOnBeforeMailSent=`EmailOffices` и &mailselector=`officeID`, хотя реально офис в форме задавался в поле orderOffice (это поле также использовалось в тексте письма).

      А использовать капчу в своем сниппете тоже просто, но в данном случае нецелесообразно.
        Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
        Статьи о MODx, регулярно новые публикации
        • 1611
        • 591 Posts
        А можно для потомков все-таки пример как подключить капчу MODx к своему сниппету?
          • 9302
          • 4 Posts
          Quote from: AKots at Apr 02, 2010, 05:24 AM

          В eForm используйте параметр &to со списком адресов и &mailselector. Я примерно для такой же задачи дополнительно использовал сниппет преобразования выбранных значений в числа, то есть перед eForm вызывал сниппет EmailOffices:
          <?php
          function EmailOffices ( &$fields ){
          $allOffices = array ("Первый" => 1, "Второй" => 2);
          $fields[’officeID’] = $allOffices[$fields[’orderOffice’]];
          return true;
          }
          ?>
          А в вызове указывал параметры &eFormOnBeforeMailSent=`EmailOffices` и &mailselector=`officeID`, хотя реально офис в форме задавался в поле orderOffice (это поле также использовалось в тексте письма).

          А использовать капчу в своем сниппете тоже просто, но в данном случае нецелесообразно.

          Если честно, то я мало что понял из этого.

          можете показать на примере?
          есть стандартный чанк вызова eForm
          [!eForm? &formid=`form1` &to=`[email protected]` &tpl=`form_tpl` &report=`formreport` &vericode=`1` &subject=`Сообщение с сайта` !]


          и чанк с оформление формы
          <div id="forma">
          <p><span style="color:#900;"> [+validationmessage+] </span></p>
          <br/>
          <form method="post" action="[~[*id*]~]" name="myform">
          <input type="hidden" name="formid" value="form1" />
          <table width="80%" align="center" cellpadding="0" cellspacing="0" >
          <tr >
          <td width="160" ><strong>Ваше Имя:</strong></td>
          <td width="67%" ><input type="text" name="Name" size="40" maxlength="60" eform="Ваше Имя::1" /></td>
          </tr>
          <tr >
          <td width="160" ><strong>Ваш город:</strong></td>
          <td><input type="text" name="gorod" size="40" maxlength="40" eform="Ваш Телефон::1" /></td>
          </tr>
          <tr >
          <td width="160" ><strong>Ваш email адрес:</strong></td>
          <td><input type="text" name="email" size="40" maxlength="40" eform="Ваш email:email:1" /></td>
          </tr>
          <tr >
          <td width="160" ><strong>Текст письма:</strong></td>
          <td><textarea cols="30" rows="6" name="comments" eform="Текст письма:html:1"></textarea></td>
          </tr>
          <tr >
          <td > </td>
          <td></td>
          </tr>
          <tr >
          <td width="160" valign="bottom"><strong>Пожалуйста введите код:</strong></td>
          <td><img src="[+verimageurl+]" alt="verification code" /><br /><input type="text" name="vericode" size="20" /></td>
          </tr>
          <tr>
          <td width="160"> </td>
          <td><br /><input type="submit" name="submit" value="Отправить" ></td>
          </tr>
          </table>
          </form>
          </div>


          Сейчас город просто вписывается в форму и отправляется в письме.

          я заменяю поле ввода города на
          <select name="recipient" id="type-select">
             <option value="[email protected]">Москва</option>
             <option value="[email protected],[email protected]">Питер</option>
             </select>

          Но оно так же отправляется на email как текст.

          ps. за подсказку готов заплатить 50wmr.
            • 785
            • 2,113 Posts
            Посмотрите, все же, документацию на eForm в части приведенных мной параметров. В &to можно через запятую задать несколько адресов, например, &to=`[email protected],[email protected]`, а в &mailselector – название поля, которое определяет, какой из адресов использовать. То есть используется &mailselector=`recipient`, надо в шаблоне написать примерно это:
            <select name="recipient">
            <option value="1">Москва</option>
            <option value="2">Питер</option>
            </select>
            Тогда при выбранном варианте «Москва» письмо будет отправлено по адресу [email protected], а «Питер» – по адресу [email protected].
            В предыдущем моем примере дополнительный сниппет позволял в письме использовать выбранные слова, например, если я хочу написать, что письмо в Москву, а не в город 1, но и без сниппета письма в разные места отправляются нормально.
            ---
            А чтобы добавить в свой сниппет капчу, надо сначала вывести примерно такой код:
            <img src="’.$modx->config[’base_url’].’manager/includes/veriword.php?rand=’.rand().’" alt="код защиты" border="1"/>
            <input type="text" id="vericode" name="vericode" size="20" />

            А потом при обработке ответа написать примерно такую проверку:
            if ($_POST[’vericode’]!=$_SESSION[’veriword’]) echo ’Код неверен’;
              Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
              Статьи о MODx, регулярно новые публикации
              • 9302
              • 4 Posts
              Дело в том что к каждому городу есть список адресов. т.е. для некоторых городов 5-6 адресов. а для некоторых 1-2
                • 785
                • 2,113 Posts
                Почитайте документацию на eForm - там можно привязывать свои сниппеты к событиям и реализовывать практически все, что угодно. Кроме того дополнительную пересылку писем можно реализовать уже на почте.
                  Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                  Статьи о MODx, регулярно новые публикации