Отключить продукт, когда он отсутствует

Я хотел бы отключить продукт, как только он упадет до 0 в торговле Drupal.

Я думаю, что это возможно с помощью правил, но тогда я не знаю, что произойдет с отображением продукта. Я полагаю, что, когда на дисплее продукта больше нет активных продуктов, дисплей по-прежнему будет отображаться в моих представлениях, но без какой-либо информации о продукте, прикрепленной к нему. В этом случае мне также хотелось бы, чтобы дисплей продукта был «неопубликованным».

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

Может ли кто-нибудь помочь мне достичь этого с помощью правил или есть какой-то другой метод, который я мог бы использовать?

Я использую Drupal Commerce и модуль запаса для него.

5 голосов | спросил Mike 13 J0000006Europe/Moscow 2012, 21:54:16

2 ответа


4

Кажется действительно странным, что сопровождающий сказал бы, что это невозможно и случайный случай.

Мне кажется, что это очень нормальный прецедент, фактически тот, который мы используем на каждом сайте Ubercart, который у нас есть на производстве. Я действительно думал, что это была настройка на странице конфигурации модуля, и был удивлен, увидев, что это не так.

В любом случае, вот что я сделал. Я отключил включенное правило, потому что я презираю правила и добавил этот код в свой модуль:

/**
 * Implements hook_commerce_checkout_complete().
 */
function MYMODULE_commerce_checkout_complete($order) {
  $order_wrapper = entity_metadata_wrapper('commerce_order', $order);
  $line_items = $order_wrapper->commerce_line_items->value();
  if (is_array($line_items)) {
    foreach ($line_items as $line_item) {
      if (in_array($line_item->type, commerce_product_line_item_types())) {
        $product = commerce_product_load_by_sku($line_item->line_item_label);

        // Subtract the sold amount from the available stock level.
        $qty = (int) $line_item->quantity;
        module_load_include('inc', 'commerce_stock', 'commerce_stock.rules');
        commerce_stock_adjust($product, -$qty);

        // Disable the product if we have no stock left
        $product_wrapper = entity_metadata_wrapper('commerce_product', $product);
        if ($product_wrapper->commerce_stock->value() <= 0) {
          $product_wrapper->status->set(0);
          $result = $product_wrapper->save();

          if ($result) {
            watchdog('commerce_stock', 'Product %sku stock level reached 0, status set to 0.', array('%sku' => $product->sku));
          }
          else {
            watchdog('commerce_stock', 'Failed attempt to disable product %sku', array('%sku' => $product->sku), WATCHDOG_ERROR);
          }
        }
      }   
    }
  }
}

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

Я думаю, вы могли бы оставить правило по умолчанию активным и удалить 3 строки, которые корректируют уровень запаса в моем примере, но тогда я не уверен, что вы бы назвали первым, это правило или мой крючок, поэтому вам придется протестировать что вы сами.

ответил TwiiK 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 24 Sep 2012 16:33:04 +0400 2012, 16:33:04
4

Вот довольно общее правило, которое отключает SKU продукта, когда товар попадает на 0:

{ "rules_out_of_stock" : {
"LABEL" : "Out of Stock",
"PLUGIN" : "reaction rule",
"REQUIRES" : [ "rules", "entity" ],
"ON" : [ "commerce_product_presave" ],
"IF" : [
  { "entity_is_of_type" : { "entity" : [ "commerce-product" ], "type" : "commerce_product" } },
  { "data_is" : { "data" : [ "commerce-product:commerce-stock" ], "value" : "0" } }
],
"DO" : [
  { "data_set" : { "data" : [ "commerce-product:status" ], "value" : 0 } }
]}}
ответил akalata 18 +04002012-10-18T19:57:44+04:00312012bEurope/MoscowThu, 18 Oct 2012 19:57:44 +0400 2012, 19:57:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132