Добрый день! У меня есть форма регистрации: Код (Text): <form action='user/register' class="form register_form" id="myform" method="post" onsubmit="sendcde()"> ..... <inputclass="ot13"name="register" value="Зарегистрироваться"type="submit"> </form> Также эти данные мне надо отправить в php файл, пытаюсь это сделать через onsubmit и js Код (Text): <script> function sendcde(){ $.ajax({ type:"POST", url:"/test/mz_sub.php", data: $('#myform').serialize() }) // $("#myform").submit(); ;} </script> В принципе эта конструкция срабатывает везде кроме браузера safari (т.е. всех apple устройств). В safari срабатывает если расскоментировать Код (Text): $("#myform").submit(); Но в этом случае появляется какой то цикл и к файлу mz_sub.php приходит больше 1000 обращений. Т.е. использовать это не могу. Как сделать чтобы отправка заработала во всех браузерах?
Причина - https, на тестовом сайте без https все работает нормально. Как можно это исправить, чем мешает https?
http://api.jquery.com/submit/ Код (Text): $( "#target" ).submit(function( event ) { alert( "Handler for .submit() called." ); event.preventDefault(); }); Да фиг его знает, что там не нравится этому сафари...)
Не только в safari не срабатывает еще и в firefox. JS не успевает отработать, происходит перезагрузка страницы при нажатии submit. Иногда успевает...
честно говоря вообще непонятен такой подход - и форму слать и эти-же данные аяксом ... имхо это в корне неверно если нужно что-то аяксово обрабатывать без перезагрузки страницы - ну делайте только это без отправки формы сабмитом если нужна отправка формы - ну отправьте форму просто и не парьтесь с аяксом а обработки делайте на стороне сервера .... хоть 2 хоть 22 ну или мусье любит извращения - ну не сабмитом второй раз форму отправляйте на обработку - а тем же аяксом... или $.post ну и не забывайте event.preventDefault(); или return false; в функции
Убрал из js Ajax сделал так Код (Text): $.post("/test/mz_sub.php", {email:email, from:from, soglasie:soglasie} ); Но все равно получается тоже самое если не прописать event.preventDefault(); то отправляется только submit без post в js, если прописать, то наоборот.
Если на вкладке сеть в консоли посмотреть то там указано время 200 мс, это когда получается отправить данные в php файл и 30 мс (и файл выделен красным) когда не получается, но получается отправить submit формы.
Выдает вот такую ошибку. Если писать просто действие (без таймаута) то форма сразу отправляется. TypeError: sendcde.submit is not a function. (In 'sendcde.submit()', 'sendcde.submit' is undefined)
--- Добавлено --- Вот форма Код (Text): <form action="user/register" class="form register_form" id="myform" method="post" onsubmit="sendcde();return false;" > <div class="ot23">Фамилия, Имя, Отчество</div><div class="ot11"> <input class="ot12" type="text" name="name" data-format=".+" data-notice="Введите Фамилию, Имя, Отчество" value="{$name|escape}" maxlength="255" /></div> <div class="ot23">E-mail</div><div class="ot11"> <input class="ot12" type="text" name="email" id="email" data-format="email" data-notice="Введите e-mail" value="{$email|escape}" maxlength="255" /> <input class="number" type="text" name="from" id="from" value="REGISTRATION" /> </div> <div class="ot23">Пароль</div><div class="ot11"> <input class="ot12" type="password" name="password" data-format=".+" data-notice="Введите пароль" value="" /></div> <div class="ot11"><input class="ot13" name="register" id="register3" value="Зарегистрироваться" type="submit"></div> <div class="ot55"> Вводя свои данные Вы подтверждаете что ознакомлены с <a href="publichnaya_oferta">публичной офертой</a> и принимаете ее условия. <div class="reg0t56"><input type="checkbox" checked name="soglasie" id="soglasie" value="yes"> <label for="soglasie">Хочу получать информацию о скидках, специальных предложениях и акциях интернет-магазина.</label> </div> </div> </form> А вот скрипт Код (Text): <script> function sendcde(){ //event.preventDefault(); var email = $('#email').val(); var from = $('#from').val(); var soglasie = $('#soglasie').val(); $.post("/test/mz_sub.php", {email:email, from:from, soglasie:soglasie}) .done(function sendcde2 ( result ) { alert(result); }); setTimeout(function() { sendcde.submit(); }, 1000); ;} </script> Форма должна отправить данные (action="user/register") и зарегистрировать пользователя, а скрипт должен отправить данные в test/mz_sub.php и подписать пользователя на рассылку. По отдельности все работает. --- Добавлено ---
Спрашивается нахрена козе баян??? Зачем вообще тут JS почему обработчик сам не может подписать на рассылку, ну или накрайняк отправить данные другому скрипту?
Регистрации проходит через обработчик от системы управления сайтом, а подписка идет во внешнюю систему которая никакого отношения к сайту не имеет, через api. Я просто незнаю как это в обработчике прописать можно... Поэтому пошел через js. Вот код обработчика регистрации Код (Text): <?PHP require_once('View.php'); class RegisterView extends View { function fetch() { $default_status = 1; // Активен ли пользователь сразу после регистрации (0 или 1) if($this->request->method('post') && $this->request->post('register')) { $name = $this->request->post('name'); $email = $this->request->post('email'); $password = $this->request->post('password'); //$captcha_code = $this->request->post('captcha_code'); $this->design->assign('name', $name); $this->design->assign('email', $email); $this->db->query('SELECT count(*) as count FROM __users WHERE email=?', $email); $user_exists = $this->db->result('count'); if($user_exists) $this->design->assign('error', 'user_exists'); elseif(empty($name)) $this->design->assign('error', 'empty_name'); elseif(empty($email)) $this->design->assign('error', 'empty_email'); elseif(empty($password)) $this->design->assign('error', 'empty_password'); //elseif(empty($_SESSION['captcha_code']) || $_SESSION['captcha_code'] != $captcha_code || empty($captcha_code)) //{ // $this->design->assign('error', 'captcha'); //} 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))) { $this->notify->email_registration($user_id, $password); // Отправим письмо пользователю $_SESSION['user_id'] = $user_id; // if(!empty($_SESSION['last_visited_page'])) // header('Location: '.$_SESSION['last_visited_page']); // else // header('Location: '.$this->config->root_url); // Перенаправляем пользователя в личный кабинет // header('Location: ' . $this->config->root_url . '/user'); if (!empty($_SESSION['current_page'] !== '/user/register')) header('Location: '.$_SESSION['current_page']); else // Перенаправляем пользователя в личный кабинет header('Location: ' . $this->config->root_url . '/user'); } else $this->design->assign('error', 'unknown error'); } return $this->design->fetch('register.tpl'); } }
например вот так https://php.ru/manual/function.file-get-contents.html#108309 можно всех подряд подписывать, можно только после успешной регистрации
Только не понятно каким образом, это сделать... --- Добавлено --- Прописал в начале обработчика file_get_contents('/test/mz_sub.php', true); Но естественно ничего не произошло...
Прописал в начале обработчика file_get_contents('/test/mz_sub.php', true); Но естественно ничего не произошло... Спасибо за наводку! Получилось через php обработчик передать данные!!
Что то не срабатывает ни один способ, а в php.ini не хочу отключать.. Пробую вот так.. Код (Text): $url= 'https://....../test/mz_sub.php'; $arrContextOptions=array("ssl"=> array ( "verify_peer"=>false, "verify_peer_name"=>false, 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata ), );
PHP: $w = stream_get_wrappers(); echo 'openssl: ', extension_loaded ('openssl') ? 'yes':'no', "\n"; echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n"; echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n"; echo 'wrappers: ', var_export($w); что кажет?
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', )