Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   форма обратной связи (https://javascript.ru/forum/misc/64502-forma-obratnojj-svyazi.html)

maxg5 16.08.2016 10:46

форма обратной связи
 
Всем доброго времени суток.
Нашел на просторах интернета AJAX форму обратной связи. Но она работает не корректно. Все время пишет что сообщение не отправлено.
Подозреваю что проблема в JS скрипте. Помогите разобраться.
jQuery(document).ready(function($){
 
    //в этой функции отслеживается изменение чекбокса "я не робот"
    $(document).on('change', '.fofm input:checkbox', function() {
        if($(this).is(':checked')){
            $(".fofm input[type=submit]").removeAttr('disabled');
            $('.fofm input[type=hidden].valTrFal').val('valTrFal_true');
        }
        else {
            $(".fofm input[type=submit]").attr('disabled','disabled');
            $('.fofm input[type=hidden].valTrFal').val('valTrFal_disabled');
        }
    });
 
    //закрытие модального окна
    $('.close_modal, .overlay').click(function (){
        $('.popup, .popup2, .overlay').css({'opacity':'0', 'visibility':'hidden'});
        $('.popup > .fofm textarea').val('');
        //сброс всех полей формы обраной связи
        $(':input','.fofm').not(':button, :submit, :reset, :hidden').val('').removeAttr('checked').removeAttr('selected');
        $(".fofm input[type=submit]").attr('disabled','disabled');
    });
 
    //показ модального окна
    $('.open_modal').click(function (e){
        e.preventDefault();
        $('.popup, .overlay').css({'opacity':'1', 'visibility':'visible'});
    });
 
    //аякс форма обратной связи
    //проверяет какой ответ был получен
    //и в зависимости от ответа
    //выводит информацию о статусе
    //отправки письма
    $(".fofm").submit(function() {
        var str = $(this).serialize();
        $.ajax({
            type: "POST",
            url: "php/contact.php",
            data: str,
            success: function(msg) {
                if(msg == 'ok') {
                    $('.popup2, .overlay').css('opacity','1');
                    $('.popup2, .overlay').css('visibility','visible');
                    $('.popup').css({'opacity':'0','visibility':'hidden'});
                }
                else {
                    $('.popup2 .window').html('<h5>Ошибка</h5><p>Сообщение не отправлено, убедитесь в правильности заполнение полей</p>');
                    $('.popup2, .overlay').css('opacity','1');
                    $('.popup2, .overlay').css('visibility','visible');
                    $('.popup').css({'opacity':'0','visibility':'hidden'});
                }
            }
        });
        return false;
    });
 
});


<div class="overlay"></div>
    <div class="popup">
        <div class="close_modal">x</div>
        <form class="fofm" action="">
            <h5>Форма обратной связи</h5>
            <input type="text" required="" placeholder="Имя" name="txtname">
            <input type="email" placeholder="Email" name="txtemail">
            <input type="tel" pattern="^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$" required="" placeholder="Телефон" name="txtphone">
            <textarea name="txtmessage" placeholder="Описание" rows="10"></textarea>
            <label><input type="checkbox">Я не робот</label>
            <input type="hidden" name="valTrFal" class="valTrFal" value="valTrFal_disabled">
            <input type="submit" class="button" value="Отправить" disabled="disabled" name="btnsend">
        </form>
    </div>
 
    <div class="popup2">
    <div class="close_modal">x</div>
        <div class="window">
            <div class="insText">
                <h5>запрос отправлен</h5>
                <p><strong>Ваш запрос отправлен.</strong>Наш менеджер свяжется с вами в ближайшее время!</p>
                <hr>
                <p>Предлагаем подробную информацию по продукции:</p>
            </div>
        </div>
    </div>

Spass 16.08.2016 11:32

success: function(msg) {
                if(msg == 'ok') {
                    $('.popup2, .overlay').css('opacity','1');
                    $('.popup2, .overlay').css('visibility','visible');
                    $('.popup').css({'opacity':'0','visibility':'hidden'});
                }
                else {
                    $('.popup2 .window').html('<h5>Ошибка</h5><p>Сообщение не отправлено, убедитесь в правильности заполнение полей</p>');
                    $('.popup2, .overlay').css('opacity','1');
                    $('.popup2, .overlay').css('visibility','visible');
                    $('.popup').css({'opacity':'0','visibility':'hidden'});
                }
            }


Очевидно что на сервере нужно возвращать 'ok', так что ищи проблему там :)

maxg5 16.08.2016 11:50

Spass,
Это понятно что на сервере нужно возвращать 'ok'.
Вот только не понятно где именно ошибка в скрипте.

maxg5 16.08.2016 12:34

