Shopware 6自定义字段继承功能咨询:6.2.2版本无法生效问题
Great question! I've run into this exact issue with Shopware 6.2.2 myself — the Inherited flag alone doesn't handle product variant inheritance out of the box in that version. Let me break down why this happens and how to fix it:
Why the Inherited Flag Isn't Working
In Shopware 6.2.x, the Inherited flag is primarily designed for inheritance between related entities (like categories to products), not for parent product ↔ variant relationships. Variants are technically part of the same product entity hierarchy, but the core system doesn't automatically propagate custom field values from parents to child variants when the flag is set. The flag acts more as a metadata marker than a functional trigger in this early version.
Step-by-Step Solution
Here's how to implement the inheritance behavior you need:
1. Configure Your Custom Field Correctly
First, make sure your custom field is set up with the Inherited flag and targeted at the product entity (since variants are products too). Example code for creating the field:
use Shopware\Core\System\CustomField\CustomField; use Shopware\Core\System\CustomField\CustomFieldSet; use Shopware\Core\System\CustomField\CustomFieldTypes; use Shopware\Core\System\CustomField\Flag\Inherited; use Shopware\Core\Framework\Context; // Create custom field set $customFieldSet = new CustomFieldSet(); $customFieldSet->setName('product_inherit_fields'); $customFieldSet->setConfig(['label' => ['en-GB' => 'Inheritable Product Fields']]); // Create inheritable custom field $customField = new CustomField(); $customField->setName('custom_inherited_value'); $customField->setType(CustomFieldTypes::STRING); $customField->addFlag(new Inherited()); // Marks field as inheritable (metadata only) $customField->setConfig(['label' => ['en-GB' => 'Inherited Value']]); $customFieldSet->addCustomField($customField); // Persist to database $this->customFieldSetRepository->create( [$customFieldSet->jsonSerialize()], Context::createDefaultContext() );
2. Add Custom Inheritance Logic via Event Subscriber
We'll use a ProductLoadedEvent subscriber to automatically populate variant custom fields with parent values when the variant's field is empty. This triggers whenever products (including variants) are loaded in the backend or frontend.
Create the Subscriber Class
<?php namespace YourPluginNamespace\Subscriber; use Shopware\Core\Content\Product\Event\ProductLoadedEvent; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class ProductVariantInheritanceSubscriber implements EventSubscriberInterface { public static function getSubscribedEvents(): array { return [ ProductLoadedEvent::class => 'onProductsLoaded', ]; } public function onProductsLoaded(ProductLoadedEvent $event): void { $products = $event->getProducts(); $parentIds = []; $productMap = []; // First, map all products and collect parent IDs for variants foreach ($products as $product) { $productMap[$product->getId()] = $product; if ($product->getParentId() && !in_array($product->getParentId(), $parentIds)) { $parentIds[] = $product->getParentId(); } } // Skip if no parent products to load if (empty($parentIds)) { return; } // Batch load all parent products $parentProducts = $event->getContext()->getExtension('product.repository')->search( new Criteria($parentIds), $event->getContext() )->getEntities(); // Populate inherited values for variants foreach ($products as $variant) { $parentId = $variant->getParentId(); if (!$parentId || !$parentProducts->has($parentId)) { continue; } $parent = $parentProducts->get($parentId); $variantCustomFields = $variant->getCustomFields() ?? []; $parentCustomFields = $parent->getCustomFields() ?? []; // Replace empty variant field with parent's value $targetField = 'custom_inherited_value'; if (empty($variantCustomFields[$targetField]) && isset($parentCustomFields[$targetField])) { $variantCustomFields[$targetField] = $parentCustomFields[$targetField]; $variant->setCustomFields($variantCustomFields); } } } }
Register the Subscriber
Add this to your plugin's services.xml (or services.yaml) to make Shopware aware of the subscriber:
<service id="YourPluginNamespace\Subscriber\ProductVariantInheritanceSubscriber"> <tag name="kernel.event_subscriber"/> </service>
3. Optional: Sync Values on Save
If you want to persist the inherited value to the variant's database record (instead of just populating it on load), you can listen to the ProductWrittenEvent and copy the parent value when the variant is saved without a custom field value.
Upgrade Note
If you have the option, upgrading to Shopware 6.3 or later is worth considering. Later versions improved the Inherited flag's functionality specifically for product variants, reducing the need for custom code.
内容的提问来源于stack exchange,提问作者Huzaifa Mustafa

