Форум русской поддержки Joomla!® CMS
10.12.2016, 22:30:42 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

[Решено] Перехват события отправки формы ChronoForms

 (Прочитано 1979 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« : 18.08.2014, 11:30:14 »

Joomla 2.5

Есть необходимость заполнить одно из полей формы некоторым значением в момент отправки формы. Значение берется из php-скрипта, который выполняется после того как юзер нажал кнопку "отправить". По сути нужно осуществить перехват события отправки. Я написал скрипт на jquery, но он не успевает исполнится, потому что у хроноформс похоже собственный обработчик на мутулс, который срабатывает быстрее. Мой скрипт отрабатывает, если в форме были допущены ошибки заполнения и она не отправляется после нажатия на "отправить". Но этот вариант не годится.
Как решить проблему?
« Последнее редактирование: 19.08.2014, 17:09:02 от Zverek » Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #1 : 18.08.2014, 12:04:34 »

Сделай чтобы скрипт исполнялся на странице, и поле перед отправкой будет уже с нужным наполнением. Или в обработчике, где идет получение значений name, заполнить нужной информацией из php-скрипта, который выполняется после того как юзер нажал кнопку "отправить".
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #2 : 18.08.2014, 12:32:26 »

Сделай чтобы скрипт исполнялся на странице, и поле перед отправкой будет уже с нужным наполнением.

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

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

А где этот обработчик? Это надо менять скрипт самого хроноформса, как я понимаю. Не думаю, что это вариант, поскольку при обновлении компонента мои изменения исчезнут.
Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #3 : 18.08.2014, 12:46:03 »

Ну, если так обновлять не умеете..
Тогда поточнее, что откуда берется, почему эти данные так часто меняются, и для чего они нужны. Может есть другой вариант решения...
И что это за поле такое в БД которое меняется, и может вставляться в форму..?
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #4 : 18.08.2014, 13:05:46 »

форма - заявка на услуги. Каждая заявка имеет номер. Номер формируется из текущей даты и порядкового номера заявки. Чтобы узнать порядковый номер, нужно считать из базы номер предыдущей заявки и увеличить на единицу. Если сформировать поле с номером заявки в момент, когда форма только появляется на странице, то велика вероятность того, что пока юзер будет заполнять заявку, другой юзер заполнит форму, отправит данные и изменит номер последней заявки в БД. Поэтому считывать номер заявки нужно именно в последний момент. То есть когда юзер уже отправляет данные.
Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #5 : 18.08.2014, 13:16:04 »

очень, и очень тонко..) Есть такой аттрибут для полей БД как AUTO_INCREMENT, благодаря ему у тебя не будут совпадать номера заявок..)))
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #6 : 18.08.2014, 13:20:16 »

Дело в том, что каждый год порядковый номер должен обнуляться! То есть, номер растет в пределах одного года. Год кончился - начинаем нумерацию сначала. Поэтому я не могу воспользоваться уникальным id заявки, а должен сделать в БД специальное поле для номера.
Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #7 : 18.08.2014, 13:31:57 »

Зачем это, вручную считать будешь чтоли?)
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #8 : 18.08.2014, 13:53:16 »

Не я придумывал ТЗ Azn

В любом случае, по id я считаю номер или формирую его в отдельном поле, мне этот номер нужно передавать в форму, потому что номер заявки должен быть в письме, которое получает сотрудник фирмы вместе с остальными заполненными полями.
Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #9 : 18.08.2014, 14:03:05 »

Я написал скрипт на jquery, но он не успевает исполнится, потому что у хроноформс похоже собственный обработчик на мутулс, который срабатывает быстрее.
Опа, что-то я этого сразу не заметил...  Shocked

Скрипт в студию, ща ускорим его..!
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #10 : 18.08.2014, 14:39:29 »

Да обычный перехватчик.

Код:
$('#myform').submit(function(){
$.post("zayavka.php", function(response)
{
 $('#number').val(response);

});    
});


number - id текстового поля, в которое вставляется номер заявки
zayavka.php - скрипт запроса номера предыдущей заявки из БД и формирования нового номера

Вот если я жму на "отправить" не заполнив какого-то обязательного поля, то данный перехватчик срабатывает - записывает номер заявки в нужное поле и потом при повторной отправке данных (когда все обязательные поля заполнены) передает это значение в БД и в письмо.
Но если форма сразу заполнена верно, то обработчик не срабатывает. Как будто его нет вовсе. Ставил return false; не помогает.. алерты выводил внутри обработчика - ничего не работает, если ошибок в форме нет. Она просто уходит и все. Без нужного поля.

