@Spasibotebe1

Письмо обратной связи приходит через раз Jquerry AJAX. Спасите?

Создавался скрипт на opencart сайте, работал для двух дел сразу. Форма callback и покупка в один клик.
автор WebDesign Master
Сложность вопроса заключается в том что письмо о покупке в один клик приходит каждое, а вот обратный звонок callback одно письмо из 4-5.
Ломаю голову уже второй месяц, помогите отследить проблему

HTML
<footer class="main-footer">

		<div class="footer-cnt">
			<div class="container">
				<div class="row">
					
					<div class="col-md-3 col-sm-6">
						
						<div class="logo">
							<?php if ($logo){ ?>
								<a href="<?php echo $home; ?>">
									<img src="<?php echo $logo; ?>" alt="<?php echo $name; ?>" class="img-responsive"> 
								</a>
							<?php } ?>
						</div>

					</div>

					<div class="col-md-7 hidden-sm hidden-xs">

						<nav class="footer-menu">

							<?php if ($informations) { ?>
								<ul class="nav navbar-nav">
									<?php foreach ($informations as $information) { ?>
									<li><a href="<?php echo $information['href']; ?>"><?php echo $information['title']; ?></a></li>
									<?php } ?>
									<li><a href="/skidki">Скидки</a></li>
						        	<li><a href="<?php echo $contact; ?>">Контакты</a></li>
								</ul>
		        			<?php } ?>
						</nav>

					</div>

					<!--<div class="col-md-2 col-sm-6">
						
						<ul class="nav-social">
							<li><a href="https://vk.com/club152644180" rel="nofollow" target="_blank"><i class="fa fa-vk"></i></a></li>
							<li><a href="http://facebook.com" rel="nofollow" target="_blank"><i class="fa fa-facebook"></i></a></li>
							<li><a href="http://instagram.com" rel="nofollow" target="_blank"><i class="fa fa-instagram"></i></a></li>
						</ul>
					</div>-->
				</div>
			</div>
		</div>
		
		<div class="footer-phone">
			
			<div class="container">
				<div class="col-sm-12">
					<div class="site-phone_wrap">
						<div class="site-phone">
							<a href="<?php echo $contact; ?>"><?php echo $telephone; ?></a>
						</div>
						<a href="#callback" class="callback">Заказать Звонок!</a>
					</div>
				</div>
			</div>

		</div>
	</footer>
	
	<div id="callback" class="callback-form product-popup">
		<h2>Заказать Звонок</h2>
		<p>Введите номер телефона и наш менеджер перезвонит Вам в течении <strong>15 минут</strong>.</p>
		<form class="ajax-form">
			<!-- Hidden Required Fields -->
			<input type="hidden" name="project_name" value="EtolShop">
			<input type="hidden" name="admin_email" value="admin@etolshop.com.ua">
			<input type="hidden" name="form_subject" value="Заявка с сайта ETOLSHOP">
			<!-- END Hidden Required Fields -->

			<input class="form-control" type="text" name="Телефон" placeholder="Введите Ваш телефон..." required>
			<button class="btn-primary">Заказать</button>

		</form>
		<div class="success">Спасибо за заявку!</div>
	</div>


</body>
</html>

javascript
$(function () {

	// Купить в один клик
	$('.product-layout > .product-thumb').each(function (e) {

		e +=1;

		var img_url = $(this).find('.img-responsive').attr('src'),
			item_name = $(this).find('h4 a').text(),
			item_price = $(this).find('.price').html(),
			admin = $('#callback [name=admin_email]').val();

	$(this).after('\
		<div id="pp-item-' + e + '" class="product-popup">\
			<h2>Купить в один клик</h2>\
			<div class="pp-img-wrap"><img src="' + img_url + '" alt="EtolShop"></div>\
			<div class="pp-content">\
				<h3>' + item_name + '</h3>\
				<p>' + item_price +'</p>\
				<form class="ajax-form">\
					<input type="hidden" name="project_name" value="EtolShop">\
					<input type="hidden" name="admin_email" value="' + admin + '">\
					<input type="hidden" name="form_subject" value="Заявка с сайта ETOLSHOP">\
					<input type="hidden" name="Продукт" value="' + item_name + '">\
					<input class="form-control" type="text" name="Телефон" placeholder="Введите Ваш телефон..." required>\
					<button class="btn-primary">Заказать</button>\
				</form>\
				<div class="success">Спасибо за заявку!</div>\
			</div>\
		</div>')

		$(this).find('.button-group').append('<a class="button toclick" href="#pp-item-' + e + '">Купить в один клик</a>');
	$(this).parent().attr({
		'class' : 'product-layout col-lg-4 col-md-4 col-sm-6 col-xs-12'
	})

	});

$('.product-thumb h4').css('height', '').equalHeights();

$('.toclick, .callback').magnificPopup({
	mainClass: 'mfp-zoom-in',
	removalDelay: 500
	});

//E-mail Ajax Send
	$(".ajax-form").submit(function() {
		var th = $(this);
		$.ajax({
			type: "POST",
			url: "catalog/view/theme/apple/mail.php",
			data: th.serialize()
		}).done(function() {
			var pp_suc = th.closest('.product-popup').find('.success');
			pp_suc.fadeIn();
			setTimeout(function() {
				th.trigger("reset");
				pp_suc.fadeOut();
				$.magnificPopup.close();
			}, 2000);
		});
		return false;
	});

});

