Skip to content

Commit 5a48bc0

Browse files
committed
Issue #2982198 by bojanz: Add order-level product/product_type/variation_type conditions
1 parent 90354a6 commit 5a48bc0

16 files changed

+593
-144
lines changed

modules/product/config/schema/commerce_product.schema.yml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
commerce.commerce_condition.plugin.order_item_product:
1+
commerce.commerce_condition.plugin.order_product:
22
type: commerce_condition_configuration
33
mapping:
44
products:
@@ -10,7 +10,10 @@ commerce.commerce_condition.plugin.order_item_product:
1010
product_id:
1111
type: integer
1212

13-
commerce.commerce_condition.plugin.order_item_product_type:
13+
commerce.commerce_condition.plugin.order_item_product:
14+
type: commerce.commerce_condition.plugin.order_product
15+
16+
commerce.commerce_condition.plugin.order_product_type:
1417
type: commerce_condition_configuration
1518
mapping:
1619
product_types:
@@ -21,7 +24,10 @@ commerce.commerce_condition.plugin.order_item_product_type:
2124
type: string
2225
label: 'Product type'
2326

24-
commerce.commerce_condition.plugin.order_item_variation_type:
27+
commerce.commerce_condition.plugin.order_item_product_type:
28+
type: commerce.commerce_condition.plugin.order_product_type
29+
30+
commerce.commerce_condition.plugin.order_variation_type:
2531
type: commerce_condition_configuration
2632
mapping:
2733
variation_types:
@@ -32,6 +38,9 @@ commerce.commerce_condition.plugin.order_item_variation_type:
3238
type: string
3339
label: 'Product variation type'
3440

41+
commerce.commerce_condition.plugin.order_item_variation_type:
42+
type: commerce.commerce_condition.plugin.order_variation_type
43+
3544
commerce_product.commerce_product_type.*:
3645
type: commerce_config_entity_bundle
3746
label: 'Product type'

modules/product/src/Plugin/Commerce/Condition/OrderItemProduct.php

Lines changed: 1 addition & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Drupal\commerce\Plugin\Commerce\Condition\ConditionBase;
66
use Drupal\Core\Entity\EntityInterface;
77
use Drupal\Core\Entity\EntityTypeManagerInterface;
8-
use Drupal\Core\Form\FormStateInterface;
98
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
109
use Symfony\Component\DependencyInjection\ContainerInterface;
1110

@@ -23,12 +22,7 @@
2322
*/
2423
class OrderItemProduct extends ConditionBase implements ContainerFactoryPluginInterface {
2524

26-
/**
27-
* The product storage.
28-
*
29-
* @var \Drupal\Core\Entity\EntityStorageInterface
30-
*/
31-
protected $productStorage;
25+
use ProductTrait;
3226

3327
/**
3428
* Constructs a new OrderItemProduct object.
@@ -61,54 +55,6 @@ public static function create(ContainerInterface $container, array $configuratio
6155
);
6256
}
6357

64-
/**
65-
* {@inheritdoc}
66-
*/
67-
public function defaultConfiguration() {
68-
return [
69-
'products' => [],
70-
] + parent::defaultConfiguration();
71-
}
72-
73-
/**
74-
* {@inheritdoc}
75-
*/
76-
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
77-
$form = parent::buildConfigurationForm($form, $form_state);
78-
79-
$products = NULL;
80-
$product_ids = array_column($this->configuration['products'], 'product_id');
81-
if (!empty($product_ids)) {
82-
$products = $this->productStorage->loadMultiple($product_ids);
83-
}
84-
$form['products'] = [
85-
'#type' => 'entity_autocomplete',
86-
'#title' => $this->t('Products'),
87-
'#default_value' => $products,
88-
'#target_type' => 'commerce_product',
89-
'#tags' => TRUE,
90-
'#required' => TRUE,
91-
'#maxlength' => NULL,
92-
];
93-
94-
return $form;
95-
}
96-
97-
/**
98-
* {@inheritdoc}
99-
*/
100-
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
101-
parent::submitConfigurationForm($form, $form_state);
102-
103-
$values = $form_state->getValue($form['#parents']);
104-
$this->configuration['products'] = [];
105-
foreach ($values['products'] as $value) {
106-
$this->configuration['products'][] = [
107-
'product_id' => $value['target_id'],
108-
];
109-
}
110-
}
111-
11258
/**
11359
* {@inheritdoc}
11460
*/

