Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 27.10.2016, 15:10
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Вопрос даже не в количестве форм, 20 - это я написал утрировано. Их несколько (всего 4) просто они находятся в разных местах и имею разный дизайн. Они передают имя, телефон и заголовок. Заголовок подтягивается не из инпутов, а не посредственно из верстки. Значения "name" у всех однотипных инпутов - одинаковые.
На самом деле (как по мне) эта информация уже бесполезна, потому как с предыдущей задачей Вы помогли мне успешно справиться, хотя Вам разумеется виднее.
Теперь мне просто нужно устранить возникшую ошибку с отправкой.

Последний раз редактировалось smart-create, 27.10.2016 в 15:14.
Ответить с цитированием
  #12 (permalink)  
Старый 27.10.2016, 16:07
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от smart-create
На самом деле (как по мне) эта информация уже бесполезна
То есть, одним сценарием вот так:

if(!$.trim(this.name.value) || !$.trim(this.phone_1.value) || !$.trim(this.email.value))

проверить любую форму с полями имеющими какие угодно имена?

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

Что метод $.ajax() jQuery, что плагин ajaxSubmit, это одно и тоже - организация асинхронного обмена данными с сервером. Что первый, что второй можно и выбросить, и написать такой обмен на том, что эти методы и используют - XMLHTTPRequest. И без проблем данные будут отправляться серверу, то есть ошибка совсем не в методе. Смотрим то, что вы считаете "бесполезной информацией":

<input type="text" name="name" placeholder="Введите ваше имя *" /><br />
<input type="text" name="phone_1" placeholder="Введите номер телефона *" /><br />

А скрипт проверяет условия:

if(!$.trim(this.name.value) || !$.trim(this.phone_1.value) || !$.trim(this.email.value))

Вопрос - если в форме отсутствует как таковое поле email будет ли выполнятся условие и в конечном итоге отправка формы серверу?

e = $(f.elements).slice(0, -1); - я пояснял почему так взяты элементы формы, и что их нужно будет проверить проходом в цикле. Как выясняется все одинаково, можно обойтись и без цикла, но

e.addClass('input-error'); - добавит указанный класс всем элементам формы содержащимся в коллекции е. Но ведь не факт, что все поля не заполнены, может не заполнено только одно, а зачем все отмечать ошибкой?

По поводу приема данных сервером. Это в общем то бардак, а не прием данных. Северу все равно проверялись ли данные на клиенте ли нет, он просто обязан проверить их - заполнены ли поля обязательные, возможно и имя, если есть на него условия, а уж номер телефона и электронного адреса (что-то его не видно не только на клиенте, но и в обработке на сервере) тем более нужно проверять. Иначе вы получите на сервере набор мусора, типа name=>" " и phone_1=>abc.

header("Cache-Control: no-store, no-cache, must-revalidate"); - это для чего? А это зачем - echo json_encode($client);? Зачем отправлять данные клиенту, которые он получил, а клиент их и так имеет, тем более, судя по коду, клиенту они и не нужны.

Вот эта функция вообще прелесть:

function new_order_1($client){
$array = array(
'name' => $client['name'],
'phone_1' => $client['phone_1']
);
$this->db->insert('client', $array);
}

То есть переменная $client уже определена массивом

array(
'name' = $_POST['name'];
'phone_1' = $_POST['phone_1'];
);

в функции order_1(), передана в функцию, а значит достаточно в ней - $this->db->insert('client', $client); и все, нет надо массив переписать заново только под другим именем, чтобы записать в базу. Это даже не глупость, это дикость. А если данные сервер не проверяет к тому же, представляете что может база хранить?

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

Последний раз редактировалось laimas, 27.10.2016 в 16:27.
Ответить с цитированием
  #13 (permalink)  
Старый 27.10.2016, 17:21
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Я приношу извинения за некоторые неточности, предыдущие сообщение писал не с ПК а с телефона, по этому не много запутался что и от куда копирую.

На счет наличия пункта "email" - давайте его упустим, добавить одно поле, в процессе я смогу и сам, надеюсь справлюсь

Оставим в сценарии проверки:
Цитата:
if(!$.trim(this.name.value) || !$.trim(this.phone_1.value))
На счет приема данных на сервере, я знаю что там сплошной "быдло код", и это будет следующий пункт с которым мне необходимо разобраться, НО сейчас для меня главное что это самый "быдло код", принимает и отправляет данные, я хочу привести в порядок клиента, а потом перейти к оптимизации сервера. На счет вот этого:
Цитата:
header("Cache-Control: no-store, no-cache, must-revalidate");
, приношу извинения, это вообще не от туда..., при копировании "затесалось под шумок".

Цитата:
Заголовок подтягивается не из инпутов, а не посредственно из верстки. - этого в коде не наблюдается, а догадаться чего там у вас конкретно, как я уже говорил, я не могу. Будет конкретика, будет и конкретный код без лишнего.
- давайте обойдемся и без этого? Как и в случае поля с email, я думаю смогу разобраться как обработать и это поле, по уже готовому примеру, что бы не отнимать у Вас слишком много времени.

Если сформулировать это все конкретно и на конкретном примере:
- Я создал только что тестовую страницу, в ней есть 2 формы (абсолютно идентичны между собой):
<form method="post" action="main_c/order_1">
    <input type="text" name="name" placeholder="Введите ваше имя *" /><br />
    <input type="text" name="phone_1" placeholder="Введите номер телефона *" /><br />
    <button type="submit" name="btn_order_1">Жду звонка!</button>
</form>