PHP
<?php
 
$method = $_SERVER['REQUEST_METHOD'];
 
//Script Foreach
$c = true;
if ( $method === 'POST' ) {
 
  $project_name = trim($_POST["project_name"]);
  $admin_email  = trim($_POST["admin_email"]);
  $form_subject = trim($_POST["form_subject"]);
 
  foreach ( $_POST as $key => $value ) {
    if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) {
      $message .= "
      " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . "
        <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
        <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
      </tr>
      ";
    }
  }
} else if ( $method === 'GET' ) {
 
  $project_name = trim($_GET["project_name"]);
  $admin_email  = trim($_GET["admin_email"]);
  $form_subject = trim($_GET["form_subject"]);
 
  foreach ( $_GET as $key => $value ) {
    if ( $value != "" && $key != "project_name" && $key != "admin_email" && $key != "form_subject" ) {
      $message .= "
      " . ( ($c = !$c) ? '<tr>':'<tr style="background-color: #f8f8f8;">' ) . "
        <td style='padding: 10px; border: #e9e9e9 1px solid;'><b>$key</b></td>
        <td style='padding: 10px; border: #e9e9e9 1px solid;'>$value</td>
      </tr>
      ";
    }
  }
}
 
$message = "<table style='width: 100%;'>$message</table>";
 
function adopt($text) {
  return '=?UTF-8?B?'.Base64_encode($text).'?=';
}
 
$headers = "MIME-Version: 1.0" . PHP_EOL .
"Content-Type: text/html; charset=utf-8" . PHP_EOL .
'From: '.adopt($project_name).' <'.$admin_email.'>' . PHP_EOL .
'Reply-To: '.$admin_email.'' . PHP_EOL;
 
mail($admin_email, adopt($form_subject), $message, $headers );


Единственное к чему я пришел, нашел логи почты в которых ошибка при недоставленном сообщении такая:
[Sat Feb 29 22:22:09 2020] [error] [client 77.222.156.194] PHP Warning: mail(): Could not execute mail delivery program '/usr/sbin/sendmail -t -i -f admin@etolshop.com.ua' in /var/www/lllpam/data/www/etolshop.com.ua/catalog/view/theme/apple/mail.php on line 52, referer: https://etolshop.com.ua/

Так же заметил что при отправке формы callback в консоли network "mail.php отправляется 2 раза, а при отправке покупка в один клик, один раз, может ли это вызывать проблему? mail.php отправляет jquerry? Проблема в нем?
5e5b780a01de1065595706.jpeg
5e5b7813c6fa2405070204.jpeg

За решение вопроса ждет награда, в размере 500 чеканных монет РФ
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
@Spasibotebe1 Автор вопроса
Вообщем разобрался я, проблема была действительно в отправке двух переменных mail.php
Из за того что в header.tpl скрипт ajax (theme.js) был подключен после переменной <?php foreach ($scripts as $script) { ?>
из за этого происходил казус
он не укладывался в 50 мс и отправлялся 2 РАЗА методом POST, от чего у sendmail случайно случался инсульт и он либо писал ошибку sendmail либо приходило одно письмо.
Проблема в том что к массиву sendmail обращались 2 раза СРАЗУ и он отвечал отказом в обе стороны.
Решением оказалось передвинуть вызов скрипта в header.tpl в самый верх.
2 месяца Карл.... Я ушел бухать...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimonchik2013
@dimonchik2013
non progredi est regredi
500 чеканных монет РФ
золотом?

смотреть надо в логи и исключительно в логи
1) воспроизвести проблему на уровне Постмана
2) решить проблему
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы