Как мне действовать после изменения количества в корзине?


Я пишу подмодуль коммерции, который должен запускать некоторый код для позиций в заказе, когда в форме корзины покупок нажимаются кнопки Обновить корзину или Оформить заказ, но я не уверен, куда его поместить. Более конкретно, мне нужно посмотреть, обновил ли пользователь количество позиции в своей корзине, а затем написать код, который влияет на изменение количества (без использования правил).

Я уже использую 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 не загружается на следующей странице. Нахожусь ли я в нужном месте?

Спасибо!:)

Author: kiamlaluno, 2014-01-13

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);

}

Крючки для загрузки, предварительного сохранения, вставки, обновления и удаления доступны для всех типов коммерческих объектов.

 1
Author: David Thomas, 2014-01-13 09:19:10

Добро пожаловать на биржу стеков 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.
}

Ваше здоровье, Анил Сагар

 0
Author: Anil Sagar, 2014-01-13 07:16:01

Спасибо за все ваши ответы, но я сам ответил на этот вопрос. Я думаю!:)

Должно быть:

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';
 0
Author: ridgek, 2014-01-14 02:20:45