<form method="post" action="main_c/order_1">
    <input type="text" name="name" placeholder="Введите ваше имя *" /><br />
    <input type="text" name="phone_1" placeholder="Введите номер телефона *" /><br />
    <button type="submit" name="btn_order_1">Жду звонка!</button>
</form>


Они должны обрабатываться вот этим скриптом:
$(function() {
    $.valHooks.input = {
        get: function(e) {
            return $.trim(e.value)
        }
    };
    $("form").submit(function(e){
        e.preventDefault();
        var f = this,
            e = $(f.elements).slice(0, -1);
        
        if(!$.trim(this.name.value) || !$.trim(this.phone_1.value) || !$.trim(this.email.value)){
            e.addClass('input-error');
        }else{
            e.removeClass('input-error');
            e.addClass('input-success');
            $.ajax({
                url: f.action,
                type: 'POST',
                dataType: 'json',
                success: function(data) {
                     f.reset();
                },
            });
        }
    });
})


И передаваться на сервер, где полученную информацию с формы обрабатывает вот этот контролер:
function order_1() {
    if (isset($_POST['btn_order_1'])) {
        $client['name']  = $_POST['name'];
        $client['phone_1']  = $_POST['phone_1'];
        $this->main_model->new_order_1($client);
        $this->email->from('ru.marketroll@gmail.com', 'ЗАГОЛОВОК');
        $this->email->to('velichko.my.site@gmail.com');
        $this->email->subject('ТЕМА');
        $this->email->message('Имя: '.$client['name']."\r\n".'Номер телефона: '.$client['phone_1']); 
        $this->email->send();
             
        echo json_encode($client);
    }


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

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

Последний раз редактировалось smart-create, 27.10.2016 в 17:24.
Ответить с цитированием
  #14 (permalink)  
Старый 27.10.2016, 18:05
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от smart-create
Они должны обрабатываться вот этим скриптом:
Не будут они обрабатываться этим скриптом, так как нет в них поля email, которое проверяется условием.

А чтобы сервер принимал данные, их нужно отправлять (копировал код и сам проглядел):

$(function() {
    $("form").submit(function(e){
        e.preventDefault();
        var f = this,
            //получает элементы формы без кнопки submit и которые не заполнены 
            e = $(f.elements).slice(0, -1).removeClass('input-error').filter(function() {
                return !$.trim(this.value)
            });
        //если есть незаполненные поля, то пометить их    
        if(e.length) e.addClass('input-error'); 
        //иначе отправка формы
        else {
            e.addClass('input-success');
            $.ajax({
                url: f.action,
                type: 'POST',
                data: $(f).serialize(), //отправляемые данные, если надо добавить что-то производное, то $(f).serialize()+'&key_name='+значение
                dataType: 'json',
                success: function(data) {
                     //data содержит ответ сервера, и если сервер вернет ошибки заполнения формы, то сообщить
                     //и только если север подтвердит, что все ОК, только тогда сброс формы
                     f.reset();
                }
            });
        }
    });
});

Последний раз редактировалось laimas, 27.10.2016 в 18:08.
Ответить с цитированием
  #15 (permalink)  
Старый 27.10.2016, 19:51
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Спасибо Вам огромное! Все заработало! Заработало еще лучше чем я мог ожидать. Еще раз спасибо, за помощь и потраченное время
Ответить с цитированием
  #16 (permalink)  
Старый 28.10.2016, 06:24
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Если ожидать лучшего, хотя данная проверка, это минимум, и с таковой браузеры умные уже сами справляются. А вот чего не должен ожидать сервер, так это множество отправлений одной формы. Отправление формы не обязательно быстрый процесс, даже на стадии подключения к серверу могут быть задержки, а клиент может не дождавшись ответа сервера отправить форму вновь. Поэтому как минимальное на стороне клиента нужно блокировать отправление формы на время обмена данными с сервером. Для этого строки 4-8 кода можно переписать так:

var f = this,
            s = $(f.elements).last(),
            e = s.end().slice(0, -1).removeClass('input-error').filter(function() {
                return !$.trim(this.value)
            });


перед строкой 13 добавить: s.prop('disabled', 1);, а в success: function(data) добавить: s.prop('disabled', 0);
Строку 13 переписать так: s.end().not(s).addClass('input-success');

Последний раз редактировалось laimas, 28.10.2016 в 13:53.
Ответить с цитированием
  #17 (permalink)  
Старый 01.11.2016, 04:12
Профессор
Отправить личное сообщение для warren buffet Посмотреть профиль Найти все сообщения от warren buffet
 
Регистрация: 08.07.2016
Сообщений: 1,332

Одним словом laimas в прошлый раз не понял смысла атрибутов pattern, required и всех остальных.
Ответить с цитированием
  #18 (permalink)  
Старый 01.11.2016, 14:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от warren buffet
Одним словом laimas в прошлый раз не понял смысла атрибутов pattern, required и всех остальных.
Да куда нам дуракам чай пить, окромя тебя тут все кое как проггеры, куда нам с тобой, светоч ты наш, тагаться.

Бабушку свою учу, чмо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00
скрипт для выбора серий и сезонов vk Evkliptik Общие вопросы Javascript 0 23.09.2012 16:10
Загрузить title для ссылок на странице MarikVal jQuery 0 27.07.2009 20:38
Пошаговый вывод скрипта для IE всех версий. Zidky Элементы интерфейса 10 17.06.2009 18:27
Как изменить скрипт, что бы им его можно было использовать для нужной страницы Nick50_70 Общие вопросы Javascript 0 28.04.2009 23:30