Skip to content

Commit 2daffd5

Browse files
feat: Add support for any relation field besides already supported Assets and Entries fields
1 parent 4c6b186 commit 2daffd5

File tree

3 files changed

+35
-17
lines changed

3 files changed

+35
-17
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Release Notes for Variant Manager
22

3+
## 2.0.2 - 2025-11-27
4+
5+
- Add generic support for any relation field other than already supported Assets and Entries fields.
6+
37
## 2.0.1 - 2025-06-16
48

59
- Fix issue where inventory transactions were being created for variants which have inventory tracking disabled.

composer.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
"name": "fostercommerce/variant-manager",
33
"description": "A plugin for managing product variants.",
44
"type": "craft-plugin",
5-
"version": "2.0.1",
65
"keywords": [
76
"craft",
87
"plugin",

src/services/Csv.php

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
use craft\commerce\Plugin as CommercePlugin;
1515
use craft\elements\Asset;
1616
use craft\elements\db\AssetQuery;
17+
use craft\elements\db\ElementQuery;
1718
use craft\elements\db\EntryQuery;
1819
use craft\elements\Entry;
1920
use craft\errors\ElementNotFoundException;
2021
use craft\fields\Assets as AssetsField;
22+
use craft\fields\BaseRelationField;
2123
use craft\fields\Entries;
2224
use craft\fields\Lightswitch;
2325
use craft\fields\Money as MoneyField;
@@ -657,8 +659,23 @@ static function (array $inventory) use ($defaultValue): array {
657659
*/
658660
private function normalizeValue(mixed $value): mixed
659661
{
660-
if (is_bool($value)) {
661-
return $value ? '1' : '0';
662+
if ($value instanceof EntryQuery) {
663+
$value = collect($value->all())
664+
->map(static fn ($element) => "{$element->section->handle}:{$element->slug}")
665+
->join(',');
666+
} elseif ($value instanceof AssetQuery) {
667+
$value = collect($value->all())
668+
->map(static fn ($asset) => "{$asset->volume->handle}:{$asset->path}")
669+
->join(',');
670+
} elseif ($value instanceof ElementQuery) {
671+
$value = collect($value->all())
672+
->map(static fn ($element) => $element->slug)
673+
->join(',');
674+
} elseif ($value instanceof Money) {
675+
$formatter = new DecimalMoneyFormatter(new ISOCurrencies());
676+
$value = $formatter->format($value);
677+
} elseif (is_bool($value)) {
678+
$value = $value ? '1' : '0';
662679
}
663680

664681
return $value;
@@ -925,6 +942,17 @@ private function setFieldValue(Element $element, string $fieldHandle, mixed $val
925942
->all();
926943

927944
$element->setFieldValue($fieldHandle, $assetIds);
945+
} elseif ($field instanceof BaseRelationField) {
946+
/** @var class-string<BaseRelationField> $fieldType */
947+
$fieldType = get_class($field);
948+
/** @var class-string<Element> $elementType */
949+
$elementType = $fieldType::elementType();
950+
951+
$slugs = explode(',', $value);
952+
$elementIds = collect($elementType::find()->slug($slugs)->all())
953+
->map(static fn ($e) => $e->id)
954+
->toArray();
955+
$element->setFieldValue($fieldHandle, $elementIds);
928956
} elseif ($field instanceof Lightswitch) {
929957
$element->setFieldValue($fieldHandle, $value === '1');
930958
} else {
@@ -943,20 +971,7 @@ private function normalizeProductExport(Product $product, array $mapping): array
943971
$row[] = $product->slug;
944972
} else {
945973
$value = $product->getFieldValue($fieldHandle);
946-
if ($value instanceof EntryQuery) {
947-
$value = collect($value->all())
948-
->map(static fn ($element) => "{$element->section->handle}:{$element->slug}")
949-
->join(',');
950-
} elseif ($value instanceof AssetQuery) {
951-
$value = collect($value->all())
952-
->map(static fn ($asset) => "{$asset->volume->handle}:{$asset->path}")
953-
->join(',');
954-
} elseif ($value instanceof Money) {
955-
$formatter = new DecimalMoneyFormatter(new ISOCurrencies());
956-
$value = $formatter->format($value);
957-
} else {
958-
$value = $this->normalizeValue($value);
959-
}
974+
$value = $this->normalizeValue($value);
960975

961976
$row[] = $value;
962977
}

0 commit comments

Comments
 (0)