Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG-WIP.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
- Shipping rule categories are now eager loaded on shipping rules automatically. ([#4220](https://github.com/craftcms/commerce/issues/4220))
- Added `craft\commerce\services\ShippingRuleCategories::getShippingRuleCategoriesByRuleIds()`.
- Added `variantUiLabelFormat` and `productUiLabelFormat` settings to product types, for customizing how products and variants are labeled throughout the control panel. ([#4178](https://github.com/craftcms/commerce/pull/4178))

- Added `relatedToProducts` and `relatedToVariants` GraphQL query arguments, enabling queries for elements related to specific products or variants. ([#4202](https://github.com/craftcms/commerce/discussions/4202))
42 changes: 42 additions & 0 deletions src/Plugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,14 @@
use craft\commerce\fieldlayoutelements\VariantTitleField;
use craft\commerce\fields\Products as ProductsField;
use craft\commerce\fields\Variants as VariantsField;
use craft\commerce\gql\handlers\RelatedProducts;
use craft\commerce\gql\handlers\RelatedVariants;
use craft\commerce\gql\interfaces\elements\Product as GqlProductInterface;
use craft\commerce\gql\interfaces\elements\Variant as GqlVariantInterface;
use craft\commerce\gql\queries\Product as GqlProductQueries;
use craft\commerce\gql\queries\Variant as GqlVariantQueries;
use craft\commerce\gql\types\input\criteria\ProductRelation;
use craft\commerce\gql\types\input\criteria\VariantRelation;
use craft\commerce\helpers\ProjectConfigData;
use craft\commerce\linktypes\Product as ProductLinkType;
use craft\commerce\migrations\Install;
Expand Down Expand Up @@ -137,13 +141,15 @@
use craft\events\RegisterComponentTypesEvent;
use craft\events\RegisterElementExportersEvent;
use craft\events\RegisterEmailMessagesEvent;
use craft\events\RegisterGqlArgumentHandlersEvent;
use craft\events\RegisterGqlEagerLoadableFields;
use craft\events\RegisterGqlQueriesEvent;
use craft\events\RegisterGqlSchemaComponentsEvent;
use craft\events\RegisterGqlTypesEvent;
use craft\events\RegisterUserPermissionsEvent;
use craft\fields\Link;
use craft\fixfks\controllers\RestoreController;
use craft\gql\ArgumentManager;
use craft\gql\ElementQueryConditionBuilder;
use craft\helpers\ArrayHelper;
use craft\helpers\Console;
Expand Down Expand Up @@ -311,6 +317,7 @@ public function init(): void
$this->_registerGqlQueries();
$this->_registerGqlComponents();
$this->_registerGqlEagerLoadableFields();
$this->_registerGqlArgumentHandlers();
$this->_registerLinkTypes();
$this->_registerCacheTypes();
$this->_registerGarbageCollection();
Expand Down Expand Up @@ -1029,6 +1036,41 @@ private function _registerGqlEagerLoadableFields(): void
});
}

/**
* Register the Gql argument handlers
*
* @since 5.6.0
*/
private function _registerGqlArgumentHandlers(): void
{
Event::on(ArgumentManager::class, ArgumentManager::EVENT_DEFINE_GQL_ARGUMENT_HANDLERS, static function(RegisterGqlArgumentHandlersEvent $event) {
$event->handlers['relatedToProducts'] = RelatedProducts::class;
$event->handlers['relatedToVariants'] = RelatedVariants::class;
});

// Add relatedToProducts and relatedToVariants arguments to element queries
Event::on(Gql::class, Gql::EVENT_REGISTER_GQL_QUERIES, static function(RegisterGqlQueriesEvent $event) {
$relatedToProductsArg = [
'name' => 'relatedToProducts',
'type' => \GraphQL\Type\Definition\Type::listOf(ProductRelation::getType()),
'description' => 'Narrows the query results to elements that relate to a product list defined with this argument.',
];
$relatedToVariantsArg = [
'name' => 'relatedToVariants',
'type' => \GraphQL\Type\Definition\Type::listOf(VariantRelation::getType()),
'description' => 'Narrows the query results to elements that relate to a variant list defined with this argument.',
];

// Add the arguments to all relevant queries
foreach ($event->queries as $queryName => &$queryConfig) {
if (isset($queryConfig['args']) && is_array($queryConfig['args'])) {
$queryConfig['args']['relatedToProducts'] = $relatedToProductsArg;
$queryConfig['args']['relatedToVariants'] = $relatedToVariantsArg;
}
}
});
}

/**
* Register the cache types
*/
Expand Down
31 changes: 31 additions & 0 deletions src/gql/handlers/RelatedProducts.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\commerce\gql\handlers;

use craft\commerce\elements\Product;
use craft\gql\base\RelationArgumentHandler;

/**
* Class RelatedProducts
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 5.6.0
*/
class RelatedProducts extends RelationArgumentHandler
{
protected string $argumentName = 'relatedToProducts';

/**
* @inheritdoc
*/
protected function handleArgument($argumentValue): mixed
{
$argumentValue = parent::handleArgument($argumentValue);
return $this->getIds(Product::class, $argumentValue);
}
}
31 changes: 31 additions & 0 deletions src/gql/handlers/RelatedVariants.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\commerce\gql\handlers;

use craft\commerce\elements\Variant;
use craft\gql\base\RelationArgumentHandler;

/**
* Class RelatedVariants
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 5.6.0
*/
class RelatedVariants extends RelationArgumentHandler
{
protected string $argumentName = 'relatedToVariants';

/**
* @inheritdoc
*/
protected function handleArgument($argumentValue): mixed
{
$argumentValue = parent::handleArgument($argumentValue);
return $this->getIds(Variant::class, $argumentValue);
}
}
39 changes: 39 additions & 0 deletions src/gql/types/input/criteria/ProductRelation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\commerce\gql\types\input\criteria;

use craft\commerce\gql\arguments\elements\Product as ProductArguments;
use craft\gql\arguments\RelationCriteria;
use craft\gql\GqlEntityRegistry;
use GraphQL\Type\Definition\InputObjectType;

/**
* Class ProductRelation
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 5.6.0
*/
class ProductRelation extends InputObjectType
{
/**
* @return mixed
*/
public static function getType(): mixed
{
$typeName = 'ProductRelationCriteriaInput';

return GqlEntityRegistry::getOrCreate($typeName, fn() => new InputObjectType([
'name' => $typeName,
'fields' => fn() => [
...ProductArguments::getArguments(),
...ProductArguments::getContentArguments(),
...RelationCriteria::getArguments(),
],
]));
}
}
39 changes: 39 additions & 0 deletions src/gql/types/input/criteria/VariantRelation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/

namespace craft\commerce\gql\types\input\criteria;

use craft\commerce\gql\arguments\elements\Variant as VariantArguments;
use craft\gql\arguments\RelationCriteria;
use craft\gql\GqlEntityRegistry;
use GraphQL\Type\Definition\InputObjectType;

/**
* Class VariantRelation
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 5.6.0
*/
class VariantRelation extends InputObjectType
{
/**
* @return mixed
*/
public static function getType(): mixed
{
$typeName = 'VariantRelationCriteriaInput';

return GqlEntityRegistry::getOrCreate($typeName, fn() => new InputObjectType([
'name' => $typeName,
'fields' => fn() => [
...VariantArguments::getArguments(),
...VariantArguments::getContentArguments(),
...RelationCriteria::getArguments(),
],
]));
}
}
Loading