modules/product/src/Plugin/Commerce/Condition/OrderItemProductType.php

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Drupal\commerce\Plugin\Commerce\Condition\ConditionBase;
66
use Drupal\Core\Entity\EntityInterface;
7-
use Drupal\Core\Form\FormStateInterface;
87

98
/**
109
* Provides the product type condition for order items.
@@ -19,44 +18,7 @@
1918
*/
2019
class OrderItemProductType extends ConditionBase {
2120

22-
/**
23-
* {@inheritdoc}
24-
*/
25-
public function defaultConfiguration() {
26-
return [
27-
'product_types' => [],
28-
] + parent::defaultConfiguration();
29-
}
30-
31-
/**
32-
* {@inheritdoc}
33-
*/
34-
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
35-
$form = parent::buildConfigurationForm($form, $form_state);
36-
37-
$form['product_types'] = [
38-
'#type' => 'commerce_entity_select',
39-
'#title' => $this->t('Product types'),
40-
'#default_value' => $this->configuration['product_types'],
41-
'#target_type' => 'commerce_product_type',
42-
'#hide_single_entity' => FALSE,
43-
'#autocomplete_threshold' => 10,
44-
'#multiple' => TRUE,
45-
'#required' => TRUE,
46-
];
47-
48-
return $form;
49-
}
50-
51-
/**
52-
* {@inheritdoc}
53-
*/
54-
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
55-
parent::submitConfigurationForm($form, $form_state);
56-
57-
$values = $form_state->getValue($form['#parents']);
58-
$this->configuration['product_types'] = $values['product_types'];
59-
}
21+
use ProductTypeTrait;
6022

6123
/**
6224
* {@inheritdoc}

modules/product/src/Plugin/Commerce/Condition/OrderItemVariationType.php

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Drupal\commerce\Plugin\Commerce\Condition\ConditionBase;
66
use Drupal\Core\Entity\EntityInterface;
7-
use Drupal\Core\Form\FormStateInterface;
87

98
/**
109
* Provides the product variation type condition for order items.
@@ -19,44 +18,7 @@
1918
*/
2019
class OrderItemVariationType extends ConditionBase {
2120

22-
/**
23-
* {@inheritdoc}
24-
*/
25-
public function defaultConfiguration() {
26-
return [
27-
'variation_types' => [],
28-
] + parent::defaultConfiguration();
29-
}
30-
31-
/**
32-
* {@inheritdoc}
33-
*/
34-
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
35-
$form = parent::buildConfigurationForm($form, $form_state);
36-
37-
$form['variation_types'] = [
38-
'#type' => 'commerce_entity_select',
39-
'#title' => $this->t('Product variation types'),
40-
'#default_value' => $this->configuration['variation_types'],
41-
'#target_type' => 'commerce_product_variation_type',
42-
'#hide_single_entity' => FALSE,
43-
'#autocomplete_threshold' => 10,
44-
'#multiple' => TRUE,
45-
'#required' => TRUE,
46-
];
47-
48-
return $form;
49-
}
50-
51-
/**
52-
* {@inheritdoc}
53-
*/
54-
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
55-
parent::submitConfigurationForm($form, $form_state);
56-
57-
$values = $form_state->getValue($form['#parents']);
58-
$this->configuration['variation_types'] = $values['variation_types'];
59-
}
21+
use VariationTypeTrait;
6022

