За последние 24 часа нас посетили 64064 программиста и 1741 робот. Сейчас ищут 885 программистов ...

Отправка формы submit + onsubmit

Тема в разделе "PHP для новичков", создана пользователем Вадим2019, 26 янв 2019.

  1. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Добрый день!

    У меня есть форма регистрации:

    Код (Text):
    1.  
    2. <form action='user/register' class="form register_form" id="myform" method="post" onsubmit="sendcde()">
    3. .....
    4. <inputclass="ot13"name="register"  value="Зарегистрироваться"type="submit">
    5. </form>
    Также эти данные мне надо отправить в php файл, пытаюсь это сделать через onsubmit и js
    Код (Text):
    1.  
    2. <script>
    3. function sendcde(){
    4.     $.ajax({
    5.         type:"POST",
    6.         url:"/test/mz_sub.php",
    7.         data: $('#myform').serialize()
    8.     })
    9. //    $("#myform").submit();
    10. ;}
    11. </script>
    В принципе эта конструкция срабатывает везде кроме браузера safari (т.е. всех apple устройств).

    В safari срабатывает если расскоментировать
    Код (Text):
    1.  
    2. $("#myform").submit();
    Но в этом случае появляется какой то цикл и к файлу mz_sub.php приходит больше 1000 обращений. Т.е. использовать это не могу.

    Как сделать чтобы отправка заработала во всех браузерах?
     
  2. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Причина - https, на тестовом сайте без https все работает нормально.

    Как можно это исправить, чем мешает https?
     
  3. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Нет, все таки дело не в https :)) Помогите найти ошибку...
     
  4. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    http://api.jquery.com/submit/

    Код (Text):
    1. $( "#target" ).submit(function( event ) {
    2.   alert( "Handler for .submit() called." );
    3.   event.preventDefault();
    4. });
    Да фиг его знает, что там не нравится этому сафари...)
     
  5. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Не только в safari не срабатывает еще и в firefox. JS не успевает отработать, происходит перезагрузка страницы при нажатии submit. Иногда успевает...
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    честно говоря вообще непонятен такой подход - и форму слать и эти-же данные аяксом
    ... имхо это в корне неверно
    если нужно что-то аяксово обрабатывать без перезагрузки страницы - ну делайте только это без отправки формы сабмитом
    если нужна отправка формы - ну отправьте форму просто и не парьтесь с аяксом
    а обработки делайте на стороне сервера .... хоть 2 хоть 22

    ну или мусье любит извращения - ну не сабмитом второй раз форму отправляйте на обработку - а тем же аяксом... или $.post
    ну и не забывайте event.preventDefault(); или return false; в функции
     
  7. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Убрал из js Ajax сделал так
    Код (Text):
    1. $.post("/test/mz_sub.php", {email:email, from:from, soglasie:soglasie} );
    Но все равно получается тоже самое если не прописать event.preventDefault(); то отправляется только submit без post в js, если прописать, то наоборот.
     
  8. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Если на вкладке сеть в консоли посмотреть то там указано время 200 мс, это когда получается отправить данные в php файл и 30 мс (и файл выделен красным) когда не получается, но получается отправить submit формы.
     
  9. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Как сделать задержку sendcde.submit(); на 1 секунду?
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Код (Javascript):
    1. setTimeout(function() {
    2. //тут твои действия
    3. }, 1000);
     
  11. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Выдает вот такую ошибку. Если писать просто действие (без таймаута) то форма сразу отправляется.
    TypeError: sendcde.submit is not a function. (In 'sendcde.submit()', 'sendcde.submit' is undefined)
     
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    я не вижу что ты делаешь чтобы использовать эту стандартную функцию.
     
  13. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    --- Добавлено ---
    Вот форма
    Код (Text):
    1. <form action="user/register" class="form register_form" id="myform" method="post" onsubmit="sendcde();return false;" >
    2. <div class="ot23">Фамилия, Имя, Отчество</div><div class="ot11">
    3. <input class="ot12" type="text"  name="name" data-format=".+" data-notice="Введите Фамилию, Имя, Отчество" value="{$name|escape}" maxlength="255" /></div>
    4. <div class="ot23">E-mail</div><div class="ot11">
    5. <input class="ot12" type="text"  name="email" id="email" data-format="email" data-notice="Введите e-mail" value="{$email|escape}" maxlength="255" />
    6. <input class="number" type="text"  name="from" id="from" value="REGISTRATION" />
    7. </div>
    8. <div class="ot23">Пароль</div><div class="ot11">
    9. <input class="ot12"  type="password" name="password" data-format=".+" data-notice="Введите пароль" value="" /></div>
    10. <div class="ot11"><input  class="ot13" name="register" id="register3"  value="Зарегистрироваться" type="submit"></div>
    11. <div class="ot55">
    12. Вводя свои данные Вы подтверждаете что ознакомлены с <a href="publichnaya_oferta">публичной офертой</a> и принимаете ее условия.
    13.    <div class="reg0t56"><input type="checkbox" checked name="soglasie" id="soglasie" value="yes">
    14.    <label for="soglasie">Хочу получать информацию о скидках, специальных предложениях и акциях интернет-магазина.</label>
    15.    </div>
    16. </div>
    17. </form>
    А вот скрипт

    Код (Text):
    1. <script>
    2. function sendcde(){
    3. //event.preventDefault();
    4. var email = $('#email').val();
    5. var from = $('#from').val();
    6. var soglasie = $('#soglasie').val();
    7.  
    8. $.post("/test/mz_sub.php", {email:email, from:from, soglasie:soglasie})
    9. .done(function sendcde2 ( result )
    10.         {
    11.  
    12.        alert(result);
    13.  
    14.         });
    15. setTimeout(function() {
    16. sendcde.submit();
    17. }, 1000);
    18. ;}
    19. </script>
    Форма должна отправить данные (action="user/register") и зарегистрировать пользователя, а скрипт должен отправить данные в test/mz_sub.php и подписать пользователя на рассылку. По отдельности все работает.
    --- Добавлено ---
     
  14. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Спрашивается нахрена козе баян??? Зачем вообще тут JS почему обработчик сам не может подписать на рассылку, ну или накрайняк отправить данные другому скрипту?
     
  15. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Регистрации проходит через обработчик от системы управления сайтом, а подписка идет во внешнюю систему которая никакого отношения к сайту не имеет, через api.
    Я просто незнаю как это в обработчике прописать можно... Поэтому пошел через js.

    Вот код обработчика регистрации
    Код (Text):
    1.  
    2. <?PHP
    3. require_once('View.php');
    4. class RegisterView extends View
    5. {
    6.     function fetch()
    7.     {
    8.         $default_status = 1; // Активен ли пользователь сразу после регистрации (0 или 1)
    9.      
    10.         if($this->request->method('post') && $this->request->post('register'))
    11.         {
    12.             $name            = $this->request->post('name');
    13.             $email            = $this->request->post('email');
    14.             $password        = $this->request->post('password');
    15.             //$captcha_code           = $this->request->post('captcha_code');
    16.          
    17.             $this->design->assign('name', $name);
    18.             $this->design->assign('email', $email);
    19.          
    20.             $this->db->query('SELECT count(*) as count FROM __users WHERE email=?', $email);
    21.             $user_exists = $this->db->result('count');
    22.  
    23.             if($user_exists)
    24.                 $this->design->assign('error', 'user_exists');
    25.             elseif(empty($name))
    26.                 $this->design->assign('error', 'empty_name');
    27.             elseif(empty($email))
    28.                 $this->design->assign('error', 'empty_email');
    29.             elseif(empty($password))
    30.                 $this->design->assign('error', 'empty_password');      
    31.             //elseif(empty($_SESSION['captcha_code']) || $_SESSION['captcha_code'] != $captcha_code || empty($captcha_code))
    32.             //{
    33.             //    $this->design->assign('error', 'captcha');
    34.             //}
    35. elseif($user_id = $this->users->add_user(array('name'=>$name, 'email'=>$email, 'password'=>$password, 'enabled'=>$default_status, 'last_ip'=>$_SERVER['REMOTE_ADDR'], 'group_id'=>$this->settings->group0_id)))
    36.             {
    37.             $this->notify->email_registration($user_id, $password);
    38.  
    39.             // Отправим письмо пользователю
    40.          
    41.                 $_SESSION['user_id'] = $user_id;
    42.             //    if(!empty($_SESSION['last_visited_page']))
    43.             //        header('Location: '.$_SESSION['last_visited_page']);              
    44.             //    else
    45.             //        header('Location: '.$this->config->root_url);
    46.             // Перенаправляем пользователя в личный кабинет
    47.             //    header('Location: ' . $this->config->root_url . '/user');
    48.          
    49.          
    50.           if (!empty($_SESSION['current_page'] !== '/user/register'))
    51.                header('Location: '.$_SESSION['current_page']);      
    52.             else
    53.                 // Перенаправляем пользователя в личный кабинет
    54.                 header('Location: ' . $this->config->root_url . '/user');          
    55.              
    56.          
    57.             }
    58.             else
    59.                 $this->design->assign('error', 'unknown error');
    60.  
    61.         }
    62.         return $this->design->fetch('register.tpl');
    63.     }  
    64. }
     
  16. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    например вот так https://php.ru/manual/function.file-get-contents.html#108309
    можно всех подряд подписывать, можно только после успешной регистрации
     
  17. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Только не понятно каким образом, это сделать...
    --- Добавлено ---
    Прописал в начале обработчика file_get_contents('/test/mz_sub.php', true);
    Но естественно ничего не произошло...
     
  18. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Прописал в начале обработчика file_get_contents('/test/mz_sub.php', true);
    Но естественно ничего не произошло...
    Спасибо за наводку! Получилось через php обработчик передать данные!!
     
  19. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Вадим2019, ну вот видишь 300р тебе сэкономил)) не такой уж я и бесполезный))
     
  20. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    ))) Да, спасибо. Теперь осталось подружить это с https.... Не срабатывает file_get_contents на https
     
  21. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
  22. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    Что то не срабатывает ни один способ, а в php.ini не хочу отключать..
    Пробую вот так..
    Код (Text):
    1.     $url= 'https://....../test/mz_sub.php';
    2.         $arrContextOptions=array("ssl"=>
    3.         array    (
    4.         "verify_peer"=>false,
    5.         "verify_peer_name"=>false,
    6.         'method'  => 'POST',
    7.         'header'  => 'Content-type: application/x-www-form-urlencoded',
    8.         'content' => $postdata
    9.                 ),
    10.                 );    
     
  23. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
  24. Вадим2019

    Вадим2019 Активный пользователь

    С нами с:
    22 янв 2019
    Сообщения:
    28
    Симпатии:
    0
    openssl: yes
    http wrapper: yes
    https wrapper: yes
    wrappers: array ( 0 => 'https', 1 => 'ftps', 2 => 'compress.zlib', 3 => 'compress.bzip2', 4 => 'php', 5 => 'file', 6 => 'glob', 7 => 'data', 8 => 'http', 9 => 'ftp', 10 => 'phar', 11 => 'zip', )