Blackseabreathe Опубліковано: 18 грудня 2020 Share Опубліковано: 18 грудня 2020 Пытаюсь отправить Ajax запрос на восстановления пароля. В catalog/..../view/.../account/fotgotten.twig сделал кнопку <button type="button" id="forgot">send</button> Тут же Ajax запрос Спойлер $(document).on('click', '#forgot', function(){ $.ajax({ url: 'index.php?route=account/forgotten/validate', //отправляем запрос в catalog/controller/account/forgotten.php ф-ию validate, которая protected function - может дело в protected? type: 'post', //зщые data: $('#ff input[type=\'text\']'), //данные dataType: 'json', //json success: function(json) { if (json['redirect']) { location = json['redirect']; //если все ок, то направим на страницу входа (или любую другую укажу) } else if (json['error']) { if (json['error']['warning']) { $.jGrowl(json['error']['warning']); //показ ошибок если есть, а она всего одна может быть - есть ли такой email или нет } } }, error: function(xhr, ajaxOptions, thrownError) { alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); // ну и Ajax ошбки запроса } }); }); }); catalog/controller/account/forgotten ф-ия validate Спойлер protected function validate() { $json = array(); //создаю массив json if (!isset($this->request->post['email'])) { //если нет данных // $this->error['warning'] = $this->language->get('error_email'); //закомментировал стандартный функционал $json['error']['warning'] = $this->language->get('error_email'); //то покажем ошибку } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { //проверка на существование среди email юзеров $json['error']['warning'] = $this->language->get('error_email'); // текст ошибки если если false // $this->error['warning'] = $this->language->get('error_email'); //закомментировал стандартный функционал } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $json['error']['warning'] = $this->language->get('error_approved'); //отдаем текст ошибки // $this->error['warning'] = $this->language->get('error_approved'); //закомментировал стандартный функционал } $this->response->addHeader('Content-Type: application/json'); //json $this->response->setOutput(json_encode($json)); //json // return !$this->error; //закомментировал стандартный функционал } по итогу при запросе получаю такую ошибку Unrecognized token '<' parsererror <b>Warning</b>: call_user_func_array() expects parameter 1 to be a valid callback, cannot access protected method ControllerAccountForgotten::validate() in <b>/home/d/drobenfg/test.domrobensa.ru/storage/modification/system/engine/action.php</b> on line <b>79</b> Надіслати Поділитися на інших сайтах More sharing options...
Venter Опубліковано: 18 грудня 2020 Share Опубліковано: 18 грудня 2020 (змінено) А потому что у тебя функция protected function validate() { А надо function validate() { или public function validate() { Читаем ЗДЕСЬ Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в forgotten в методе index поставил бы запрет на обработку формы Змінено 18 грудня 2020 користувачем Venter Надіслати Поділитися на інших сайтах More sharing options... Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 2 минуты назад, Venter сказал: А потому что у тебя функция protected function validate() { А надо function validate() { или public function validate() { Читаем ЗДЕСЬ Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в forgotten в методе index поставил бы запрет на обработку формы да, уже разобрался, Вы правы на счет protected и public, единственное что пока не понял как сделать на php setTimeout. Дело в чем - если адрес такой есть в системе, то я сначала показываю текст "письмо отправлено на почту", а вот если делать редирект, то редирект происходит сразу и пользователь не видит текст успеха. Пытался использовать sleep(3); но это работает не так как надо. Вот пример на js как я хочу чтобы было на php .... показали текст ошибки, а потом ждем 3 секунды setTimeout function(){ .... и делаем редирект; }, 3000); Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 18 грудня 2020 Share Опубліковано: 18 грудня 2020 Во первых код js у вас кривой на ПХП Если все ОК то $json['status'] = true; $json['redirect'] = ''; Если ошибка $json['status'] = false; $json['redirect'] = 'ссылка'; На JS $(document).on('click', '#forgot', function(){ $.ajax({ url: 'index.php?route=account/forgotten/validate', //отправляем запрос в catalog/controller/account/forgotten.php ф-ию validate, которая protected function - может дело в protected? type: 'post', //зщые data: $('#ff input[type=\'text\']'), //данные dataType: 'json', //json success: function(json) { //выводим сообщение if (json.status) { //еренаправляем setTimeout('location.replace("' + json.redirect + '")', 1000); } } }); }); А вот это на js работать не будет if (json['redirect']) { location = json['redirect']; //если все ок, то направим на страницу входа (или любую другую укажу) } else if (json['error']) { if (json['error']['warning']) { $.jGrowl(json['error']['warning']); //показ ошибок если есть, а она всего одна может быть - есть ли такой email или нет } } }, Подучить бы для начала вам Надіслати Поділитися на інших сайтах More sharing options... Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 39 минут назад, Venter сказал: А потому что у тебя функция protected function validate() { А надо function validate() { или public function validate() { Читаем ЗДЕСЬ Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в forgotten в методе index поставил бы запрет на обработку формы ajax победил, кто-нить подскажет как отправлять само письмо? А то Ajax Ajax-ом, а триггер для отправки письма надо как-то додумать сделать Надіслати Поділитися на інших сайтах More sharing options... Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 1 минуту назад, Venter сказал: Во первых код js у вас кривой на ПХП Если все ОК то $json['status'] = true; $json['redirect'] = ''; Если ошибка $json['status'] = false; $json['redirect'] = 'ссылка'; На JS $(document).on('click', '#forgot', function(){ $.ajax({ url: 'index.php?route=account/forgotten/validate', //отправляем запрос в catalog/controller/account/forgotten.php ф-ию validate, которая protected function - может дело в protected? type: 'post', //зщые data: $('#ff input[type=\'text\']'), //данные dataType: 'json', //json success: function(json) { //выводим сообщение if (json.status) { //еренаправляем setTimeout('location.replace("' + json.redirect + '")', 1000); } } }); }); А вот это на js работать не будет if (json['redirect']) { location = json['redirect']; //если все ок, то направим на страницу входа (или любую другую укажу) } else if (json['error']) { if (json['error']['warning']) { $.jGrowl(json['error']['warning']); //показ ошибок если есть, а она всего одна может быть - есть ли такой email или нет } } }, Подучить бы для начала вам Ну почему же, все работает написанным мною способов, к тому же, на opencart везде именно такой вывод ошибок, отправляемых ajax-ом. Но с Вашим методом я согласен, делал так на Modx Revo, но если на самом опенкарт так из коробки (например в оформлении заказа), то уж лучше пусть будет так, тем более работает. Но за критику спасибо, она полезная. Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 может кому пригодится, выкладываю в общем сам родной шаблон twig восстановления пароля не менял а новый сделал и назвал swd_forgotten.twig {{ header }} <div id="account-forgotten" class="container"> <ul class="breadcrumb"> {% for breadcrumb in breadcrumbs %} <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li> {% endfor %} </ul> {% if error_warning %} <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}</div> {% endif %} <div class="row">{{ column_left }} {% if column_left and column_right %} {% set class = 'col-md-6 col-sm-8 col-xs-12' %} {% elseif column_left or column_right %} {% set class = 'col-md-9 col-sm-8 col-xs-12' %} {% else %} {% set class = 'col-sm-12' %} {% endif %} <div id="content" class="{{ class }}">{{ content_top }} <div class="inspire-form-bg"> <h1 class="heading">{{ cheading_title }}</h1> <p>{{ text_email }}</p> <div class="row infos"></div> <form id="swd-forgotten" method="post" enctype="multipart/form-data" class="form-horizontal"> <fieldset> <legend>{{ text_your_email }}</legend> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-email">{{ entry_email }}</label> <div class="col-sm-10"> <input type="email" name="email" value="{{ email }}" placeholder="{{ entry_email }}" id="input-email" class="form-control" /> </div> </div> </fieldset> <div class="buttons clearfix"> <div class="pull-left"><a href="{{ back }}" class="btn btn-default">{{ button_back }}</a></div> <div class="pull-right"> <input type="submit" value="{{ button_continue }}" class="btn btn-primary" /> </div> </div> </form> <script type="text/javascript" > var swdloader = '{{ load }}'; $(document).ready(function() { $('#swd-forgotten').on('submit', function() { var formData = $('#swd-forgotten').serialize(); var dataStr = formData+'&action=swdforgotten'; $.ajax({ type: 'POST', url: 'index.php?route=account/forgotten/swd_forgot', dataType: 'json', data: dataStr, cache: false, beforeSend: function(){ $('.infos').html('<img src="' + swdloader + '">').show(); }, success: function(json){ if(json.success) { $('.form-control').val(''); $('.infos').html(json.response.mes); setTimeout('location.replace("' + json.response.link + '")', 1900); } else { setTimeout($('.infos').html(json.response), 700); } } }); return false; }); }); </script> </div> {{ content_bottom }}</div> {{ column_right }}</div> </div> {{ footer }} я по ходу еще использую свой хелпер он в папке helper/default.php вот его код function swd_json_success( $json ) { $response = array( 'success' => true ); if ( isset( $json ) ) { $response['response'] = $json; } echo json_encode( $response ); exit(); } function swd_json_error( $json ) { $response = array( 'success' => false ); if ( isset( $json ) ) { $response['response'] = $json; } echo json_encode( $response ); exit(); } function swd_info( $info, $def = true ) { $html = ''; $css = 'success'; if( !$def ) $css = 'danger'; $html .= '<div class="alert swd-alert swd-'.$css.'">'; $html .= '<i class="fa fa-check-circle"></i> '.$info; $html .= '<button type="button" class="close" data-dismiss="alert">×</button>'; $html .= '</div>'; return $html; } function clearText( $data ) { $data = trim($data); $data = stripslashes($data); $data = preg_replace("/ +/", " ", $data); $data = str_replace('#39;', '', $data); $data = str_replace("`", '"', $data); $data = str_replace("'", '"', $data); $data = preg_replace('/"([^"]*)"/', '«$1»', $data); $data = preg_replace('#<script[^>]*>.*?</script>#is', '', $data); $data = str_replace('/^(.+?)(\?.*?)?(#.*)?$/', '$1$3', $data); $data = strip_tags($data); return $data; } //////////////////////////////////////////////////////// //////// Validate swd form cotact ////////////// //////////////////////////////////////////////////////// function check_email( $email ) { if (function_exists('filter_var')) return filter_var($email, FILTER_VALIDATE_EMAIL); else return preg_match("/^[a-z0-9_\.-]+@([a-z0-9]+\.)+[a-z]{2,6}$/i", $email); } теперь сами правки в controller/account/forgotten.php метод public function index() { в самый конец ////////////////////////////////////////////////////////////// if ($this->request->server['HTTPS']) { $server = $this->config->get('config_ssl'); } else { $server = $this->config->get('config_url'); } $data['load'] = $server . 'image/swdmail/load8.gif'; ////////////////////////////////////////////////////////////// //$this->response->setOutput($this->load->view('account/forgotten', $data)); $this->response->setOutput($this->load->view('account/swd_forgotten', $data)); кстати еще в папке image создал папку и туда лоадер загрузил. кому надо gif лоадер в сети скачает. идем дальше после protected function validate() { вставляем /////////////////////////////////// $this->error['info'] = true; //////////////////////////////////// вот так должно быть protected function validate() { /////////////////////////////////// $this->error['info'] = true; //////////////////////////////////// if (!isset($this->request->post['email'])) { $this->error['warning'] = $this->language->get('error_email'); } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { $this->error['warning'] = $this->language->get('error_email'); } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $this->error['warning'] = $this->language->get('error_approved'); } return !$this->error; } это чтоб старый вариант обработки не работал ну и сами методы ////////////////////////////////////////////////////////// /////// Validate form forgotten ajax ////////////////////////////////////////////////////////// public function swd_forgot() { //гружу свой хелпер $this->load->helper('default'); $this->load->model('account/customer'); $this->load->language('account/forgotten'); if( $this->request->post['action'] == 'swdforgotten' ) { if( ($this->request->server['REQUEST_METHOD'] == 'POST') && $this->swd_validate() ) { $this->model_account_customer->editCode($this->request->post['email'], token(40)); $redirect = $this->url->link('account/account', '', true); $json = array('mes' => swd_info( sprintf($this->language->get('forgotten_success'), $this->request->post['email']) ), 'link' => $redirect); swd_json_success( $json ); } //если есть ошибки выводим if( isset($this->error['info']) ) { $info = $this->error['info']; } else { $info = ''; } swd_json_error( swd_info( $info, false ) ); } else { swd_json_error( swd_info( $this->language->get('error_send'), false ) ); } } protected function swd_validate() { if (!isset($this->request->post['email'])) { $this->error['info'] = $this->language->get('error_email'); } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { $this->error['info'] = $this->language->get('error_email'); } if( !check_email($this->request->post['email']) ) { $this->error['info'] = $this->language->get('error_mail_valid'); } if( empty($this->request->post['email']) ) { $this->error['info'] = $this->language->get('error_mail_empty'); } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $this->error['info'] = $this->language->get('error_approved'); } return !$this->error; } еще в языковой файл forgotten.php добавил вот эти строки $_['error_mail_valid'] = 'Введите правильный Email!'; $_['error_mail_empty'] = 'Введите адрес электронной почты'; $_['error_send'] = 'Ошибка запроса! Обратитесь к администрации.'; $_['forgotten_success'] = 'На %s адрес электронной почты было отправлено письмо со ссылкой для подтверждения.'; ну в общем все Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 кстати на опенкарт использую отправку писем контакты, регстр, восстановл, вход через Phpmailer если кому будет интересно выложу Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 к примеру для отправки сообщения использую один метод и проверку отправки пример из моего контройлера стр контакты $altbody = $this->language->get('title_mail')."\n"; $altbody .= "Имя отправителя: ".$this->request->post['name']."\n"; $altbody .= "Email отправителя: ".$this->request->post['email']."\n"; $altbody .= "Сообщение: ".clearText($this->request->post['enquiry']); $subject = $this->language->get('title_mail'); $send = $this->swdmail->swd_send_html($this->config->get('config_email'), $subject, $this->load->view('mail/swdmail', $data), $altbody); if( $send ) { swd_json_success( swd_info( $this->language->get('success_send') ) ); } else { swd_json_success( swd_info( 'NO', false ) ); } Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 3.x Opencart 3.x: Пісочниця Opencart 3 ajax запрос на восстановление пароля? Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 2 минуты назад, Venter сказал: А потому что у тебя функция protected function validate() { А надо function validate() { или public function validate() { Читаем ЗДЕСЬ Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в forgotten в методе index поставил бы запрет на обработку формы да, уже разобрался, Вы правы на счет protected и public, единственное что пока не понял как сделать на php setTimeout. Дело в чем - если адрес такой есть в системе, то я сначала показываю текст "письмо отправлено на почту", а вот если делать редирект, то редирект происходит сразу и пользователь не видит текст успеха. Пытался использовать sleep(3); но это работает не так как надо. Вот пример на js как я хочу чтобы было на php .... показали текст ошибки, а потом ждем 3 секунды setTimeout function(){ .... и делаем редирект; }, 3000); Надіслати Поділитися на інших сайтах More sharing options...
Venter Опубліковано: 18 грудня 2020 Share Опубліковано: 18 грудня 2020 Во первых код js у вас кривой на ПХП Если все ОК то $json['status'] = true; $json['redirect'] = ''; Если ошибка $json['status'] = false; $json['redirect'] = 'ссылка'; На JS $(document).on('click', '#forgot', function(){ $.ajax({ url: 'index.php?route=account/forgotten/validate', //отправляем запрос в catalog/controller/account/forgotten.php ф-ию validate, которая protected function - может дело в protected? type: 'post', //зщые data: $('#ff input[type=\'text\']'), //данные dataType: 'json', //json success: function(json) { //выводим сообщение if (json.status) { //еренаправляем setTimeout('location.replace("' + json.redirect + '")', 1000); } } }); }); А вот это на js работать не будет if (json['redirect']) { location = json['redirect']; //если все ок, то направим на страницу входа (или любую другую укажу) } else if (json['error']) { if (json['error']['warning']) { $.jGrowl(json['error']['warning']); //показ ошибок если есть, а она всего одна может быть - есть ли такой email или нет } } }, Подучить бы для начала вам Надіслати Поділитися на інших сайтах More sharing options... Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 39 минут назад, Venter сказал: А потому что у тебя функция protected function validate() { А надо function validate() { или public function validate() { Читаем ЗДЕСЬ Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в forgotten в методе index поставил бы запрет на обработку формы ajax победил, кто-нить подскажет как отправлять само письмо? А то Ajax Ajax-ом, а триггер для отправки письма надо как-то додумать сделать Надіслати Поділитися на інших сайтах More sharing options... Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 1 минуту назад, Venter сказал: Во первых код js у вас кривой на ПХП Если все ОК то $json['status'] = true; $json['redirect'] = ''; Если ошибка $json['status'] = false; $json['redirect'] = 'ссылка'; На JS $(document).on('click', '#forgot', function(){ $.ajax({ url: 'index.php?route=account/forgotten/validate', //отправляем запрос в catalog/controller/account/forgotten.php ф-ию validate, которая protected function - может дело в protected? type: 'post', //зщые data: $('#ff input[type=\'text\']'), //данные dataType: 'json', //json success: function(json) { //выводим сообщение if (json.status) { //еренаправляем setTimeout('location.replace("' + json.redirect + '")', 1000); } } }); }); А вот это на js работать не будет if (json['redirect']) { location = json['redirect']; //если все ок, то направим на страницу входа (или любую другую укажу) } else if (json['error']) { if (json['error']['warning']) { $.jGrowl(json['error']['warning']); //показ ошибок если есть, а она всего одна может быть - есть ли такой email или нет } } }, Подучить бы для начала вам Ну почему же, все работает написанным мною способов, к тому же, на opencart везде именно такой вывод ошибок, отправляемых ajax-ом. Но с Вашим методом я согласен, делал так на Modx Revo, но если на самом опенкарт так из коробки (например в оформлении заказа), то уж лучше пусть будет так, тем более работает. Но за критику спасибо, она полезная. Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 может кому пригодится, выкладываю в общем сам родной шаблон twig восстановления пароля не менял а новый сделал и назвал swd_forgotten.twig {{ header }} <div id="account-forgotten" class="container"> <ul class="breadcrumb"> {% for breadcrumb in breadcrumbs %} <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li> {% endfor %} </ul> {% if error_warning %} <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}</div> {% endif %} <div class="row">{{ column_left }} {% if column_left and column_right %} {% set class = 'col-md-6 col-sm-8 col-xs-12' %} {% elseif column_left or column_right %} {% set class = 'col-md-9 col-sm-8 col-xs-12' %} {% else %} {% set class = 'col-sm-12' %} {% endif %} <div id="content" class="{{ class }}">{{ content_top }} <div class="inspire-form-bg"> <h1 class="heading">{{ cheading_title }}</h1> <p>{{ text_email }}</p> <div class="row infos"></div> <form id="swd-forgotten" method="post" enctype="multipart/form-data" class="form-horizontal"> <fieldset> <legend>{{ text_your_email }}</legend> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-email">{{ entry_email }}</label> <div class="col-sm-10"> <input type="email" name="email" value="{{ email }}" placeholder="{{ entry_email }}" id="input-email" class="form-control" /> </div> </div> </fieldset> <div class="buttons clearfix"> <div class="pull-left"><a href="{{ back }}" class="btn btn-default">{{ button_back }}</a></div> <div class="pull-right"> <input type="submit" value="{{ button_continue }}" class="btn btn-primary" /> </div> </div> </form> <script type="text/javascript" > var swdloader = '{{ load }}'; $(document).ready(function() { $('#swd-forgotten').on('submit', function() { var formData = $('#swd-forgotten').serialize(); var dataStr = formData+'&action=swdforgotten'; $.ajax({ type: 'POST', url: 'index.php?route=account/forgotten/swd_forgot', dataType: 'json', data: dataStr, cache: false, beforeSend: function(){ $('.infos').html('<img src="' + swdloader + '">').show(); }, success: function(json){ if(json.success) { $('.form-control').val(''); $('.infos').html(json.response.mes); setTimeout('location.replace("' + json.response.link + '")', 1900); } else { setTimeout($('.infos').html(json.response), 700); } } }); return false; }); }); </script> </div> {{ content_bottom }}</div> {{ column_right }}</div> </div> {{ footer }} я по ходу еще использую свой хелпер он в папке helper/default.php вот его код function swd_json_success( $json ) { $response = array( 'success' => true ); if ( isset( $json ) ) { $response['response'] = $json; } echo json_encode( $response ); exit(); } function swd_json_error( $json ) { $response = array( 'success' => false ); if ( isset( $json ) ) { $response['response'] = $json; } echo json_encode( $response ); exit(); } function swd_info( $info, $def = true ) { $html = ''; $css = 'success'; if( !$def ) $css = 'danger'; $html .= '<div class="alert swd-alert swd-'.$css.'">'; $html .= '<i class="fa fa-check-circle"></i> '.$info; $html .= '<button type="button" class="close" data-dismiss="alert">×</button>'; $html .= '</div>'; return $html; } function clearText( $data ) { $data = trim($data); $data = stripslashes($data); $data = preg_replace("/ +/", " ", $data); $data = str_replace('#39;', '', $data); $data = str_replace("`", '"', $data); $data = str_replace("'", '"', $data); $data = preg_replace('/"([^"]*)"/', '«$1»', $data); $data = preg_replace('#<script[^>]*>.*?</script>#is', '', $data); $data = str_replace('/^(.+?)(\?.*?)?(#.*)?$/', '$1$3', $data); $data = strip_tags($data); return $data; } //////////////////////////////////////////////////////// //////// Validate swd form cotact ////////////// //////////////////////////////////////////////////////// function check_email( $email ) { if (function_exists('filter_var')) return filter_var($email, FILTER_VALIDATE_EMAIL); else return preg_match("/^[a-z0-9_\.-]+@([a-z0-9]+\.)+[a-z]{2,6}$/i", $email); } теперь сами правки в controller/account/forgotten.php метод public function index() { в самый конец ////////////////////////////////////////////////////////////// if ($this->request->server['HTTPS']) { $server = $this->config->get('config_ssl'); } else { $server = $this->config->get('config_url'); } $data['load'] = $server . 'image/swdmail/load8.gif'; ////////////////////////////////////////////////////////////// //$this->response->setOutput($this->load->view('account/forgotten', $data)); $this->response->setOutput($this->load->view('account/swd_forgotten', $data)); кстати еще в папке image создал папку и туда лоадер загрузил. кому надо gif лоадер в сети скачает. идем дальше после protected function validate() { вставляем /////////////////////////////////// $this->error['info'] = true; //////////////////////////////////// вот так должно быть protected function validate() { /////////////////////////////////// $this->error['info'] = true; //////////////////////////////////// if (!isset($this->request->post['email'])) { $this->error['warning'] = $this->language->get('error_email'); } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { $this->error['warning'] = $this->language->get('error_email'); } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $this->error['warning'] = $this->language->get('error_approved'); } return !$this->error; } это чтоб старый вариант обработки не работал ну и сами методы ////////////////////////////////////////////////////////// /////// Validate form forgotten ajax ////////////////////////////////////////////////////////// public function swd_forgot() { //гружу свой хелпер $this->load->helper('default'); $this->load->model('account/customer'); $this->load->language('account/forgotten'); if( $this->request->post['action'] == 'swdforgotten' ) { if( ($this->request->server['REQUEST_METHOD'] == 'POST') && $this->swd_validate() ) { $this->model_account_customer->editCode($this->request->post['email'], token(40)); $redirect = $this->url->link('account/account', '', true); $json = array('mes' => swd_info( sprintf($this->language->get('forgotten_success'), $this->request->post['email']) ), 'link' => $redirect); swd_json_success( $json ); } //если есть ошибки выводим if( isset($this->error['info']) ) { $info = $this->error['info']; } else { $info = ''; } swd_json_error( swd_info( $info, false ) ); } else { swd_json_error( swd_info( $this->language->get('error_send'), false ) ); } } protected function swd_validate() { if (!isset($this->request->post['email'])) { $this->error['info'] = $this->language->get('error_email'); } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { $this->error['info'] = $this->language->get('error_email'); } if( !check_email($this->request->post['email']) ) { $this->error['info'] = $this->language->get('error_mail_valid'); } if( empty($this->request->post['email']) ) { $this->error['info'] = $this->language->get('error_mail_empty'); } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $this->error['info'] = $this->language->get('error_approved'); } return !$this->error; } еще в языковой файл forgotten.php добавил вот эти строки $_['error_mail_valid'] = 'Введите правильный Email!'; $_['error_mail_empty'] = 'Введите адрес электронной почты'; $_['error_send'] = 'Ошибка запроса! Обратитесь к администрации.'; $_['forgotten_success'] = 'На %s адрес электронной почты было отправлено письмо со ссылкой для подтверждения.'; ну в общем все Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 кстати на опенкарт использую отправку писем контакты, регстр, восстановл, вход через Phpmailer если кому будет интересно выложу Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 к примеру для отправки сообщения использую один метод и проверку отправки пример из моего контройлера стр контакты $altbody = $this->language->get('title_mail')."\n"; $altbody .= "Имя отправителя: ".$this->request->post['name']."\n"; $altbody .= "Email отправителя: ".$this->request->post['email']."\n"; $altbody .= "Сообщение: ".clearText($this->request->post['enquiry']); $subject = $this->language->get('title_mail'); $send = $this->swdmail->swd_send_html($this->config->get('config_email'), $subject, $this->load->view('mail/swdmail', $data), $altbody); if( $send ) { swd_json_success( swd_info( $this->language->get('success_send') ) ); } else { swd_json_success( swd_info( 'NO', false ) ); } Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 3.x Opencart 3.x: Пісочниця Opencart 3 ajax запрос на восстановление пароля? Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich
Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 39 минут назад, Venter сказал: А потому что у тебя функция protected function validate() { А надо function validate() { или public function validate() { Читаем ЗДЕСЬ Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в forgotten в методе index поставил бы запрет на обработку формы ajax победил, кто-нить подскажет как отправлять само письмо? А то Ajax Ajax-ом, а триггер для отправки письма надо как-то додумать сделать Надіслати Поділитися на інших сайтах More sharing options...
Blackseabreathe Опубліковано: 18 грудня 2020 Автор Share Опубліковано: 18 грудня 2020 1 минуту назад, Venter сказал: Во первых код js у вас кривой на ПХП Если все ОК то $json['status'] = true; $json['redirect'] = ''; Если ошибка $json['status'] = false; $json['redirect'] = 'ссылка'; На JS $(document).on('click', '#forgot', function(){ $.ajax({ url: 'index.php?route=account/forgotten/validate', //отправляем запрос в catalog/controller/account/forgotten.php ф-ию validate, которая protected function - может дело в protected? type: 'post', //зщые data: $('#ff input[type=\'text\']'), //данные dataType: 'json', //json success: function(json) { //выводим сообщение if (json.status) { //еренаправляем setTimeout('location.replace("' + json.redirect + '")', 1000); } } }); }); А вот это на js работать не будет if (json['redirect']) { location = json['redirect']; //если все ок, то направим на страницу входа (или любую другую укажу) } else if (json['error']) { if (json['error']['warning']) { $.jGrowl(json['error']['warning']); //показ ошибок если есть, а она всего одна может быть - есть ли такой email или нет } } }, Подучить бы для начала вам Ну почему же, все работает написанным мною способов, к тому же, на opencart везде именно такой вывод ошибок, отправляемых ajax-ом. Но с Вашим методом я согласен, делал так на Modx Revo, но если на самом опенкарт так из коробки (например в оформлении заказа), то уж лучше пусть будет так, тем более работает. Но за критику спасибо, она полезная. Надіслати Поділитися на інших сайтах More sharing options...
Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 может кому пригодится, выкладываю в общем сам родной шаблон twig восстановления пароля не менял а новый сделал и назвал swd_forgotten.twig {{ header }} <div id="account-forgotten" class="container"> <ul class="breadcrumb"> {% for breadcrumb in breadcrumbs %} <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li> {% endfor %} </ul> {% if error_warning %} <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }}</div> {% endif %} <div class="row">{{ column_left }} {% if column_left and column_right %} {% set class = 'col-md-6 col-sm-8 col-xs-12' %} {% elseif column_left or column_right %} {% set class = 'col-md-9 col-sm-8 col-xs-12' %} {% else %} {% set class = 'col-sm-12' %} {% endif %} <div id="content" class="{{ class }}">{{ content_top }} <div class="inspire-form-bg"> <h1 class="heading">{{ cheading_title }}</h1> <p>{{ text_email }}</p> <div class="row infos"></div> <form id="swd-forgotten" method="post" enctype="multipart/form-data" class="form-horizontal"> <fieldset> <legend>{{ text_your_email }}</legend> <div class="form-group required"> <label class="col-sm-2 control-label" for="input-email">{{ entry_email }}</label> <div class="col-sm-10"> <input type="email" name="email" value="{{ email }}" placeholder="{{ entry_email }}" id="input-email" class="form-control" /> </div> </div> </fieldset> <div class="buttons clearfix"> <div class="pull-left"><a href="{{ back }}" class="btn btn-default">{{ button_back }}</a></div> <div class="pull-right"> <input type="submit" value="{{ button_continue }}" class="btn btn-primary" /> </div> </div> </form> <script type="text/javascript" > var swdloader = '{{ load }}'; $(document).ready(function() { $('#swd-forgotten').on('submit', function() { var formData = $('#swd-forgotten').serialize(); var dataStr = formData+'&action=swdforgotten'; $.ajax({ type: 'POST', url: 'index.php?route=account/forgotten/swd_forgot', dataType: 'json', data: dataStr, cache: false, beforeSend: function(){ $('.infos').html('<img src="' + swdloader + '">').show(); }, success: function(json){ if(json.success) { $('.form-control').val(''); $('.infos').html(json.response.mes); setTimeout('location.replace("' + json.response.link + '")', 1900); } else { setTimeout($('.infos').html(json.response), 700); } } }); return false; }); }); </script> </div> {{ content_bottom }}</div> {{ column_right }}</div> </div> {{ footer }} я по ходу еще использую свой хелпер он в папке helper/default.php вот его код function swd_json_success( $json ) { $response = array( 'success' => true ); if ( isset( $json ) ) { $response['response'] = $json; } echo json_encode( $response ); exit(); } function swd_json_error( $json ) { $response = array( 'success' => false ); if ( isset( $json ) ) { $response['response'] = $json; } echo json_encode( $response ); exit(); } function swd_info( $info, $def = true ) { $html = ''; $css = 'success'; if( !$def ) $css = 'danger'; $html .= '<div class="alert swd-alert swd-'.$css.'">'; $html .= '<i class="fa fa-check-circle"></i> '.$info; $html .= '<button type="button" class="close" data-dismiss="alert">×</button>'; $html .= '</div>'; return $html; } function clearText( $data ) { $data = trim($data); $data = stripslashes($data); $data = preg_replace("/ +/", " ", $data); $data = str_replace('#39;', '', $data); $data = str_replace("`", '"', $data); $data = str_replace("'", '"', $data); $data = preg_replace('/"([^"]*)"/', '«$1»', $data); $data = preg_replace('#<script[^>]*>.*?</script>#is', '', $data); $data = str_replace('/^(.+?)(\?.*?)?(#.*)?$/', '$1$3', $data); $data = strip_tags($data); return $data; } //////////////////////////////////////////////////////// //////// Validate swd form cotact ////////////// //////////////////////////////////////////////////////// function check_email( $email ) { if (function_exists('filter_var')) return filter_var($email, FILTER_VALIDATE_EMAIL); else return preg_match("/^[a-z0-9_\.-]+@([a-z0-9]+\.)+[a-z]{2,6}$/i", $email); } теперь сами правки в controller/account/forgotten.php метод public function index() { в самый конец ////////////////////////////////////////////////////////////// if ($this->request->server['HTTPS']) { $server = $this->config->get('config_ssl'); } else { $server = $this->config->get('config_url'); } $data['load'] = $server . 'image/swdmail/load8.gif'; ////////////////////////////////////////////////////////////// //$this->response->setOutput($this->load->view('account/forgotten', $data)); $this->response->setOutput($this->load->view('account/swd_forgotten', $data)); кстати еще в папке image создал папку и туда лоадер загрузил. кому надо gif лоадер в сети скачает. идем дальше после protected function validate() { вставляем /////////////////////////////////// $this->error['info'] = true; //////////////////////////////////// вот так должно быть protected function validate() { /////////////////////////////////// $this->error['info'] = true; //////////////////////////////////// if (!isset($this->request->post['email'])) { $this->error['warning'] = $this->language->get('error_email'); } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { $this->error['warning'] = $this->language->get('error_email'); } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $this->error['warning'] = $this->language->get('error_approved'); } return !$this->error; } это чтоб старый вариант обработки не работал ну и сами методы ////////////////////////////////////////////////////////// /////// Validate form forgotten ajax ////////////////////////////////////////////////////////// public function swd_forgot() { //гружу свой хелпер $this->load->helper('default'); $this->load->model('account/customer'); $this->load->language('account/forgotten'); if( $this->request->post['action'] == 'swdforgotten' ) { if( ($this->request->server['REQUEST_METHOD'] == 'POST') && $this->swd_validate() ) { $this->model_account_customer->editCode($this->request->post['email'], token(40)); $redirect = $this->url->link('account/account', '', true); $json = array('mes' => swd_info( sprintf($this->language->get('forgotten_success'), $this->request->post['email']) ), 'link' => $redirect); swd_json_success( $json ); } //если есть ошибки выводим if( isset($this->error['info']) ) { $info = $this->error['info']; } else { $info = ''; } swd_json_error( swd_info( $info, false ) ); } else { swd_json_error( swd_info( $this->language->get('error_send'), false ) ); } } protected function swd_validate() { if (!isset($this->request->post['email'])) { $this->error['info'] = $this->language->get('error_email'); } elseif (!$this->model_account_customer->getTotalCustomersByEmail($this->request->post['email'])) { $this->error['info'] = $this->language->get('error_email'); } if( !check_email($this->request->post['email']) ) { $this->error['info'] = $this->language->get('error_mail_valid'); } if( empty($this->request->post['email']) ) { $this->error['info'] = $this->language->get('error_mail_empty'); } // Check if customer has been approved. $customer_info = $this->model_account_customer->getCustomerByEmail($this->request->post['email']); if ($customer_info && !$customer_info['status']) { $this->error['info'] = $this->language->get('error_approved'); } return !$this->error; } еще в языковой файл forgotten.php добавил вот эти строки $_['error_mail_valid'] = 'Введите правильный Email!'; $_['error_mail_empty'] = 'Введите адрес электронной почты'; $_['error_send'] = 'Ошибка запроса! Обратитесь к администрации.'; $_['forgotten_success'] = 'На %s адрес электронной почты было отправлено письмо со ссылкой для подтверждения.'; ну в общем все Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 кстати на опенкарт использую отправку писем контакты, регстр, восстановл, вход через Phpmailer если кому будет интересно выложу Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 к примеру для отправки сообщения использую один метод и проверку отправки пример из моего контройлера стр контакты $altbody = $this->language->get('title_mail')."\n"; $altbody .= "Имя отправителя: ".$this->request->post['name']."\n"; $altbody .= "Email отправителя: ".$this->request->post['email']."\n"; $altbody .= "Сообщение: ".clearText($this->request->post['enquiry']); $subject = $this->language->get('title_mail'); $send = $this->swdmail->swd_send_html($this->config->get('config_email'), $subject, $this->load->view('mail/swdmail', $data), $altbody); if( $send ) { swd_json_success( swd_info( $this->language->get('success_send') ) ); } else { swd_json_success( swd_info( 'NO', false ) ); } Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Opencart 3.x Opencart 3.x: Пісочниця Opencart 3 ajax запрос на восстановление пароля?
Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 кстати на опенкарт использую отправку писем контакты, регстр, восстановл, вход через Phpmailer если кому будет интересно выложу Надіслати Поділитися на інших сайтах More sharing options... Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 к примеру для отправки сообщения использую один метод и проверку отправки пример из моего контройлера стр контакты $altbody = $this->language->get('title_mail')."\n"; $altbody .= "Имя отправителя: ".$this->request->post['name']."\n"; $altbody .= "Email отправителя: ".$this->request->post['email']."\n"; $altbody .= "Сообщение: ".clearText($this->request->post['enquiry']); $subject = $this->language->get('title_mail'); $send = $this->swdmail->swd_send_html($this->config->get('config_email'), $subject, $this->load->view('mail/swdmail', $data), $altbody); if( $send ) { swd_json_success( swd_info( $this->language->get('success_send') ) ); } else { swd_json_success( swd_info( 'NO', false ) ); } Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
Venter Опубліковано: 23 грудня 2020 Share Опубліковано: 23 грудня 2020 к примеру для отправки сообщения использую один метод и проверку отправки пример из моего контройлера стр контакты $altbody = $this->language->get('title_mail')."\n"; $altbody .= "Имя отправителя: ".$this->request->post['name']."\n"; $altbody .= "Email отправителя: ".$this->request->post['email']."\n"; $altbody .= "Сообщение: ".clearText($this->request->post['enquiry']); $subject = $this->language->get('title_mail'); $send = $this->swdmail->swd_send_html($this->config->get('config_email'), $subject, $this->load->view('mail/swdmail', $data), $altbody); if( $send ) { swd_json_success( swd_info( $this->language->get('success_send') ) ); } else { swd_json_success( swd_info( 'NO', false ) ); } Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0
Recommended Posts