Насчет того, что в хроноформс обработчик на mootools  и он срабатывает быстрее моего - это лишь предположение. Я не знаю как на самом деле работает форма.
« Последнее редактирование: 18.08.2014, 14:42:39 от Zverek » Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #11 : 18.08.2014, 15:02:19 »

Все, пошутили и хватит.. письмо отправляется только после того как в БД добавлены данные, в итоге получается, что после запроса на сохранение новой заявки INSERT, но, до функции отправки письма, нужно создать запрос SELECT, и выбрать все необходимые поля, для отправки в письме.
файл zayavka.php скиньте тоже, возможно проблема в нем..
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #12 : 18.08.2014, 15:25:51 »



Цитировать
в итоге получается, что после запроса на сохранение новой заявки INSERT, но, до функции отправки письма, нужно создать запрос SELECT, и выбрать все необходимые поля, для отправки в письме.
Не уловил мысль. Это все делает хроноформс. Зачем нам вмешиваться в этот процесс?  На мой взгляд достаточно, что номер последней заявки мы считаем в момент отправки данных. тут же сформируем новый номер и скормим его хроноформсу.
Скрипт заявки ниже, но он выполняет поставленную перед ним цель. Он рабочий.

номер выглядит так: 12_08_14, где 12 - номер заявки по порядку. 08_14 - текущий месяц и год
В поле БД `number` заявка в таком виде и хранится: 12_08_14. Следующий код считывает номер последней заявки, парсит его, и формирует новый.
Код:
$sql = "SELECT number FROM `g5x4u_zayavka` ORDER BY `cf_id` DESC LIMIT 1";
$db->setQuery($sql);
$data_row = $db->loadRow();
$new_number='1';
if($data_row!='')
{
$explode=explode('_',$data_row[0]);

$old_year=$explode[2];
$new_number= ($old_year==date('y'))? $explode[0]+1 : 1;

}

$all_number=$new_number.'_'.date('m').'_'.date('y');
echo $all_number;

Записан
shurakana
Живу я здесь
******

Репутация: +48/-6
Offline Offline

Сообщений: 862



« Ответ #13 : 18.08.2014, 15:37:19 »

Цитировать
Зачем нам вмешиваться в этот процесс?  На мой взгляд достаточно, что номер последней заявки мы считаем в момент отправки данных.

Извините, связь прервалась... я сдаюсь..)
Записан
Zverek
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 26


« Ответ #14 : 19.08.2014, 17:04:51 »

На самом деле у меня просто неверно был написан перехватчик события отправки (ошибку разъяснили на другом форуме). Mootools  тут вообще не при делах, поскольку он отвечает только за валидацию формы. Далее форма уходит на обработку стандартным путем. И при корректном перехватчике моя задача решается элементарно.
Вот правильный скрипт перехватчика (не думаю, что кому-то надо будет так заморачиваться, но вдруг...)

Код:
$('#myform').submit(function(e, force)
{
    if(!force)
   {
       e.preventDefault();    
       $.post("zayavka.php", function(response)
       {
   $('#number').val(response);
            $('#myform').trigger('submit','true');
        });  
   }

});


То есть вся эта тема к ChronoForms вообще говоря мало отношения имеет. Знание JQuery и ничего больше.
« Последнее редактирование: 20.08.2014, 09:51:44 от Zverek » Записан
МихаилМ
Осваиваюсь на форуме
***

Репутация: +1/-0
Offline Offline

Сообщений: 64


« Ответ #15 : 03.09.2015, 11:32:06 »

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

Код:
$('#myform').submit(function(e, force)
{
    if(!force)
   {
       e.preventDefault();   
       $.post("zayavka.php", function(response)
       {
    $('#number').val(response);
            $('#myform').trigger('submit','true');
        });   
   }

});



Друг! У тебя там бесконечный цикл получается в скрипте. На субмит
Код:
$('#myform').submit(function(e, force)
ты запускаешь операции, которые запускают эту же функцию опять
Код:
$('#myform').trigger('submit','true');
Тут правильно делать обработчик событий на кнопку в форме
Код:
$('#какая-то кнопка внутри формы').click(function() {});
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet