Attribut (s_user_attributes) Formulareingaben (Registrierung, Profil) validieren

Bei der Registrierung und im Profil sollen die Benutzer Ihre Kundennummer eingeben/ändern können, die als Attribut/Freitextfeld dem Account zugeordnet wird (s_user_attributes).

public function install(InstallContext $context)
{
    $attributeService = $this->container->get('shopware_attribute.crud_service');
    $attributeService->update('s_user_attributes', 'custom_number', 'string', ['displayInBackend' => true, 'position' => 10, 'custom' => false, 'translatable' => false, 'label' => 'ERP Kundennummer'], null, true);
    $this->container->get('models')->generateAttributeModels(['s_user_attributes']);
    $context->scheduleClearCache(InstallContext::CACHE_LIST_ALL);
}

 

Das funktioniert soweit, die Eingaben werden aus beiden Formularen ins Attribut übernommen.

Nun würde ich die Eingaben gerne noch einfachen Prüfungen unterziehen, z. B. nur Ziffern und eine Länge von 5 - 8 Zeichen.

public static function getSubscribedEvents() {
    return ['Shopware_Form_Builder' => 'onFormBuild'];
}

public function onFormBuild(\Enlight_Event_EventArgs $args) {
    $reference = $args->getReference(); // hier kommt nicht (mehr?) der Name ProfileUpdateFormType::class, sondern das Prefix

    if ($reference !== 'profile')
        return;

    $builder = $args->getBuilder();

    // TEST: firstname auf mind. 5 Zeichen -> das funktioniert!
    $builder->add('firstname', \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
        'constraints' => [
           new \Symfony\Component\Validator\Constraints\Length(['min' => 5])
       ]
    ]);

    // customNumber auf mind. 5 Zeichen -> das hat keine Auswirkung!
    $builder->get('attribute')->add('customNumber', \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
        'constraints' => [
            new \Symfony\Component\Validator\Constraints\Length(['min' => 5])
        ]
    ]);
}

In dieser Anleitung https://developers.shopware.com/developers-guide/address-management-guide/#custom-data werden mit $builder->get(‘additional’)->add(…) constraints hinzugefügt.

Hat jemand eine Idee, warum das hier nicht funktioniert?

Bei der Registrierung funktioniert die Validierung, aber im Profil (Persönliche Daten ändern) geht es nicht:

public function onFormBuild(\Enlight_Event_EventArgs $args) {
    $reference = $args->getReference();
    if ($reference !== 'profile' && $reference !== 'personal') {
        return;
    }

    $builder = $args->getBuilder();

    $builder->get('attribute')->add('customNumber', TextType::class, [
        'constraints' => [
            new \Symfony\Component\Validator\Constraints\Length([
                'min' => 5,
                'max' => 8,
                'minMessage' => 'Die Kundennummer sollte mindestens {{ limit }} Zeichen lang sein',
                'maxMessage' => 'Die Kundennummer sollte höchstens {{ limit }} Zeichen lang sein'
            ]),
            new \Symfony\Component\Validator\Constraints\Type([
                'type' => 'numeric',
                'message' => 'Die Kundennummer sollte nur aus Ziffern bestehen'
            ])
        ]
    ]);
}

Es kommt keine Fehlermeldung, also prinzipiell lassen sich die constraints im Profil-Formular auch hinzufügen.

Hast du hierfür mittlerweile eine Lösung gefunden? Egal wie ich es versuche, eine Validierung der attributes bekomme ich gerade auch nicht hin …

Ich habe eine Lösung dafür gefunden, Attribute im Kundenkonto zu validieren. Die oben vorgeschlagene Lösung würde auch funktionieren, wenn nicht in https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Bundle/AccountBundle/Form/Account/AttributeFormType.php#L113die Optionen (in dem Fall sogar mit dem alten Wert aus der Datenbank, d.h. leeren der Attribute geht über das Formular auch nicht mehr) überschrieben werden.
Daher wird der Builder per Symfony FormEvent angesprochen.

public static function getSubscribedEvents()
{
    return [
        'Shopware_Form_BuildForm' => 'onFormBuild'
    ];
}

public function onFormBuild(\Enlight_Event_EventArgs $args)
{
    $reference = $args->get('reference');
    if ($reference !== 'address')
        return;

    $builder = $args->get('builder');

    $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event){
        $form = $event->getForm();
        //Attribut validieren
        $form->get('attribute')->add('inhaber', TextType::class, [
            'constraints' => [
                new NotBlank(['message' => null]),
            ],
        ]);
        //normales Feld validieren
        $form->add('vatId', TextType::class, ['constraints' => [new NotBlank(['message' => null])]]);
    });
}

 

