Рейтинг:1

События удаления коммерческого заказа и удаления элемента заказа

флаг cn

Быстрый вопрос, я надеюсь, что кто-то может легко ответить.

Здесь перечислены два события заказа для удаления заказа: https://github.com/drupalcommerce/commerce/blob/8.x-2.x/modules/order/src/Event/OrderEvents.php

commerce_order.commerce_order.delete

и

commerce_order.commerce_order_item.delete

Я хочу удалить некоторые связанные объекты при удалении строки заказа, поэтому я могу подключиться к commerce_order.commerce_order_item.delete, но мой вопрос в том, что если весь заказ удален, это событие также будет запускаться для каждой отдельной строки, или мне нужно повторить мой код также для commerce_order.commerce_order.delete и перебирать каждую строку в заказе?

No Sssweat avatar
флаг ua
Что ж... есть один способ узнать, думаешь ли ты о том же, что и я?
Рейтинг:2
флаг cn

если весь заказ удален, это событие также будет запускаться для каждой отдельной строки

Да, будет — объект коммерческого заказа имеет постУдалить метод, который перебирает элементы заказа и удаляет их один за другим

общедоступная статическая функция postDelete(EntityStorageInterface $storage, массив $entities) {
  parent::postDelete($storage, $entities);

  // Удалить позиции удаленного заказа.
  $order_items = [];
  /** @var \Drupal\commerce_order\Entity\OrderInterface $entity */
  foreach ($entities как $entity) {
    foreach ($entity->getItems() как $order_item) {
      $order_items[$order_item->id()] = $order_item;
    }
  }
  /** @var \Drupal\commerce_order\OrderItemStorageInterface $order_item_storage */
  $order_item_storage = \Drupal::service('entity_type.manager')->getStorage('commerce_order_item');
  $order_item_storage->удалить($order_items);
}

Удаление элемента заказа вызовет событие, на которое вы подписаны, поэтому больше ничего делать не нужно.

thiokol avatar
флаг cn
Отлично, большое спасибо.
thiokol avatar
флаг cn
У меня все это работает, но у меня есть другая проблема, я не забыл, что commerce_order.commerce_order_item.delete запускается не только при удалении строки заказа, но и при простом удалении товара из корзины. Есть ли разница между удалением строки из выполненного заказа и удалением товара из корзины с точки зрения события подписки? есть ли другое событие, которое я должен использовать вместо этого?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.