я связываюсь Друпал коммерция, DC добавить в корзину ajax и коммерческие всплывающие модули.
Это моя конфигурация просмотра:
На моем /корзина
страница, у меня есть исходная форма (представление), чтобы изменить количество, удалить элементы и т.д...
У меня также есть ползунок товара, который благодаря модулю «ajax добавить в корзину» позволяет добавить в корзину несколько товаров.
Ожидаемое поведение:
- Всякий раз, когда я обновляю количество или удаляю элемент из всплывающего меню, необходимо обновить форму (включая общую сумму)
- Всякий раз, когда я обновляю количество или удаляю элемент из формы, всплывающее окно необходимо перезагружать (включая общее количество)
- Всякий раз, когда я обновляю количество или удаляю из ползунка, необходимо обновить как всплывающее окно, так и форму.
В js я пытался запускать их по отдельности после нажатия кнопок, вызывая собственный код ajax для восстановления представления и всплывающего меню.
/**
* Перезагрузить все представление содержимого страницы (форма)
*/
функция перестроитьViewPanier() {
//$("#commerce_cart_form-cart-ajax-wrapper").triggerHandler("RefreshView");
$.ajax({
URL-адрес: "/ajax_update_cart_panier"
}).done(функция (данные) {
если (данные [3] !== не определено) {
пусть селектор = данные[3]["селектор"];
пусть dataReplace = данные [3] ["данные"];
пусть блок = $ (селектор);
block.html($(dataReplace));
}
});
}
/**
* Код из всплывающего модуля
*/
функция перестроитьBlockCart() {
let el = document.querySelector(".cart-flyout");
// Drupal.cartFlyout.createFlyout();
пусть настройки = drupalSettings.cartFlyout;
settings.use_quantity_count = истина;
модель var = новый Drupal.cartFlyout.CartBlockModel(настройки);
Drupal.cartFlyout.models.push(модель);
var view = новый Drupal.cartFlyout.CartBlockView({
эль: эль,
модель: модель
});
var offcanvasView = новый Drupal.cartFlyout.CartOffcanvasView({
эл.: Drupal.cartFlyout.offcanvas,
модель: модель
});
Drupal.cartFlyout.views.push(просмотр);
Drupal.cartFlyout.views.push(offcanvasView);
Drupal.cartFlyout.fetchCarts();
}
Фактическое поведение: на данный момент эти взаимодействия между этими 3 частями страницы выглядят так:
- Ползунок --> всплывающее окно :: работает (автоматически)
- Форма --> слайдер :: работает (автоматически)
- Slider --> form :: KO (когда перезагружаю вручную)
И это ползунок -> форма, где я застрял.
Форма не перезагружается (поэтому я сделал функцию ajax, чтобы загрузить ее вручную).
Вот как я его перестраиваю:
$view_name = "commerce_cart_form";
$display_id = "по умолчанию";
$ вид = [
'#тип' => 'вид',
'#имя' => $view_name,
'#display_id' => $display_id,
'#arguments' => [$cart_id],
'#embed' => ИСТИНА,
];
$content = \Drupal::service('renderer')->render($view);
$response = новый AjaxResponse();
return $response->addCommand(new ReplaceCommand('#commerce_cart_form-cart-ajax-wrapper', $content));
Форма перестроена, но я теряю любое событие на кнопке ajax для обновления корзины.
Исходный HTML
<form data-drupal-selector="views-form-commerce-cart-form-default-26" action="/cart" method="post"
id="views-form-commerce-cart-form-default-26" accept-charset="UTF-8" data-once="form-updated"
data-drupal-form-fields="edit-dc-ajax-add-cart-views-edit-quantity-0,edit-remove-button-0,edit-dc-ajax-add-cart-views-edit-quantity-1,edit-remove-button-1,edit-dc-ajax-add-cart-views-edit-quantity-2,edit-remove-button-2,edit-dc-ajax-add-cart-views-edit-quantity-3,edit-remove-button-3,edit-dc-ajax-add-cart-views-edit-quantity-4,edit-remove-button-4,edit-coupon-redemption-code,edit-coupon-redemption-apply,edit-submit,edit-checkout">
HTML после перезагрузки:
<form data-drupal-selector="views-form-commerce-cart-form-default-26" action="/ajax_update_cart_panier" method="post" id="views-form-commerce-cart-form-default-26" accept-charset="UTF-8">
Как видите, я использую все свои поля данных drupal-form. Из-за этого начальная форма не перезагружается вручную?
триггерHandler('Обновить вид') вызывается примерно 10 раз, когда он вызывается (около 15/20 секунд, чтобы обновить представление, не было этой проблемы до обновления основной версии), поэтому я решил использовать собственный ajax для перестроения представления.
Я использую последнюю версию модулей и использую drupal 9.3.7.