6123
/**
6224
* {@inheritdoc}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<?php
2+
3+
namespace Drupal\commerce_product\Plugin\Commerce\Condition;
4+
5+
use Drupal\commerce\Plugin\Commerce\Condition\ConditionBase;
6+
use Drupal\Core\Entity\EntityInterface;
7+
use Drupal\Core\Entity\EntityTypeManagerInterface;
8+
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
9+
use Symfony\Component\DependencyInjection\ContainerInterface;
10+
11+
/**
12+
* Provides the product condition for orders.
13+
*
14+
* @CommerceCondition(
15+
* id = "order_product",
16+
* label = @Translation("Product"),
17+
* display_label = @Translation("Order contains specific products"),
18+
* category = @Translation("Products"),
19+
* entity_type = "commerce_order",
20+
* weight = -1,
21+
* )
22+
*/
23+
class OrderProduct extends ConditionBase implements ContainerFactoryPluginInterface {
24+
25+
use ProductTrait;
26+
27+
/**
28+
* Constructs a new OrderProduct object.
29+
*
30+
* @param array $configuration
31+
* The plugin configuration, i.e. an array with configuration values keyed
32+
* by configuration option name.
33+
* @param string $plugin_id
34+
* The plugin_id for the plugin instance.
35+
* @param mixed $plugin_definition
36+
* The plugin implementation definition.
37+
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
38+
* The entity type manager.
39+
*/
40+
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
41+
parent::__construct($configuration, $plugin_id, $plugin_definition);
42+
43+
$this->productStorage = $entity_type_manager->getStorage('commerce_product');
44+
}
45+
46+
/**
47+
* {@inheritdoc}
48+
*/
49+
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
50+
return new static(
51+
$configuration,
52+
$plugin_id,
53+
$plugin_definition,
54+
$container->get('entity_type.manager')
55+
);
56+
}
57+
58+
/**
59+
* {@inheritdoc}
60+
*/
61+
public function evaluate(EntityInterface $entity) {
62+
$this->assertEntity($entity);
63+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
64+
$order = $entity;
65+
$product_ids = array_column($this->configuration['products'], 'product_id');
66+
foreach ($order->getItems() as $order_item) {
67+
/** @var \Drupal\commerce_product\Entity\ProductVariationInterface $purchased_entity */
68+
$purchased_entity = $order_item->getPurchasedEntity();
69+
if (!$purchased_entity || $purchased_entity->getEntityTypeId() != 'commerce_product_variation') {
70+
continue;
71+
}
72+
if (in_array($purchased_entity->getProductId(), $product_ids)) {
73+
return TRUE;
74+
}
75+
}
76+
77+
return FALSE;
78+
}
79+
80+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace Drupal\commerce_product\Plugin\Commerce\Condition;
4+
5+
use Drupal\commerce\Plugin\Commerce\Condition\ConditionBase;
6+
use Drupal\Core\Entity\EntityInterface;
7+
8+
/**
9+
* Provides the product type condition for orders.
10+
*
11+
* @CommerceCondition(
12+
* id = "order_product_type",
13+
* label = @Translation("Product type"),
14+
* display_label = @Translation("Order contains product types"),
15+
* category = @Translation("Products"),
16+
* entity_type = "commerce_order",
17+
* )
18+
*/
19+
class OrderProductType extends ConditionBase {
20+
21+
use ProductTypeTrait;
22+
23+
/**
24+
* {@inheritdoc}
25+
*/
26+
public function evaluate(EntityInterface $entity) {
27+
$this->assertEntity($entity);
28+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
29+
$order = $entity;
30+
foreach ($order->getItems() as $order_item) {
31+
/** @var \Drupal\commerce_product\Entity\ProductVariationInterface $purchased_entity */
32+
$purchased_entity = $order_item->getPurchasedEntity();
33+
if (!$purchased_entity || $purchased_entity->getEntityTypeId() != 'commerce_product_variation') {
34+
continue;
35+
}
36+
$product_type = $purchased_entity->getProduct()->bundle();
37+
if (in_array($product_type, $this->configuration['product_types'])) {
38+
return TRUE;
39+
}
40+
}
41+
42+
return FALSE;
43+
}
44+
45+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
namespace Drupal\commerce_product\Plugin\Commerce\Condition;
4+
5+
use Drupal\commerce\Plugin\Commerce\Condition\ConditionBase;
6+
use Drupal\Core\Entity\EntityInterface;
7+
8+
/**
9+
* Provides the product variation type condition for orders.
10+
*
11+
* @CommerceCondition(
12+
* id = "order_variation_type",
13+
* label = @Translation("Product variation type"),
14+
* display_label = @Translation("Order contains product variation types"),
15+
* category = @Translation("Products"),
16+
* entity_type = "commerce_order",
17+
* )
18+
*/
19+
class OrderVariationType extends ConditionBase {
20+
21+
use VariationTypeTrait;
22+
23+
/**
24+
* {@inheritdoc}
25+
*/
26+
public function evaluate(EntityInterface $entity) {
27+
$this->assertEntity($entity);
28+
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
29+
$order = $entity;
30+
foreach ($order->getItems() as $order_item) {
31+
/** @var \Drupal\commerce_product\Entity\ProductVariationInterface $purchased_entity */
32+
$purchased_entity = $order_item->getPurchasedEntity();
33+
if (!$purchased_entity || $purchased_entity->getEntityTypeId() != 'commerce_product_variation') {
34+
continue;
35+
}
36+
if (in_array($purchased_entity->bundle(), $this->configuration['variation_types'])) {
37+
return TRUE;
38+
}
39+
}
40+
41+
return FALSE;
42+
}
43+
44+
}

0 commit comments

Comments
 (0)