Как мне действовать после изменения количества в корзине?
Я пишу подмодуль коммерции, который должен запускать некоторый код для позиций в заказе, когда в форме корзины покупок нажимаются кнопки Обновить корзину или Оформить заказ, но я не уверен, куда его поместить. Более конкретно, мне нужно посмотреть, обновил ли пользователь количество позиции в своей корзине, а затем написать код, который влияет на изменение количества (без использования правил).
Я уже использую hook_form_FORM_ID_alter()
для изменения кнопок удаления в корзине покупок, я подумал, что я мог бы просто добавить обработчик отправки в этот хук, но это, похоже, не работает.
function MYMODULE_form_views_form_commerce_cart_form_default_alter(&$form, &$form_state) {
$form['#submit'][] = 'MYMODULE_cart_submit';
}
function MYMODULE_cart_submit($form, &$form_state) {
dsm($form);
}
Когда я нажимаю кнопку Обновить корзину или Оформить заказ, dsm не загружается на следующей странице. Нахожусь ли я в нужном месте?
Спасибо!:)
3 answers
Вы можете использовать крючки типа API сущности (загрузка, предварительное сохранение, обновление и т. Д.), Чтобы действовать, когда commerce_line_item
обновляется
Например:
/**
* Implements hook_entity_update
*/
function MYMODULE_entity_update($entity, $type){
if($type == 'commerce_line_item'){
// Do stuff with line item in $entity;
}
}
У вас может быть доступ к $entity->unchanged
или аналогичному в $entity
, в котором хранится содержимое сущности до сохранения. Полезно для сравнения количества, чтобы увидеть, изменилось ли оно!
dpm($entity); // for details.
Вы также можете использовать hook_ENTITY_TYPE_update
/**
* Implements hook_ENTITY_TYPE_update
*/
function MYMODULE_commerce_line_item_update($entity){
dpm($entity);
}
Крючки для загрузки, предварительного сохранения, вставки, обновления и удаления доступны для всех типов коммерческих объектов.
Добро пожаловать на биржу стеков Drupal!
Если вы хотите обнаружить изменения в заказах корзины или позициях, я полагаю, что вы можете использовать нижеприведенные крючки, которые отображаются модулем корзины.
/**
* Rules event hook: allows modules to react to the addition of a product to a
* shopping cart order.
*
* @param $order
* The cart order object the product was added to.
* @param $product
* The product that was added to the cart.
* @param $quantity
* The quantity of the product added to the cart.
* @param $line_item
* The new or updated line item representing that product on the given order.
*/
function hook_commerce_cart_product_add($order, $product, $quantity, $line_item) {
// No example.
}
/**
* Rules event hook: allows modules to react to the removal of a product from a
* shopping cart order.
*
* @param $order
* The cart order object the product was removed from.
* @param $product
* The product that was removed from the cart.
* @param $quantity
* The quantity of the product line item removed from the cart.
* @param $line_item
* The product line item that was deleted to remove the product from the cart.
*/
function hook_commerce_cart_product_remove($order, $product, $quantity, $line_item) {
// No example.
}
Ваше здоровье, Анил Сагар
Спасибо за все ваши ответы, но я сам ответил на этот вопрос. Я думаю!:)
Должно быть:
function MYMODULE_form_views_form_commerce_cart_form_default_alter(&$form, &$form_state) {
$form['#validate'][] = 'MYMODULE_cart_validate';
$form['actions']['submit']['#submit'][] = 'MYMODULE_cart_update';
$form['actions']['checkout']['#submit'][] = 'MYMODULE_cart_checkout';
}
function MYMODULE_cart_validate($form, &$form_state) {
dsm('Form validated');
}
function MYMODULE_cart_update($form, &$form_state) {
dsm('Update Cart button pressed');
}
function MYMODULE_cart_checkout($form, &$form_state) {
dsm('Checkout button pressed');
}
Итак, я предполагаю, что теперь мой вопрос заключается в том, почему обычный обработчик отправки не работает?
$form['#submit'][] = 'MYMODULE_cart_submit';