<?php
//проверяем значения полученые при проверке скриптом формы
if (trim($_POST['valTrFal'])!='valTrFal_true') {
	echo 'fasle';
}
else {

		$txtname = trim($_POST['txtname']);

		$txtNameValue = trim($_POST['name_class_value']);

		$txtemail = trim($_POST['txtemail']);

		$txtphone = trim($_POST['txtphone']);

		$txtmessage = trim($_POST['txtmessage']);

		// от кого
		$fromMail = 'zakaz@mosmsater.ru';
		$fromName = 'NameSendler';

		// Сюда введите Ваш email
		$emailTo = 'user5@user.ru;

		$subject = 'Форма обратной связи';
		$subject = '=?utf-8?b?'. base64_encode($subject) .'?=';
		$headers = "Content-type: text/plain; charset=\"utf-8\"\r\n";
		$headers .= "From: ". $fromName ." <". $fromMail ."> \r\n";

		// тело письма
		$body = "Получено письмо с сайта МойСайт.рф\n\nИмя: $txtname\nТелефон: $txtphone\ne-mail: $txtemail \nСообщение: $txtmessage";
		$mail = mail($emailTo, $subject, $body, $headers, '-f'. $fromMail );


		echo 'ok';
}
?>

maxg5 16.08.2016 13:04

Разобрался.
Была ошибка синтаксиса в contact.php в 23 строке.

laimas 16.08.2016 13:04

Цитата:

Сообщение от maxg5
//проверяем значения полученые при проверке скриптом формы
if (trim($_POST['valTrFal'])!='valTrFal_true') {
echo 'fasle';
}
else {
$txtname = trim($_POST['txtname']);
$txtNameValue = trim($_POST['name_class_value']);
$txtemail = trim($_POST['txtemail']);
$txtphone = trim($_POST['txtphone']);
$txtmessage = trim($_POST['txtmessage']);

И где здесь проверка?

PS. И уберите ошибку в РНР коде - строка 23 не закрыта кавычкой

warren buffet 16.08.2016 13:33

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

warren buffet 16.08.2016 13:35

Цитата:

if (trim($_POST['valTrFal'])!='valTrFal_true') {
echo 'fasle';
Элементарного не знает. Если нет данных в посте, то показывый ту же самую форму вновь.

if (trim($_POST['valTrFal'])=='valTrFal_true') {

 /* тут обработка, отправка и редирект */

}
else {

 /* тут рендер формы*/

}


UPD, вот оно чо - if(msg == 'ok') - премило. То есть сервер ничего не может написать и ответить. Идиотский скрипт.

laimas 16.08.2016 14:35

Цитата:

Сообщение от warren buffet
Элементарного не знает.

А ты знаешь? Как раз начиная с этого if (trim($_POST['valTrFal'])=='valTrFal_true') и начинается пустое.

warren buffet 16.08.2016 14:36

Цитата:

Сообщение от Rise
filter_input

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

Просто форму сперва надо изобразить как объект со свойствами и методами. Но для ТС это уже совсем-совсем другая история.

warren buffet 16.08.2016 14:37

laimas, ну если ТС нашел такой дебильный скрипт, значит там и такие вот дебильные проверки будут.

laimas 16.08.2016 14:42

Цитата:

Сообщение от warren buffet
ну если ТС нашел такой дебильный скрипт

У тебя все скрипты "дебильные", ну кроме твоего бреда, естественно, чем ты тут уже не раз палился. Нет дебильных скриптов, есть неверная постановка задачи или ее непонимание. Опять несешь бред:

Цитата:

Сообщение от warren buffet
Ни разу этой фигней не пользовался и по-моему она нафиг не нужна, поскольку чтобы вывести форму, требуются данные, и эти же самые данные используются для проверки правильности введенных пользователем данных.


warren buffet 16.08.2016 14:50

ТС, вот тут вроде похоже на правду https://gist.github.com/ajtroxell/6731408 хотя и гитхаб

warren buffet 16.08.2016 14:52

Цитата:

Сообщение от laimas
Нет дебильных скриптов

Есть дебильные скрипты написанные дебилами специально для дебилов. В каждой нише всегда есть закуток где обслуживаются дебилы отказывающие выходить в зал для обслуживания грамотных людей.

laimas 16.08.2016 14:54

Цитата:

Сообщение от warren buffet
вот тут вроде похоже на правду

Правду какую, та что для клиента, его проверка? Для сервера эта "правда" всегда должна равняться false.

laimas 16.08.2016 14:55

Цитата:

Сообщение от warren buffet
Есть дебильные скрипты написанные дебилами специально для дебилов. В каждой нише всегда есть закуток где обслуживаются дебилы отказывающие выходить в зал для обслуживания грамотных людей.

Тупой ты, ой как туп, и даже не подозреваешь об этом.

warren buffet 16.08.2016 14:59

Такие вещи все равно делаются через БД. Почта теряется, залипает в спаме, ходит как попало. А когда есть БД, то основную часть данных о полях можно получить прямо из свойств полей таблицы, здесь таблицы отзывов. Например если поле name not null и нет никакого default, то значит в форме оно будет reuired, а если есть default, то сразу пишем в value этого поля в форме, что в default внесено на этапе создания таблицы. Еще можно вычислять maxlength для текстовых полей. Для полей под числа можно узнать тип числа и допустимое количество знаков за запятой. Дофига чего в общем. Затем в эти же данные просто добавляются паттерны и по обстоятельствам дополнительные свойства и готов объект для рендера формы и для валидации одновременно.

warren buffet 16.08.2016 15:01

Цитата:

Сообщение от laimas
Для сервера эта "правда" всегда должна равняться false.

Поэтому объект должен быть на сервере, см пост выше умнег.

laimas 16.08.2016 15:03

Несешь бред, понос словесный о базе и прочей лабуде.

warren buffet 16.08.2016 18:30

laimas, ты же вроде специалист по реляционным беде и должен знать, как получить инфу о таблице. Это можно сделать в том числе через information_schema, зацени

$q='select `table_name`,`column_name`,`data_type` as `dtype`,
coalesce(`character_maximum_length`,`numeric_precision`) as `maxlength`,
`numeric_scale` as `decimals`,
`column_key`, 
(`is_nullable`="NO" && `column_default` is NULL) as `required`,
`column_default` as `value`,
`column_type` as `data`
from `information_schema`.`columns` 
where `table_schema`="'.$this->db_name.'" 
and `table_name`="'.$table_name.'"';


Затем еще немного преобразования табличных типов данных в типы полей формы

$sql_types=array(
	'varchar|text|year|char|tinytext|mediumtext|longtext' => 'text',
	'int|decimal|tinyint|smallint|mediumint|bigint|float|double|real' => 'number',
	'enum|set'	=>'select',
	'timestamp'	=>'datetime-local',
	'bit|boolean|serial'=>'range'
);


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

laimas 16.08.2016 18:53

Цитата:

Сообщение от warren buffet
ты же вроде специалист по реляционным беде и должен знать

Ты может и специалист по "реляционным беде", а не являюсь специалистом по беде, унитазам, да и вообще по сантехнике.

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

Но дело не в этом - нафига весь этот понос нужен в контексте темы, где речь об отправке почты от формы, которая даже раз в 100 лет не потребует изменений, и ее данные не нужно сохранять в базе? Вот ради чего это твое очередное словоблудие? Подсказать способ проверки полей этой формы? Так причем тут база, если в данном случае на все 100 выгоднее просто прописать условия, да и направить эти данные в единый валидатор данных если он есть труда не составит.

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

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

warren buffet 16.08.2016 18:59

Цитата:

Сообщение от laimas
и ее данные не нужно сохранять в базе?

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

warren buffet 16.08.2016 19:04

Цитата:

Сообщение от laimas
в единый валидатор данных если он есть труда не составит.

Дуся, нет никакого единого валидатора в мире. Любое поле само себя проверяет, поскольку оно - объект, то есть обладает свойствами и имеет методы. В html5 в точности все реализовано как это делали до html5 грамотные люди.

laimas 16.08.2016 19:06

Цитата:

Сообщение от warren buffet
Иначе бы тебя жизнь заставила сохранять все фидбеки и камбеки и калбеки в беде.

В беде моют наружные половые органы. Ну а ты можешь в нем и хранить и фид, и бек, и что угодно, я не против.

Ты начитался умных книжек, а пользоваться этим не умеешь, я уже трижды наблюдаю твой "пехепе" - полнейший бред. У тебя есть проблески разумного в JS и даже без лексики гопника, но они так редки, что невольно возникает подозрение, не плагиат ли это.

Пиши в "пехепе", храни в "беде", верстай в "хтмля", я не против.

warren buffet 16.08.2016 19:12

Слушай, но ведь твои "чеса" с лихвой перекрывают все беде и пехепе. Или нет? )))

