Hi, ich hab ich der Doku nichts gefunden, wie ich beio der Plugininstallation mit dem Migrations-Script Zusatzfelder für Produkte (Set mit Feldern) anlegen kann.
Kennt jemand einen Weg, wie das geht?
Hi, ich hab ich der Doku nichts gefunden, wie ich beio der Plugininstallation mit dem Migrations-Script Zusatzfelder für Produkte (Set mit Feldern) anlegen kann.
Kennt jemand einen Weg, wie das geht?
nimm dazu
$this->container->get('custom_field_set.repository')
beispiel ungetestet:
// dein Plugin Bootstrap
public function install(InstallContext $context): void {
$customFields = [
[
'name' => 'my_custom_field_set',
'active' => true,
'config' => [
'label' => [
'en-GB' => 'my customFieldSet label',
'de-DE' => 'mein customFieldSet label'
],
],
'customFields' => [
[
'name' => 'my_custom_field_config',
'type' => \Shopware\Core\System\CustomField\CustomFieldTypes::TEXT,
'config' => [
'label' => [
'en-GB' => 'my customFieldConfig label',
'de-DE' => 'mein customFieldConfig label',
]
]
],
[
'name' => 'my_custom_field_other',
'type' => \Shopware\Core\System\CustomField\CustomFieldTypes::TEXT,
'other' => [
'label' => [
'en-GB' => 'my customFieldOther label',
'de-DE' => 'mein customFieldOther label',
]
]
]
],
'relations' => [
[
'entityName' => 'product'
]
]
]
];
$repo = $this->container->get('custom_field_set.repository');
foreach ($customFields as $customFieldSet) {
$repo->upsert([$customFieldSet], $context);
}
}
Oh sieht gut aus. Muss ich nachher mal testen. Danke
Hi,
ich habe die Diskussion hier verfolgt und habe gerade ein ähnliches Problem. Ich versuche für die Eigenschaften ein Zusatzfeld anzulegen (also property_group_option).
Die CustomFields an sich werden über das Migrations-Script (siehe oben) angelegt und sind auch in der DB vorhanden.
$customFieldSet = [
[
'name' => 'custom_option',
'active' => true,
'config' => [
'label' => [
'en-GB' => 'Custom Fields Configurator',
'de-DE' => 'Zusatzfelder Konfigurator'
],
],
'customFields' => [
[
'name' => 'custom_option_price',
'type' => CustomFieldTypes::TEXT,
'config' => [
'label' => [
'en-GB' => 'Price',
'de-DE' => 'Preis',
]
]
],
],
'relations' => [
[
'entityName' => 'option'
]
]
]
];
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
$customFieldSetRepository->create($customFieldSet, Context::createDefaultContext());
Die Frage ist nun, wie bekomme ich das Feld in der entsprechenden Maske bei den Eigenschaften angezeigt. Die Anleitung hier (Shopware 6: Add field to module in administration) bin ich schon durch.
Im Template sw-property-option-detail.html.twig habe ich das Feld versucht so anzulegen
Ich würde sagen, die Zuordnung “option” gibt es nicht.
'relations' => [
[
'entityName' => 'option'
]
]
Ich habe zb “product” und das Feld wird dann auch automatisch bei der Bearbeitung von Produkten mit angezeigt.
Ich habe übrigens mir die Installation von SwagSocialShopping angeschaut und den Installer für mein Plugin nachgebaut. Die haben noch ein paar Checks eingebaut, dass bei einer Neuinstalltion nicht erneut versucht wird, die Felder anzulegen.
ich führe nur ein upsert aus.
$this->customFieldSetRepository->upsert(...);
Hallo zusammen,
ich habe ein ähnliches oder vielleicht sogar das gleich Problem wie doerndorfer.
Allerdings habe ich bei bestehenden PropertyValues ein Zusatzfeld, welches mit den den customFields-Einträgen aus der Datenbank kommuniziert.
Ich habe das Problem, dass ich nun keine neuen PropertyValues anlegen kann, weil es dieses Feld angeblch nicht gibt.
Das ist die fehlermeldung dazu.
Hat dafür jemand eine Lösung?
@doerndorfer der entityName lautet ‚property_group_option‘ nicht ‚option‘
ich führe nur ein upsert aus.
$this->customFieldSetRepository->upsert(…);
Hallo!
Für ein Plugin lege ich
public function install(InstallContext $context): void
meine Zusatzfelder an. Das klappt hervorragend, so wie es hier beschrieben wurde.
Beim Deinstallieren möchte ich die Felder nicht löschen.
Wenn nun das Plugin wieder installiert werden soll, so ist dies nicht möglich, da die Zusatzfelder bereits existieren. Und das obwohl ich ein „upsert“ aufrufe.
Kann mir da jemand weiterhelfen?
Danke!
Hallo @lhairman
das scheint bei mir auch so zu sein. Obwohl ich vermutet hätte, dass genau dieser Fehler bei einem upsert()
nicht auftritt.
Ich führe nun vor dem upsert()
ein search()
durch, um zu prüfen, ob das Custom Field Set bereits existiert:
$criteria = (new Criteria())
->addFilter( new EqualsFilter('name', $customFieldSetName) );
$existingCustomFieldSets = $customFieldSetRepository
->search($criteria, $context->getContext())
->getTotal();
if ($existingCustomFieldSets == 0) {
$customFieldSetRepository->upsert($customFieldSet, $context->getContext());
}
Lg
Danke für die Info! Ich habe bis jetzt auch noch keine andere Lösung gefunden. Werde ich mit dem search probieren.
Ich weiß der Thread ist schon älter, aber bin selbst auch gerade erst wieder über die Thematik gestolpert.
Dadurch, dass ich immer wieder mal neue Custom fields hinzugefügt habe, hat der Check wie von @xlarry beschrieben nicht mehr ausgereicht.
Deswegen habe ich das ganze noch etwas erweitert und bin bei folgender Lösung gelandet (Shopware 6.6):
<?php
declare(strict_types=1);
namespace XyTheme;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
use Shopware\Core\Framework\Plugin;
use Shopware\Core\System\CustomField\Aggregate\CustomFieldSet\CustomFieldSetEntity;
use Shopware\Core\System\CustomField\CustomFieldEntity;
use Shopware\Core\System\CustomField\CustomFieldTypes;
use Shopware\Storefront\Framework\ThemeInterface;
class XyTheme extends Plugin implements ThemeInterface
{
public function activate(Plugin\Context\ActivateContext $activateContext): void
{
/** @var EntityRepository<CustomFieldSetEntity> $customFieldSetRepository */
$customFieldSetRepository = $this->container->get('custom_field_set.repository');
/** @var EntityRepository<CustomFieldEntity> $customFieldRepository */
$customFieldRepository = $this->container->get('custom_field.repository');
$context = $activateContext->getContext();
$customFields = [
[
'name' => 'contact_info',
'active' => true,
'config' => [
'label' => [
'en-GB' => 'Contact information',
'de-DE' => 'Kontaktinformationen'
],
],
'customFields' => [
[
'name' => 'email_address',
'type' => CustomFieldTypes::TEXT,
'config' => [
'label' => [
'en-GB' => 'Mail address',
'de-DE' => 'Mail Adresse',
]
]
],
[
'name' => 'phone_number',
'type' => CustomFieldTypes::TEXT,
'config' => [
'label' => [
'en-GB' => 'Phone number',
'de-DE' => 'Telefonnummer',
]
]
],
[
'name' => 'opening_hours',
'type' => CustomFieldTypes::TEXT,
'config' => [
'label' => [
'en-GB' => 'Opening hours',
'de-DE' => 'Öffnungszeiten',
]
]
],
],
'relations' => [
[
'entityName' => 'sales_channel'
]
]
]
];
foreach ($customFields as $customFieldSet) {
$criteria = (new Criteria())->addFilter(new EqualsFilter('name', $customFieldSet['name']));
$customFieldSetId = $customFieldSetRepository
->search($criteria, $context)
->first()
?->getUniqueIdentifier();
if ($customFieldSetId === null) {
$customFieldSetRepository->upsert([$customFieldSet], $context);
} else {
foreach ($customFieldSet['customFields'] as $customField) {
$criteria = (new Criteria())
->addFilter(new EqualsFilter('customFieldSetId', $customFieldSetId))
->addFilter(new EqualsFilter('name', $customField['name']));
$customFieldId = $customFieldRepository
->search($criteria, $context)
->first()
?->getUniqueIdentifier();
if ($customFieldId !== null) {
$customField['id'] = $customFieldId;
}
$customField['customFieldSetId'] = $customFieldSetId;
$customFieldRepository->upsert([$customField], $context);
}
}
}
}
}