use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\OpenModalDialogCommand;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Symfony\Component\HttpFoundation\Response;
/**
* Implements hook_form_BASE_FORM_ID_alter(): commerce_order_item_add_to_cart_form.
* Alter "Add to cart" form.
*/
function MODULENAME_form_commerce_order_item_add_to_cart_form_alter(array &$form, FormStateInterface $form_state): void {
$product = $form_state->get('product'); /** @var ProductInterface $product */
$form['actions']['submit']['#id'] = 'add-to-cart-button-' . $product->id();
$form['actions']['submit']['#ajax'] = [
'callback' => 'MODULENAME_add_to_cart_ajax',
'event' => 'click',
'selector' => ':input[data-drupal-selector="add-to-cart-button-' . $product->id() . '"]',
];
$form['#attached']['library'][] = 'core/drupal.dialog.ajax';
}
/**
* "Add to cart" form ajax submit.
*/
function MODULENAME_add_to_cart_ajax(array &$form, FormStateInterface $form_state): Response {
// Delete status messages
\Drupal::messenger()->deleteByType(MessengerInterface::TYPE_STATUS);
// Show dialog
$response = new AjaxResponse();
$response->addCommand(new OpenModalDialogCommand('', t('Product added to cart.')));
return $response;
}
Замечание 1 - кнопкам принудительно задаётся атрибут #id
, чтобы они не конфликтовали с другими формами на странице и чтобы сгенерировать нужный html атрибут data-drupal-selector
.
Замечание 2 - в #ajax
указывается параметр selector
, чтобы кнопки нормально работали если товар выводится на странице дважды.
Написанное актуально для
Commerce 2
Комментарии
Круто!
Добавил код не в модуль а в THEMENAME.theme файл..
Работает, добавляет в корзину, но никакого сообщения или попапа в конце. Это связано с тем, что не в модуль разместил?
Не надо хранить бизнес логику в теме.
Почему? Мне так удобно и это не бизнес логика а доработка визуальной составляющей.
А тема у меня одна на все проекты, все правки, вносимые в тему касаются каждого сайта, все остальное делается в админке и ксс.
Так а почему сообщение не всплывает?
Работает для Drupal 9?
Добавить комментарий