Skip to content

Commit

Permalink
Merge pull request #3691 from craftcms/feature/pt-2164-4x5x-variant-s…
Browse files Browse the repository at this point in the history
…earch-condition-rule-for-product-conditions

[4.7] Add "Variant Search" condition rule to product conditions
  • Loading branch information
lukeholder committed Sep 24, 2024
2 parents 6dfad2b + fac56cf commit 76b8eaf
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 1 deletion.
10 changes: 9 additions & 1 deletion CHANGELOG-WIP.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
# Release Notes for Craft Commerce 4.7 (WIP)

## Unreleased
### Store Management
- Product conditions can now have a “Variant Search” rule. ([#3689](https://github.com/craftcms/commerce/issues/3689))

### Administration

### Development

### Extensibility
- Added `craft\commerce\elements\conditions\products\ProductVariantSearchConditionRule`.
1 change: 1 addition & 0 deletions src/elements/conditions/products/ProductCondition.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ protected function conditionRuleTypes(): array
{
return array_merge(parent::conditionRuleTypes(), [
ProductTypeConditionRule::class,
ProductVariantSearchConditionRule::class,
ProductVariantSkuConditionRule::class,
ProductVariantStockConditionRule::class,
ProductVariantHasUnlimitedStockConditionRule::class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\commerce\elements\conditions\products;

use Craft;
use craft\base\conditions\BaseTextConditionRule;
use craft\base\ElementInterface;
use craft\commerce\elements\db\ProductQuery;
use craft\commerce\elements\Product;
use craft\commerce\elements\Variant;
use craft\elements\conditions\ElementConditionRuleInterface;
use craft\elements\db\ElementQueryInterface;
use craft\helpers\ArrayHelper;
use yii\base\InvalidConfigException;

/**
* Product Variant Search Condition Rule
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 4.7.0
*/
class ProductVariantSearchConditionRule extends BaseTextConditionRule implements ElementConditionRuleInterface
{
/**
* @inheritdoc
*/
public function getLabel(): string
{
return Craft::t('commerce', 'Variant Search');
}

/**
* @inheritdoc
*/
public function getExclusiveQueryParams(): array
{
return [];
}

/**
* @inheritdoc
*/
protected function operators(): array
{
return [];
}

/**
* @inheritdoc
*/
protected function paramValue(): ?string
{
return trim(parent::paramValue()); // TODO: Change the autogenerated stub
}

/**
* @param ElementQueryInterface $query
*/
public function modifyQuery(ElementQueryInterface $query): void
{
$variantQuery = Variant::find();
$variantQuery->select(['commerce_variants.productId as id']);
$variantQuery->search($this->paramValue());

/** @var ProductQuery $query */
$query->andWhere(['elements.id' => $variantQuery]);
}

/**
* @param Product $element
* @return bool
* @throws InvalidConfigException
*/
public function matchElement(ElementInterface $element): bool
{
$variantIds = ArrayHelper::getColumn($element->getVariants(), 'id');
if (empty($variantIds)) {
return false;
}

// Perform a variant query search to ensure it is the same process as `modifyQuery`
$variantQuery = Variant::find();
$variantQuery->search($this->paramValue());
$variantQuery->id($variantIds);

return $variantQuery->count() > 0;
}
}
1 change: 1 addition & 0 deletions src/translations/en/commerce.php
Original file line number Diff line number Diff line change
Expand Up @@ -1120,6 +1120,7 @@
'Variant Has Unlimited Stock' => 'Variant Has Unlimited Stock',
'Variant Price' => 'Variant Price',
'Variant SKU' => 'Variant SKU',
'Variant Search' => 'Variant Search',
'Variant Stock' => 'Variant Stock',
'Variant Title Format' => 'Variant Title Format',
'Variants' => 'Variants',
Expand Down

0 comments on commit 76b8eaf

Please sign in to comment.