Mă cuplez Comerțul Drupal, DC adaugă în coș ajax și module volante comerciale.
Aceasta este configurația mea de vedere:
Pe mine /cart
pagina, am forma inițială (vizualizarea) pentru a schimba cantitățile, șterge articolele etc...
Am și un glisor de produs, care datorită modulului „ajax add to cart”, pot adăuga mai multe produse în coș.
Comportamentul așteptat:
- Ori de câte ori actualizez cantitatea sau elimin un articol din lista derulantă, formularul trebuie actualizat (inclusiv totalul)
- Ori de câte ori actualizez cantitatea sau elimin un articol din formular, trebuie reîncărcat flyout-ul (incluzând totalul)
- Ori de câte ori actualizez cantitatea sau elimin din glisor, trebuie să fie actualizate atât flyout-ul, cât și formularul.
În js, am încercat să le declanșez individual după ce au fost făcute clic pe butoane, apelând codul ajax personalizat pentru a reconstrui vizualizarea și flyout-ul.
/**
* Reîncărcați toată vizualizarea conținutului paginii (formular)
*/
funcția rebuildViewPanier() {
//$("#commerce_cart_form-cart-ajax-wrapper").triggerHandler("RefreshView");
$.ajax({
url: „/ajax_update_cart_panier”
}).done(funcție (date) {
dacă (date[3] !== nedefinit) {
let selector = date[3]["selector"];
let dataReplace = data[3]["data"];
let block = $(selector);
block.html($(dataReplace));
}
});
}
/**
* Cod din modulul flyout
*/
funcția rebuildBlockCart() {
let el = document.querySelector(".cart-flyout");
// Drupal.cartFlyout.createFlyout();
let settings = drupalSettings.cartFlyout;
settings.use_quantity_count = adevărat;
var model = nou Drupal.cartFlyout.CartBlockModel(settings);
Drupal.cartFlyout.models.push(model);
var view = nou Drupal.cartFlyout.CartBlockView({
el: el,
model: model
});
var offcanvasView = nou Drupal.cartFlyout.CartOffcanvasView({
el: Drupal.cartFlyout.offcanvas,
model: model
});
Drupal.cartFlyout.views.push(vizualizare);
Drupal.cartFlyout.views.push(offcanvasView);
Drupal.cartFlyout.fetchCarts();
}
Comportament real: deocamdată, acele interacțiuni între acele 3 părți ale paginii sunt așa
- Slider --> flyout :: funcționează (automat)
- Formular --> glisor :: funcționează (automat)
- Slider --> form :: KO (când îl reîncarc manual)
Și acesta este cursorul-->forma în care sunt blocat.
Formularul nu este reîncărcat (deci am făcut funcția ajax pentru a-l încărca manual).
Asa o reconstruiesc:
$view_name = "comerț_cart_form";
$display_id = "implicit";
$view = [
'#type' => 'vizualizare',
'#name' => $view_name,
'#display_id' => $display_id,
'#arguments' => [$cart_id],
'#embed' => TRUE,
];
$conținut = \Drupal::service('renderer')->render($view);
$răspuns = AjaxResponse nou();
return $response->addCommand(new ReplaceCommand('#commerce_cart_form-cart-ajax-wrapper', $content));
Formularul este reconstruit, dar pierd orice eveniment de pe butonul ajax pentru a actualiza coșul.
HTML inițial
<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 după reîncărcare:
<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">
După cum puteți vedea, folosesc toate câmpurile mele de date-drupal-form. Din această cauză, forma inițială nu o reîncarcă manual?
The triggerHandler('RefreshView') este apelat de 10 ori când este apelat (aproximativ 15/20s pentru a reîmprospăta vizualizarea, nu am avut această problemă înainte de a actualiza versiunea de bază), de aceea am decis să folosesc ajax personalizat și să reconstruiesc vizualizarea.
Folosesc cea mai recentă versiune a modulelor și folosesc drupal 9.3.7