From 894b56653f8b3daf7380bd0b92596fedcba8d5ce Mon Sep 17 00:00:00 2001 From: Brad Bell Date: Thu, 10 Oct 2024 17:31:23 -0700 Subject: [PATCH] WIP --- src/elements/CommerceProduct.php | 69 ++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/src/elements/CommerceProduct.php b/src/elements/CommerceProduct.php index c28b3019..b39a5faf 100644 --- a/src/elements/CommerceProduct.php +++ b/src/elements/CommerceProduct.php @@ -23,6 +23,7 @@ use craft\fields\Matrix; use craft\fields\Table; use craft\helpers\ArrayHelper; +use craft\helpers\ElementHelper; use craft\helpers\Json; use DateTime; use Exception; @@ -144,12 +145,24 @@ public function getGroups(): array */ public function getQuery($settings, array $params = []): mixed { + $targetSiteId = Hash::get($settings, 'siteId') ?: Craft::$app->getSites()->getPrimarySite()->id; + if ($this->element !== null) { + $productType = $this->element->getType(); + } + $query = ProductElement::find() ->status(null) - ->typeId($settings['elementGroup'][ProductElement::class]) - ->siteId(Hash::get($settings, 'siteId') ?: Craft::$app->getSites()->getPrimarySite()->id); - Craft::configure($query, $params); + ->typeId($settings['elementGroup'][ProductElement::class]); + + if (isset($productType) && $productType->propagationMethod === \craft\enums\PropagationMethod::Custom) { + $query->site('*') + ->preferSites([$targetSiteId]) + ->unique(); + } else { + $query->siteId($targetSiteId); + } + Craft::configure($query, $params); return $query; } @@ -167,9 +180,59 @@ public function setModel($settings): ElementInterface $this->element->siteId = $siteId; } + /* @var \craft\commerce\models\ProductType $productType */ + $productType = Commerce::getInstance()->getProductTypes()->getProductTypeById($this->element->typeId); + + // Set the default site status based on the section's settings + $enabledForSite = []; + foreach ($productType->getSiteSettings() as $siteSettings) { + if ( + $productType->propagationMethod !== \craft\enums\PropagationMethod::Custom || + $siteSettings->siteId == $siteId + ) { + $enabledForSite[$siteSettings->siteId] = $siteSettings->enabledByDefault; + } + } + $this->element->setEnabledForSite($enabledForSite); + return $this->element; } + /** + * Checks if $existingElement should be propagated to the target site. + * + * @param $existingElement + * @param array $feed + * @return ElementInterface|null + * @throws \yii\base\Exception + * @throws \craft\errors\SiteNotFoundException + * @throws \craft\errors\UnsupportedSiteException + * @since 5.1.3 + */ + public function checkPropagation($existingElement, array $feed) + { + $targetSiteId = Hash::get($feed, 'siteId') ?: Craft::$app->getSites()->getPrimarySite()->id; + + // Did the entry come back in a different site? + if ($existingElement->siteId != $targetSiteId) { + // Skip it if its product type doesn't use the `custom` propagation method + if ($existingElement->getSection()->propagationMethod !== \craft\enums\PropagationMethod::Custom) { + return $existingElement; + } + + // Give the entry a status for the import's target site + // (This is how the `custom` propagation method knows which sites the entry should support.) + $siteStatuses = ElementHelper::siteStatusesForElement($existingElement); + $siteStatuses[$targetSiteId] = $existingElement->getEnabledForSite(); + $existingElement->setEnabledForSite($siteStatuses); + + // Propagate the entry, and swap $entry with the propagated copy + return Craft::$app->getElements()->propagateElement($existingElement, $targetSiteId); + } + + return $existingElement; + } + /** * @inheritDoc */