Task 6991 | Вывод инфо об отслеживании в заказах

pull/36/head
parent bb66bcdacf
commit de7d2f0bd0
  1. 32
      wp-content/themes/cosmopet/global-functions/multilang-functions.php
  2. 155
      wp-content/themes/cosmopet/modules/forms/assets/js/form.js
  3. 1
      wp-content/themes/cosmopet/modules/forms/module-ajax-controller.php
  4. 4
      wp-content/themes/cosmopet/modules/profile/assets/css/profile.css
  5. 118
      wp-content/themes/cosmopet/modules/profile/components/profile/component-controller.php
  6. 34
      wp-content/themes/cosmopet/modules/shop/components/checkout/assets/js/script.js
  7. 6
      wp-content/themes/cosmopet/modules/shop/module-ajax-controller.php
  8. 9
      wp-content/themes/cosmopet/static/css/front-page.css
  9. 6
      wp-content/themes/cosmopet/templates/footer.twig
  10. 8
      wp-content/themes/cosmopet/templates/profile/order-list.twig

@ -143,6 +143,33 @@ add_action('init', function () {
],
'group' => 'General',
],
[
'name' => 'Соглашение о конфиденциальности',
'string' => 'Соглашение о конфиденциальности',
'translations' => [
'ru' => 'Соглашение о конфиденциальности',
'en' => 'Privacy policy',
],
'group' => 'General',
],
[
'name' => 'Декларация соответствия корма',
'string' => 'Декларация соответствия корма',
'translations' => [
'ru' => 'Декларация соответствия корма',
'en' => 'Declaration of conformity of feed',
],
'group' => 'General',
],
[
'name' => 'Декларация соответствия лакомств',
'string' => 'Декларация соответствия лакомств',
'translations' => [
'ru' => 'Декларация соответствия лакомств',
'en' => 'Declaration of conformity of treats',
],
'group' => 'General',
],
[
'name' => 'Чат бот с ветеринаром',
'string' => 'Чат бот с ветеринаром',
@ -1771,8 +1798,8 @@ pll_register_string('Запомнить меня', 'Запомнить меня'
// Регистрируем строковые переводы для динамической подстановки в js
// Регистрируем строковые переводы для динамической подстановки в JS
/* TO_DO: переделать под ppl_e() */
add_action('wp_head', function () {
if (function_exists('pll_current_language')) {
$lang = pll_current_language();
@ -1815,6 +1842,7 @@ add_action('wp_head', function () {
$current_translations = $translations[$lang] ?? $translations['en'];
?>
<? // GP | Обращаемся из wp-content/themes/cosmopet/modules/forms/assets/js/form.js ?>
<script>
window.langData = {
currentLang: "<?php echo esc_js($lang); ?>",

@ -1,89 +1,98 @@
jQuery(document).ready(function($) {
jQuery(document).ready(function ($) {
$('.form-process, .modal__form-sub').on('submit', function (event) {
event.preventDefault();
let $form = $(this);
let formClass = $form.attr('class');
let action = $form.attr('action');
let formData = $form.serialize();
if (!validateForm(this)) return;
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: action,
formData: formData
},
beforeSend: function () {
// Если нужна специфическая логика перед отправкой
},
success: function (response) {
if ($form.hasClass('form-process')) {
closeModals();
showModal('mform-success');
event.preventDefault();
let $form = $(this);
let formClass = $form.attr('class');
let action = $form.attr('action');
let formData = $form.serialize();
if (!validateForm(this)) return;
// TO_DO: переделать на window.ajax_url
$.ajax({
type: 'POST',
url: woocommerce_params.ajax_url,
data: {
action: action,
formData: formData
},
beforeSend: function () {
// Если нужна специфическая логика перед отправкой
},
success: function (response) {
if ($form.hasClass('form-process')) {
closeModals();
showModal('mform-success');
}
},
complete: function (response) {
if ($form.hasClass('modal__form-sub')) {
let email = $form.find('input[name="email"]').val();
$('.modal__to-know').removeClass('active');
$('#sub-result-email').html(email);
$('.modal__to-know-submit').addClass('active').css('filter', 'blur(0px)');
}
}
},
complete: function (response) {
if ($form.hasClass('modal__form-sub')) {
let email = $form.find('input[name="email"]').val();
$('.modal__to-know').removeClass('active');
$('#sub-result-email').html(email);
$('.modal__to-know-submit').addClass('active').css('filter', 'blur(0px)');
}
}
});
});
});
});
const t = window.langData?.translations || {};
function validateForm(form) {
clearErrorMessages(form);
let validated = true;
/**
*
* Start: Валидация форм (футер, регистрация, подписка "Отсутсвует товар" в блоге и т.д.)
* Переводы ошибок регистрирубтся в wp-content/themes/cosmopet/global-functions/multilang-functions.php
*
*/
const pllTranslationsFromWindow = window.langData?.translations || {};
const nameInput = form.querySelector('input[name="name"]');
if (nameInput && !nameInput.value.trim()) {
showError(nameInput, t.name_required);
validated = false;
}
function validateForm(form) {
clearErrorMessages(form);
let validated = true;
const nameInput = form.querySelector('input[name="name"]');
if (nameInput && !nameInput.value.trim()) {
showError(nameInput, pllTranslationsFromWindow.name_required);
validated = false;
}
const emailInput = form.querySelector('input[name="email"]');
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (emailInput && !emailPattern.test(emailInput.value.trim())) {
showError(emailInput, t.email_invalid);
validated = false;
}
const emailInput = form.querySelector('input[name="email"]');
const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (emailInput && !emailPattern.test(emailInput.value.trim())) {
showError(emailInput, pllTranslationsFromWindow.email_invalid);
validated = false;
}
const phoneInput = form.querySelector('input[name="phone"]');
const phonePattern = /^\+?\d{10,15}$/;
if (phoneInput && !phonePattern.test(phoneInput.value.trim())) {
showError(phoneInput, pllTranslationsFromWindow.phone_invalid);
validated = false;
}
const phoneInput = form.querySelector('input[name="phone"]');
const phonePattern = /^\+?\d{10,15}$/;
if (phoneInput && !phonePattern.test(phoneInput.value.trim())) {
showError(phoneInput, t.phone_invalid);
validated = false;
}
return validated;
}
return validated;
}
// Функция для отображения сообщения об ошибке
function showError(input, message) {
const errorMessage = document.createElement('div');
errorMessage.className = 'error-message';
errorMessage.textContent = message;
input.insertAdjacentElement('afterend', errorMessage);
}
// Функция для отображения сообщения об ошибке
function showError(input, message) {
const errorMessage = document.createElement('div');
errorMessage.className = 'error-message';
errorMessage.textContent = message;
input.insertAdjacentElement('afterend', errorMessage);
}
// Функция для очистки сообщений об ошибках внутри конкретной формы
function clearErrorMessages(form) {
const errorMessages = form.querySelectorAll('.error-message');
errorMessages.forEach(errorMessage => {
errorMessage.remove();
});
}
// Функция для очистки сообщений об ошибках внутри конкретной формы
function clearErrorMessages(form) {
const errorMessages = form.querySelectorAll('.error-message');
errorMessages.forEach(errorMessage => {
errorMessage.remove();
});
}
/* End: Валидация форм (футер, регистрация, подписка "Отсутсвует товар" в блоге и т.д.) */
});

@ -2,6 +2,7 @@
require_once 'module-controller.php';
/* Вынести в FormHandler */
function get_current_user_data(){
if (is_user_logged_in()) {
$user_id = get_current_user_id();

@ -2639,4 +2639,8 @@ padding-left: 5px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.cabinet-card__button.cabinet-card-order-detail-main__link{
max-width: max-content;
}

@ -65,124 +65,6 @@ $context['bot_username'] = defined('BOT_USERNAME') ? BOT_USERNAME : '';
$current_user_id = get_current_user_id();
$context['current_user_id'] = $current_user_id;
// Запрос для питомцев
// if ($current_user_id) {
// $args = [
// 'post_type' => 'pets',
// 'meta_query' => [
// [
// 'key' => 'user',
// 'value' => $current_user_id,
// 'compare' => '='
// ]
// ]
// ];
// $pets = Timber::get_posts($args);
// // Обработка ACF-полей для каждого питомца
// foreach ($pets as &$pet) {
// // ACF-поля
// $pet->weight = get_field('weight', $pet->ID);
// $pet->old = get_field('old', $pet->ID);
// $pet->activity = get_field('activity', $pet->ID);
// // Перевод веса
// switch ($pet->weight) {
// case 'below_1_5':
// $pet->weight_text = __('from 0,5 kg to 1,5 kg', 'woodmart');
// break;
// case '1_5-3':
// $pet->weight_text = __('from 1.5 to 3 kg', 'woodmart');
// break;
// case '3-5':
// $pet->weight_text = __('from 3 to 5 kg', 'woodmart');
// break;
// case '5-8':
// $pet->weight_text = __('from 5 to 8 kg', 'woodmart');
// break;
// case '8-11':
// $pet->weight_text = __('from 8 to 11 kg', 'woodmart');
// break;
// case '11-15':
// $pet->weight_text = __('from 11 to 15 kg', 'woodmart');
// break;
// case '15-20':
// $pet->weight_text = __('from 15 to 20 kg', 'woodmart');
// break;
// case '20-25':
// $pet->weight_text = __('from 20 to 25 kg', 'woodmart');
// break;
// case '25-35':
// $pet->weight_text = __('from 25 to 35 kg', 'woodmart');
// break;
// case 'more_35':
// $pet->weight_text = __('More than 35 kg', 'woodmart');
// break;
// default:
// $pet->weight_text = '';
// }
// // Перевод возраста
// switch ($pet->old) {
// case 'normal':
// $pet->old_text = __('Adult (from 1 year to 7 years)', 'woodmart');
// break;
// case 'old':
// $pet->old_text = __('Elderly (from 7 to 12 years)', 'woodmart');
// break;
// case 'very_old':
// $pet->old_text = __('Aging (12 years and older)', 'woodmart');
// break;
// case 'baby':
// $pet->old_text = __('Baby (from 0 to 1 year)', 'woodmart');
// break;
// default:
// $pet->old_text = '';
// }
// // Перевод активности
// switch ($pet->activity) {
// case 'low':
// $pet->activity_text = __('Low', 'woodmart');
// break;
// case 'moderate':
// $pet->activity_text = __('Moderate', 'woodmart');
// break;
// case 'high':
// $pet->activity_text = __('High', 'woodmart');
// break;
// default:
// $pet->activity_text = '';
// }
// }
// $context['pets'] = $pets;
// }
// Месяцы для локализации
$context['months'] = [
__('january', 'woodmart'),
__('february', 'woodmart'),
__('march', 'woodmart'),
__('april', 'woodmart'),
__('may', 'woodmart'), // Исправлено 'mail' на 'may'
__('june', 'woodmart'),
__('july', 'woodmart'),
__('august', 'woodmart'),
__('september', 'woodmart'),
__('october', 'woodmart'),
__('november', 'woodmart'),
__('december', 'woodmart'),
];
if ($orders_pg){
Timber::render('profile/profile-orders.twig', $context);
}

@ -1,18 +1,15 @@
jQuery(document).ready(function($) {
// =====================
// Перевод строк
// =====================
// currentTranslations должен быть определен глобально из PHP или другого JS
// Пример:
// var currentTranslations = translations[language];
// =====================
// Обновление методов доставки
// =====================
/**
* Start: Костыль - обновление доставки
* Необходимый костыль чтоб в кастомной верстке работало обновление полей доставки
* на базе стандартного события от Woo - updated_checkout
*
*/
var currentTranslations = window.langData.translations
$(document.body).on('updated_checkout', function() {
$(document.body).on('updated_checkout', function () { //
var shippingMethodsHtml = $('.woocommerce-checkout-review-order-table .woocommerce-shipping-methods').html();
if (!shippingMethodsHtml) {
@ -28,6 +25,9 @@ jQuery(document).ready(function($) {
$('.order-contacts__delivery').addClass('loading');
});
/* End: Костыль - обновление доставки */
// =====================
// Обработка клика по ПВЗ
// =====================
@ -108,13 +108,18 @@ jQuery(document).ready(function($) {
});
});
// =====================
// Обработка ошибок формы чекаута
// =====================
/**
* Start: Костыль - валидация форм оформления заказа
*
* Скрыли плашку '.woocommerce-error li' и из нее забираем текст ошибки,
* а потом используем для вывода
*
*/
$(document.body).on('checkout_error', function () {
$('.form-input__error').removeClass('active');
$('.woocommerce-error li').each(function () {
$('.woocommerce-error li').each(function () {
var errorMessage = $(this).text().trim();
var fieldKey = $(this).data('id');
@ -158,6 +163,7 @@ jQuery(document).ready(function($) {
}
});
});
/* End: Костыль - валидация форм оформления заказа */
// =====================
// Удаление купона

@ -1,5 +1,6 @@
<?php
/* Страница Checkout */
add_action( 'wp_ajax_apply_coupon', 'custom_apply_coupon' );
add_action( 'wp_ajax_nopriv_apply_coupon', 'custom_apply_coupon' );
@ -21,6 +22,9 @@ function custom_apply_coupon() {
}
/* Работа с корзиной */
/**
* Обработчик AJAX для обновления количества товара в корзине
*/
@ -114,7 +118,7 @@ function get_cart_fragment_handler() {
/**
* Инициализация WooCommerce AJAX
* Передача на фронт в JS-объект woocommerce_params параметров для работы с WooCommerce
*/
add_action('wp_enqueue_scripts', 'enqueue_woocommerce_ajax_scripts');
function enqueue_woocommerce_ajax_scripts() {

@ -7,7 +7,7 @@
background: var(--radial);
}
.home .container{
padding: 77px 30px 245px;
padding: 177px 30px 245px;
position: relative;
}
@ -3336,6 +3336,7 @@ color: #f4f1f0;
.invisible {
visibility: hidden;
position: absolute;
}
@ -3561,7 +3562,11 @@ color: #f4f1f0;
@media (min-width: 769px) and (max-width: 1200px) {
.home .container {
padding: 0px 30px 180px !important;
padding: 177px 30px 180px !important;
}
.home {
overflow: hidden;
height: 85vh;
}
.reviews_item .swiper-fade .swiper-slide {
width:100%!important;

@ -81,9 +81,9 @@
</li>
{% endfor %}
</ul>
<a href="/privacy-policy/" class="footer-about__text" target="_blank">Соглашение о конфиденциальности</a>
<a href="/wp-content/uploads/2025/06/declaration_korm.pdf" class="footer-about__text" target="_blank">Декларация соответствия корма</a>
<a href="/wp-content/uploads/2025/06/declaration_lakomstva.pdf" class="footer-about__text" target="_blank">Декларация соответствия лакомств</a>
<a href="/privacy-policy/" class="footer-about__text" target="_blank">{{ function('pll_e', 'Соглашение о конфиденциальности') }}</a>
<a href="/wp-content/uploads/2025/06/declaration_korm.pdf" class="footer-about__text" target="_blank">{{ function('pll_e', 'Декларация соответствия корма') }}</a>
<a href="/wp-content/uploads/2025/06/declaration_lakomstva.pdf" class="footer-about__text" target="_blank">{{ function('pll_e', 'Декларация соответствия лакомств') }}</a>
</div>
{% endif %}

@ -1,5 +1,7 @@
{% if customer_orders %}
{% for order in customer_orders %}
{% set order_track = order.get_meta('order_data').number|default('') %}
{% set meta_data = order.meta_data.order_data %}
{% set shipping_address = order.get_address('shipping') %}
<div class="cabinet-card cabinet-card--grey">
@ -17,7 +19,6 @@
</div>
<div class="cabinet-card-order__bottom">
<div class="cabinet-card-order__content">
{% set order_track = meta_data.order_number|default('') %}
<div class="cabinet-card-order__block-detail">
<div class="cabinet-card-order__detail">
<div class="cabinet-card-order-detail__address">
@ -48,14 +49,15 @@
</div>
{% endfor %}
</div>
<div class="cabinet-card-order-detail-main__links">
</div>
<div class="cabinet-card-order-detail-main__links">
{% if order_track %}
<a href="https://www.cdek.ru/ru/tracking/?order_id={{ order_track }}" target="_blank" class="cabinet-card__button cabinet-card-order-detail-main__link">
{{ function('pll_e', 'Track order') }}
</a>
{% endif %}
</div>
</div>
</div>
</div>
<button class="cabinet-card-order__open-detail">{{ function('pll_e', 'Order details') }}</button>

Loading…
Cancel
Save