Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Opencart 3 ajax запрос на восстановление пароля?


Recommended Posts

Пытаюсь отправить 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>

 

Надіслати
Поділитися на інших сайтах


А потому что у тебя функция 

protected function validate() {

А надо

function validate() {

или

public function validate() {

Читаем ЗДЕСЬ  

Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в

forgotten

 в методе index поставил бы запрет на обработку формы

Змінено користувачем Venter
Надіслати
Поділитися на інших сайтах

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);

 

Надіслати
Поділитися на інших сайтах


Во первых код 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 или нет
}
}
},

Подучить бы для начала вам

Надіслати
Поділитися на інших сайтах

39 минут назад, Venter сказал:

А потому что у тебя функция 


protected function validate() {

А надо


function validate() {

или

public function validate() {

Читаем ЗДЕСЬ  

Ну и как по мне в Ajax запрос я бы оставил вывод сообщения успешное восстановление пароля или как , и если нужно перенаправить то через Н времени перенаправляем, а так я бы вообще создал отдельный метод на который слал бы запрос а в


forgotten

 в методе index поставил бы запрет на обработку формы

 

ajax победил, кто-нить подскажет как отправлять само письмо? А то Ajax Ajax-ом, а триггер для отправки письма надо как-то додумать сделать

Надіслати
Поділитися на інших сайтах


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, но если на самом опенкарт так из коробки (например в оформлении заказа), то уж лучше пусть будет так, тем более работает. Но за критику спасибо, она полезная.

Надіслати
Поділитися на інших сайтах


может кому пригодится, выкладываю

в общем сам родной шаблон 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">&times;</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 адрес электронной почты было отправлено письмо со ссылкой для подтверждения.';

ну в общем все

Надіслати
Поділитися на інших сайтах

кстати на опенкарт использую отправку писем контакты, регстр, восстановл, вход через Phpmailer

если кому будет интересно выложу 

Надіслати
Поділитися на інших сайтах

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

пример из моего контройлера стр контакты

				$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 ) );
		        }

 

Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.