warren buffet 16.08.2016 20:18

Идея "единого валидатора" живее всех живых. На самом деле делается ровно наоборот, вот как на пехепе.

foreach($this->_d as $field) {
	
	try {
		if($field->name)
			$field->validate($post);
	}
	catch(_CException $e){
		/* уловитель ошибок */
	}

}


и примерно то же самое на js, но без цикла, потому что поле просто вызывает валидацию самого себя через "единую" функцию, где надо провести некоторые мероприятия общего порядка, вроде стереть предыдущую ошибку и проверить как там с остальными полями - можно ли включать кнопку "Отправить".

validate=function(evt) {

	var input=the.inputs[evt.detail.name];
	
	/* тут обнуляется прошлое */
	
	try {
		input.validate();
		isComplete(); /* быстрый осмотр индикаторов ошибок всех полей */
	}
	catch(e) {
	/* уловитель ошибок */
	}
	
}

the.form.addEventListener('validate',validate);


То есть это метод валидации на лету, когда кнопка Отправить становится активной только когда можно отправлять.

Так вот, а теперь моем внешние половые органы в беде. В такой конфигурации я добавляю поле в таблице базы данных и, если меня не колебет перевод на русский язык его названия и не колебет расположение в форме - мне ничего делать больше не надо: поле появится в форме со всей минимально необходимой инфой и для верстки и для проверки. То есть такой мини phpMyAdmin.

Само собой абсолютно любую форму обслуживают одни и те же скрипты. Хоть 100500 форм нарисуй - все что потребуется, это перевести на русский название поля и определить его метоположение в форме если хочется дизайна, а не хочется - оно и так одно за другим выведется с оригинальными именами.


Часовой пояс GMT +3, время: 17:26.