We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 2873
    • 106 Posts
    Коллеги, я прицепил форму обратной связи, все работает, все замечательно.
    Осталась одна маленькая деталь: как туда прицепить capcha-код, чтобы роботы харрасментом не занимались?
    А то сайт известный, боты во все щели прут, и на почту приходят вместо новостей от пользователей - тонны рекламы.
    Причем, в модХ есть уже встроенный капча-код, при логине в админку.
    Кто-нибудь знает, как его же прицепить к формочке?
      • 897
      • 1,620 Posts
      задача smiley
        "Und wenn du lange in einen Abgrund blickst, blickt der Abgrund auch in dich hinein."

        Не используйте Revo для "просто сайтов". Используйте Evo

        Who can defeat the Russian bear?
      • Да вобщем все уже решено smiley Привожу простой код, который будет выводить просто цифровой код в виде рисунка.
        Сейчас готовлю другой сайт, там немного по другому сделано, но принцип такой же.

        <?php
        //название сессии вашего сайта, искать в config.inc.php установленного сайта, генерируется автоматически при установке
        session_name(’SN445farabbebc5’);

        //запуск сессии
        session_start();

        if (isset($_SESSION[’nospam’])) {
        unset($_SESSION[’nospam’]);
        }

        // Сгенерируем номер
        $num = rand(’111111’,’999999’);

        // Запишем номер в сессию
        $_SESSION[’nospam’] = $num;

        // Создадим рисунок размером 76x26
        $img = imagecreate(’76’, ’26’);

        // Зададим цвет бордюра
        $color1 = imagecolorallocate($img, 0, 0, 0);

        Зададим цвет символов
        $color2 = imagecolorallocate($img, 0, 102, 203);

        // Рисуем бордюр
        imageline($img, 0, 0, 75, 0, $color1);
        imageline($img, 0, 0, 0, 25 , $color1);
        imageline($img, 0, 25, 75, 25 , $color1);
        imageline($img, 75, 0, 75, 25 , $color1);

        // Рисуем цифры
        imagestring($img,5,12,5,$num,$color2);

        // Выводим рисунок
        header("Content-type: image/png");
        imagepng($img);
        ?>
        Вставляется в свою форму как
        <IMG src='nospam.php' width='76' height='26' border='0'>

        Единственно перед отсылкой данных из формы обратной связи надо эти данные обработать - точнее сверить введенный код в форме и хранимые данные в сессии, получаемые как $_SESSION[’nospam’]; если совпадают - мейл отправить, если не совпадают - показать снова форму, данные в сессии тогда сменятся.

        вот результат работы подобного скрипта: http://www.bdcolors.com/files/image_code/genimage.php
        а это уже апгрейд smiley http://www.bdcolors.com/spamcode/index.php
          Разработка сайтов и программных модулей на MODX.
          Опыт работы на MODx с 2005 года. Высокое качество.
          Компания Baltic Design Colors: http://www.bdcolors.ru.
          • 2873
          • 106 Posts
          ìîæíî ïîâòîðèòü äëÿ ÷èòàþùèõ õòìë ñî ñëîâàðåì: êàê èìåííî ïðîâåðèòü öèôðû?
          ôîðìî÷êó ÿ âñòàâèë, ïîñêîëüêó äëÿ ýòîãî íàäî áûëî íàïèñàòü â òåëå äîêóìåíòà [*ôîðìî÷êà*]
          À ïðèâåäåííûé îòðåçîê êîäà, âåðîÿòíî, ãåíèàëåí, òîëüêî êóäà åãî ãîâîðèòü?  ñíèïïåò ôîðìû?  ÷àíê?  øàáëîí?
          • Battoon, ладно тебе стебаться smiley гениального там ничего нет.. мне показалось, что тут будет все понятно.. ок, тогда так:
            1. копируем приведенный выше код и сохраняем его в файл например nospam.php.
            2. редактируем в данном файле строчку session_name(’SN445farabbebc5’);, где SN445farabbebc5 - название сессии на установленном сайте (как мне известно, название сессии всегда будет уникальным для каждого сайта - это название генерируется при установке MODx), название сессии берем из файла config.inc.php.
            3. сохраняем отредактированный файл и выкладываем его куда-нибудь в директорию сайта.
            4. в своей контактной форме (скорее всего у тебя это будет чанк, который выводит форму) для вывода самой картинки прописываем <IMG src=’/full_path_to_file/nospam.php’ width=’76’ height=’26’ border=’0’> и создаем дополнительное поле, например, <INPUT name=’nospam’ id=’nospam’ type=’text’ maxlength=’6’>.
            5. в сниппете, который обрабатывает данные от контактной формы и отправляет далее емейл, нужно сделать дополнительную проверку на правильность введенного кода. Выглядеть такая проверка должна примерно так:
            if ($_SESSION[’nospam’]==$_POST[’nospam’]) { //если введенный код и переменная сессии совпадают, то
            //обрабатываем другие поля формы, например проверяем правильность введенного емейла
            //или заполненность обязательных полей..
            //если все остальное ок - отправляем мейл
            mail(...);
            }
            else {//введенный код и переменная сессии не совпадают
            //выводим сообщение об ошибке, предлагаем пользователю ввести код заново
            }
            6. сохраняем сниппет, тестируем...
              Разработка сайтов и программных модулей на MODX.
              Опыт работы на MODx с 2005 года. Высокое качество.
              Компания Baltic Design Colors: http://www.bdcolors.ru.
              • 2873
              • 106 Posts
              Доктор, что я делаю неправильно?

              файлик отредактировал (сессион нейм), положил в корень.
              Форма выводится сниппетом (без всяких чанков).

              Вот сам этот стандартный сниппет, вставил туда директивы проверки капчи. Не уверен, что вставил куда надо.
              // [[ContactForm? &sendTo=`[email protected]`]]
              $email = (isset($sendTo))? $sendTo : '[(emailsender)]';
              
              
              // enter "static" in order to use the static subject line
              $subject_type = "static";
              $static_subject = "NEWSSS???".$modx->config['site_url'];
              
              // Otherwise use an array of possible subjects
              $subject_array[] = "Survey Info";
              $subject_array[] = "Company Info";
              $subject_array[] = "Other Info";
              
              // Recipient ... add or remove lines as needed
              // Format (as few or as many as desired): 
              // $recipient_array["бла-бла-бла"] = '[email protected]';
              $recipient_array["Новости индустрии"] = "$email";
              $recipient_array["Событие"] = "$email";
              $recipient_array["Новости компании"] = "$email";
              $recipient_array["Анонс"] = "$email";
              $recipient_array["Другая какая-то новость"] = "$email";
              
              // enter "static" in order to use the solo recipient
              $recipient_type = "static";
              $static_recipient = "$email";
              
              // Instructions 
              $instructions = "Все поля обязательны для вдумчивого заполнения";
              
              // Success Message
              $success = "Спасибо за ваше сообщение! С вами свяжутся наши агенты.";
              
              // Class for containing Success Message <p>
              $successClass = "style2";
              
              // Failure <p> class
              $failClass = "err2";
              
              // Empy Field failure message
              $emptyFields = "Мы же говорим - ВСЕ поля обязательные, ага.";
              
              // General failure message
              $generalFail = "У нас тут какая-то проблема, извините. Может, чуть попозже, хорошо?";
              
              // Bad email failure message
              $failedEmail= (isset($_POST['email']))? $_POST['email']: '';
              $emailFail = "Ой. Вы ввели что-то такое, что не похоже на адрес почты. Может еще разок?";
              
              // Debug mode for testing
              $debug = false;
              
              //  <-----  END CONFIG  ----->
              ///////////////////////////////////
              $SendMail = '';
              if ($debug && $_POST) {
              	$SendMail .= "POST variables from Document ID [*id*]:\n";
              	foreach ($_POST as $key => $value) {
              		$SendMail .= "\t$key => $value\n";
              	}
              }
              
              $from= '';
              $from_email= '';
              $message= '';
              
              $postSend= isset($_POST['send'])? $_POST['send']: 'false';
              if ($postSend == 'true') { 
                  $to = ($recipient_type=="static") ? $static_recipient : $_POST['to'];
                  $from = $_POST['name'];
                  $from_email = $_POST['email'];
                  $the_subject = ($subject_type=="static") ? "$static_subject" : $_POST['subject'];
                  $message = $_POST['message'];
                  if ( ($from == '')||($from_email == '')||($message == '') ) {
                      $SendMail .= "<p class=\"$failClass\">$emptyFields</p>";
                  } elseif (eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $from_email)) {
                      $subject = $the_subject;
                      $headers = "From: $from <$from_email>\r\n";
                      
                      // clean out potential tomfoolery...
                      $message = $modx->stripTags($message);
                      
                      $body = "Name: $from\nEmail: $from_email\nMessage:\n\n <br />" . $message;
                      if (mail($to, $subject, $body, $headers)) {
                          $SendMail .= "<p class=\"$successClass\">$success</p>";
                          $SendMail .= ($debug) ? "<p>$to\n$headers\n$subject\n$body</p>" : '';
                          $from="";
                          $from_email="";
                          $message="";
                      } else {
                          $SendMail .= "<p class='$failClass'>$generalFail</p>";
                          $send = "false";
                      }
                  } else {
                      $SendMail .= "<p class='$failClass'>$emailFail</p>";
                      $send = "false";
                  } 
              }
              
              
              if ($_SESSION['nospam']==$_POST['nospam']) 
              mail(...);
              }
              else {//введенный код и переменная сессии не совпадают
              //выводим сообщение об ошибке, предлагаем пользователю ввести код заново
              }
              
              
              else {
                  $SendMail .= "<p><b>$instructions</b></p>";
              }
              
               $SendMail .=<<<EOD
              <h2>Сообщите нам о главном</h2>
              <div class=contact>
              <form method="post" name="EmailForm" id="EmailForm" action="[~[*id*]~]" style="border:0px; margin:0px;" >
                      <fieldset>
                         
                          <input type="hidden" name="send" value="true" />
                          <label for="name">Ваше имя:   <input type="text" name="name" id="name" size="30" value="$from" /></label><br><br>
              
                          <label for="email">Ваш e-mail:   <input type="text" name="email" id="email" size="30" value="$from_email" /></label><br><br>
              
                          <label for="to">Вы сообщаете:   </label> 
                          <select name="to" id="to">
                          <IMG src='nospam.php' width='76' height='26' border='0'> на картинке написано:<INPUT name='nospam' id='nospam' type='text' maxlength='6'>.
              EOD;
              
                      foreach ($recipient_array as $key=>$value) {
                          $SendMail .= "<option value=\"{$value}\">{$key}</option>\n";
                      }
              
              $SendMail .=<<<EOD
                          </select><br>
              
                          <label for="message"><br><br><br>(пишите сюда свою новость, скорее!)<br> <br>
                          <textarea style="width:100%; height:350px;" name="message" id="message">$message</textarea>
                          </label>
                          
                          <label> </label><br><br><input type="submit" value="Отправить" class="submit" />
                      </fieldset>
                  </form>
              
              
              </div>
              
              EOD;
              return $SendMail;
              
              • непросто разбираться в чужом коде smiley у меня сниппет еще от Etomite, 20 раз переделанный под собственные нужды.. ну ладно, отвлекся.. вот примерно так должно быть:
                // [[ContactForm? &sendTo=`[email protected]`]]
                $email = (isset($sendTo))? $sendTo : '[(emailsender)]';
                
                // enter "static" in order to use the static subject line
                $subject_type = "static";
                $static_subject = "NEWSSS???".$modx->config['site_url'];
                
                // Otherwise use an array of possible subjects
                $subject_array[] = "Survey Info";
                $subject_array[] = "Company Info";
                $subject_array[] = "Other Info";
                
                // Recipient ... add or remove lines as needed
                // Format (as few or as many as desired): 
                // $recipient_array["бла-бла-бла"] = '[email protected]';
                $recipient_array["Новости индустрии"] = "$email";
                $recipient_array["Событие"] = "$email";
                $recipient_array["Новости компании"] = "$email";
                $recipient_array["Анонс"] = "$email";
                $recipient_array["Другая какая-то новость"] = "$email";
                
                // enter "static" in order to use the solo recipient
                $recipient_type = "static";
                $static_recipient = "$email";
                
                // Instructions 
                $instructions = "Все поля обязательны для вдумчивого заполнения";
                
                // Success Message
                $success = "Спасибо за ваше сообщение! С вами свяжутся наши агенты.";
                
                // Class for containing Success Message <p>
                $successClass = "style2";
                
                // Failure <p> class
                $failClass = "err2";
                
                // Empy Field failure message
                $emptyFields = "Мы же говорим - ВСЕ поля обязательные, ага.";
                
                // General failure message
                $generalFail = "У нас тут какая-то проблема, извините. Может, чуть попозже, хорошо?";
                
                // Bad email failure message
                $failedEmail= (isset($_POST['email']))? $_POST['email']: '';
                $emailFail = "Ой. Вы ввели что-то такое, что не похоже на адрес почты. Может еще разок?";
                
                // Debug mode for testing
                $debug = false;
                
                //  <-----  END CONFIG  ----->
                ///////////////////////////////////
                $SendMail = '';
                if ($debug && $_POST) {
                	$SendMail .= "POST variables from Document ID [*id*]:\n";
                	foreach ($_POST as $key => $value) {
                		$SendMail .= "\t$key => $value\n";
                	}
                }
                
                $from= '';
                $from_email= '';
                $message= '';
                
                $postSend= isset($_POST['send'])? $_POST['send']: 'false';
                
                if ($_SESSION['nospam']!=$_POST['nospam']) {
                $postSend = 'false';
                $instructions .= "<br />Код, кстати, тоже надо правильно ввести!";
                }
                
                if ($postSend == 'true') { 
                    $to = ($recipient_type=="static") ? $static_recipient : $_POST['to'];
                    $from = $_POST['name'];
                    $from_email = $_POST['email'];
                    $the_subject = ($subject_type=="static") ? "$static_subject" : $_POST['subject'];
                    $message = $_POST['message'];
                    if ( ($from == '')||($from_email == '')||($message == '') ) {
                        $SendMail .= "<p class=\"$failClass\">$emptyFields</p>";
                    } elseif (eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $from_email)) {
                        $subject = $the_subject;
                        $headers = "From: $from <$from_email>\r\n";
                        
                        // clean out potential tomfoolery...
                        $message = $modx->stripTags($message);
                        
                        $body = "Name: $from\nEmail: $from_email\nMessage:\n\n <br />" . $message;
                        if (mail($to, $subject, $body, $headers)) {
                            $SendMail .= "<p class=\"$successClass\">$success</p>";
                            $SendMail .= ($debug) ? "<p>$to\n$headers\n$subject\n$body</p>" : '';
                            $from="";
                            $from_email="";
                            $message="";
                        } else {
                            $SendMail .= "<p class='$failClass'>$generalFail</p>";
                            $send = "false";
                        }
                    } else {
                        $SendMail .= "<p class='$failClass'>$emailFail</p>";
                        $send = "false";
                    } 
                }
                
                else {
                    $SendMail .= "<p><b>$instructions</b></p>";
                }
                
                 $SendMail .=<<<EOD
                <h2>Сообщите нам о главном</h2>
                <div class=contact>
                <form method="post" name="EmailForm" id="EmailForm" action="[~[*id*]~]" style="border:0px; margin:0px;" >
                        <fieldset>
                           
                            <input type="hidden" name="send" value="true" />
                            <label for="name">Ваше имя:   <input type="text" name="name" id="name" size="30" value="$from" /></label><br><br>
                
                            <label for="email">Ваш e-mail:   <input type="text" name="email" id="email" size="30" value="$from_email" /></label><br><br>
                
                            <label for="to">Вы сообщаете:   </label> 
                            <select name="to" id="to">
                            <IMG src='nospam.php' width='76' height='26' border='0'> на картинке написано:<INPUT name='nospam' id='nospam' type='text' maxlength='6'>.
                EOD;
                
                        foreach ($recipient_array as $key=>$value) {
                            $SendMail .= "<option value=\"{$value}\">{$key}</option>\n";
                        }
                
                $SendMail .=<<<EOD
                            </select><br>
                
                            <label for="message"><br><br><br>(пишите сюда свою новость, скорее!)<br> <br>
                            <textarea style="width:100%; height:350px;" name="message" id="message">$message</textarea>
                            </label>
                            
                            <label> </label><br><br><input type="submit" value="Отправить" class="submit" />
                        </fieldset>
                    </form>
                
                
                </div>
                
                EOD;
                return $SendMail;
                

                Признаюсь, времени тестировать не было, так что если какая ошибка будет - пиши сюда, будем исправлять smiley
                  Разработка сайтов и программных модулей на MODX.
                  Опыт работы на MODx с 2005 года. Высокое качество.
                  Компания Baltic Design Colors: http://www.bdcolors.ru.
                  • 2873
                  • 106 Posts
                  Igor =)
                  http://deforum.ru/tellme
                  êàðòèíêà íå ïîêàçûâàåòñÿ, è ââîä êîäà íå ïðîâåðÿåòñÿ, ÿ òåñòàíóë =)
                  ×òîáû êàðòèíêà õîòÿ áû îòîáðàæàëàñü - ïðèøëîñü ñëåãêà ïåðåâåðñòàòü ñíèïïåò (íþàíñû ñèíòàêñèñà õòìë\ïõï)
                  òî, ÷òî ñåé÷àñ ó ìåíÿ âèñèò ïî ññûëêå - â àòòà÷å (ñàì ñíèïïåò).

                  áóäó î÷åíü-î÷åíü áëàãîäàðåí, åñëè îíî íà÷íåò ïîêàçûâàòü öèôðû è ïðîâåðÿòü èõ ââîä, íåò, ïðàâäà smiley
                  • Значит так.. исправил мелкие ошибки ( был не закрыт комментарий в файле nospam.php rolleyes ), а также подправил твой сниппет.. Я бы его сильно переделал, ну да ладно. Все прикладываю в архиве:
                    1. Файл nospam.php (не забудь изменить session_name(’SN44d6f16040d9c’); на свое название сессии).
                    2. Файл newform.txt - твой сниппет.
                    Если будет желание, поменяешь путь к файлу nospam.php на свой.
                      Разработка сайтов и программных модулей на MODX.
                      Опыт работы на MODx с 2005 года. Высокое качество.
                      Компания Baltic Design Colors: http://www.bdcolors.ru.
                      • 2873
                      • 106 Posts
                      Igor, òû ëó÷øèé!


                      Ñïàñèáèùå îãðîìíîå, îíî ðàáîòàåò!
                      Îòäåëüíûé ðåñïåêò çà âûâîä ñîîáùåíèÿ î íåïðàâèëüíîì êîäå smiley laugh