feat(catalog): add show_in_selector attribute to item attributes and update related logic

This commit is contained in:
2026-08-12 16:11:53 -03:00
parent 8359f0831f
commit 7c7a295625
12 changed files with 115 additions and 1 deletions

View File

@@ -37,6 +37,7 @@ class CatalogService
$images = $data['images'] ?? [];
$attributeCodes = $data['attribute_codes'] ?? [];
$multiSelectAttributeCodes = $data['multi_select_attribute_codes'] ?? [];
$hiddenAttributeCodes = $data['hidden_attribute_codes'] ?? [];
$components = $data['components'] ?? [];
$hasDirectStock = array_key_exists('real_stock', $data);
$realStock = (int) ($data['real_stock'] ?? 0);
@@ -64,6 +65,14 @@ class CatalogService
]);
}
if (array_diff($hiddenAttributeCodes, $attributeCodes) !== []) {
throw ValidationException::withMessages([
'hidden_attribute_codes' => [
__('api.catalog.hidden_attribute_not_on_item'),
],
]);
}
$this->validateUniqueVariantCombinations($variants, $attributeCodes);
if ($type === CatalogItemType::Bundle) {
@@ -88,6 +97,7 @@ class CatalogService
$data['images'],
$data['attribute_codes'],
$data['multi_select_attribute_codes'],
$data['hidden_attribute_codes'],
$data['components'],
$data['real_stock'],
$data['reserved_stock'],
@@ -109,7 +119,12 @@ class CatalogService
$catalogItem = CatalogItem::query()->create($data);
$itemAttributes = $type === CatalogItemType::Standard
? $this->createItemAttributes($catalogItem, $attributeCodes, $multiSelectAttributeCodes)
? $this->createItemAttributes(
$catalogItem,
$attributeCodes,
$multiSelectAttributeCodes,
$hiddenAttributeCodes,
)
: [];
if ($type === CatalogItemType::Bundle) {
@@ -488,12 +503,14 @@ class CatalogService
/**
* @param array<int, string> $attributeCodes
* @param array<int, string> $multiSelectAttributeCodes
* @param array<int, string> $hiddenAttributeCodes
* @return array<string, ItemAttribute>
*/
private function createItemAttributes(
CatalogItem $catalogItem,
array $attributeCodes,
array $multiSelectAttributeCodes = [],
array $hiddenAttributeCodes = [],
): array {
$itemAttributes = [];
$attributeCodes = array_values(array_unique($attributeCodes));
@@ -517,6 +534,7 @@ class CatalogService
$itemAttribute = $catalogItem->itemAttributes()->create([
'attribute_id' => $attribute->id,
'allow_multi_select' => in_array($attributeCode, $multiSelectAttributeCodes, true),
'show_in_selector' => ! in_array($attributeCode, $hiddenAttributeCodes, true),
]);
$itemAttributes[$attributeCode] = $itemAttribute;