@an_nb24 schrieb:

Ich habe eine Lösung dafür gefunden, Attribute im Kundenkonto zu validieren. Die oben vorgeschlagene Lösung würde auch funktionieren, wenn nicht in https://github.com/shopware/shopware/blob/5.5/engine/Shopware/Bundle/AccountBundle/Form/Account/AttributeFormType.php#L113die Optionen (in dem Fall sogar mit dem alten Wert aus der Datenbank, d.h. leeren der Attribute geht über das Formular auch nicht mehr) überschrieben werden.
Daher wird der Builder per Symfony FormEvent angesprochen.

public static function getSubscribedEvents()
{
return [
‚Shopware_Form_BuildForm‘ => ‚onFormBuild‘
];
}

public function onFormBuild(\Enlight_Event_EventArgs $args)
{
$reference = $args->get(‚reference‘);
if ($reference !== ‚address‘)
return;

$builder = $args->get(‚builder‘);

$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event){
$form = $event->getForm();
//Attribut validieren
$form->get(‚attribute‘)->add(‚inhaber‘, TextType::class, [
‚constraints‘ => [
new NotBlank([‚message‘ => null]),
],
]);
//normales Feld validieren
$form->add(‚vatId‘, TextType::class, [‚constraints‘ => [new NotBlank([‚message‘ => null])]]);
});
}

 

Gibt es hier eine Aussage seitens Shopware bzw. eine Lösung für leere Attribute?

Wir stehen aktuell vor einem ähnlichen Problem: Für die Bearbeitung einer Adresse wurden von uns zusätzliche Attributfelder hinzugefügt (z.B. zusätzliche Handynummer).

Das Speichern der Attribute funktioniert nur, falls eine Handynummer eingegeben wird, jedoch nicht wenn man dieses zusätzliche Attribut leeren möchte.

Dies ist problematisch, auch aus DSGVO-Sicht, da der Kunde dadurch eingegebene Daten nicht wieder löschen kann!

Durch die aktuelle Logik im Shopware Core, wird ein leeres Attribut beim Speichern einer Kundenadresse nicht übernommen, sondern mit dem vorherigen Wert gespeichert.

  • Diese Logik wird in der Datei engine\Shopware\Bundle\AccountBundle\Form\Account\AttributeFormType.php Zeile 92 angestoßen ($builder->addEventListener)
  • Für jedes Attribut wird der aktuell im Model gespeicherte Wert geholt und als „empty_data“ gesetzt
  • Das setzen der EmptyData erfolgt in vendor/symfony/form/Extension/Core/Type/FormType.php mit der Methode buildForm (und darin setEmptyData)

 

Gibt es hierfür eine Lösung @Shopware?

Ich habe hierzu nun auch ein Ticket im IssueTracker angelegt: Shopware Issuetracker

Viele Grüße
Dennis

@compragmbh schrieb:

Ich habe hierzu nun auch ein Ticket im IssueTracker angelegt: https://issues.shopware.com/issues/SW-25532

Viele Grüße
Dennis

Hallo Dennis!

Hast Du inzwischen eine Lösung für Dein Problem gefunden? Am Ticket hat sich ja nichts getan. Ich habe nämlich auch ein Plugin mit eigenen s_user_attributes Feldern erstellt, die im Frontend Formular hinzugefügt und bearbeitet werden können. Die Felder sind keine Pflichtfelder. Beim abschließenden Testen ist mir dann aber auch aufgefallen, dass sich die Felder im Frontend nicht mehr leeren lassen.

Beste Grüße und schöne Weihnachten,

( … auch :wink: ) Dennis

@nvdennis schrieb:

@compragmbh schrieb:

Ich habe hierzu nun auch ein Ticket im IssueTracker angelegt: https://issues.shopware.com/issues/SW-25532

Viele Grüße
Dennis

Hallo Dennis!

Hast Du inzwischen eine Lösung für Dein Problem gefunden? Am Ticket hat sich ja nichts getan. Ich habe nämlich auch ein Plugin mit eigenen s_user_attributes Feldern erstellt, die im Frontend Formular hinzugefügt und bearbeitet werden können. Die Felder sind keine Pflichtfelder. Beim abschließenden Testen ist mir dann aber auch aufgefallen, dass sich die Felder im Frontend nicht mehr leeren lassen.

Beste Grüße und schöne Weihnachten,

( … auch ;) ) Dennis

Hi Dennis!

Nein, wir haben dort bisher keinen weiteren Aufwand reingesteckt, da der entsprechende Kunden-Shop noch nicht Live ist, aber schade, dass das Problem nicht beachtet wird…

Viele Grüße
Dennis