# saveRegisterAction & AddressFormType überschreiben

**URL:** <https://forum.shopware.com/t/saveregisteraction-addressformtype-uberschreiben/58132>\
**Category:** Programmierung\
**Created:** [19. Februar 2019 um 14:03 UTC](https://forum.shopware.com/t/saveregisteraction-addressformtype-uberschreiben/58132 "2019-02-19T14:03:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![dkasperski](https://avatars.discourse-cdn.com/v4/letter/d/d07c76/32.png) [@dkasperski](https://forum.shopware.com/u/dkasperski)\
**Post date:** [19. Februar 2019 um 14:03 UTC](https://forum.shopware.com/t/saveregisteraction-addressformtype-uberschreiben/58132/1 "2019-02-19T14:03:39Z")

</div>

Hallo,

&nbsp;

Ich versuche die saveRegisterAction von Register controller und AddressFormType von AccountBundle in meinem eingenen Plugin zu überschreiben.

&nbsp;

Als erstes habe ich das subscriber für saveRegisterAction erstellt, danach habe ich ein eigenes AddressFormType mit dieser Service-Konfiguration erstellt:

&nbsp;

```
;

```

&nbsp;

Leider der Service-Container sieht mein Service nicht shopware\_account.form.addressform.register\_plugin. Wenn die Formtypklasse (Form Type Class) automatisch erstellt wird, gibt es keine Objekte (Shopware\_Components\_Config and ModelManager). Kann jemand helfen?

Thanks

---

<div class="post-metadata">

**Author:** ![Lukaschel](https://avatars.discourse-cdn.com/v4/letter/l/e56c9b/32.png) [@Lukaschel](https://forum.shopware.com/u/Lukaschel)\
**Post date:** [23. Februar 2019 um 23:12 UTC](https://forum.shopware.com/t/saveregisteraction-addressformtype-uberschreiben/58132/2 "2019-02-23T23:12:40Z")

</div>

Hallo,&nbsp;

du willst doch den Service überschreiben, dann ist das aber die falsche service id&nbsp;

Grüße Lukaschel

---

<div class="post-metadata">

**Author:** ![shyim](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/shyim/32/7681_2.png) [@shyim](https://forum.shopware.com/u/shyim)\
**Post date:** [24. Februar 2019 um 16:09 UTC](https://forum.shopware.com/t/saveregisteraction-addressformtype-uberschreiben/58132/3 "2019-02-24T16:09:24Z")

</div>

Du solltest die FormType erweitern nicht überschreiben. Schau dir das Event Shopware\_Form\_Builder an

---

<div class="post-metadata">

**Author:** ![dkasperski](https://avatars.discourse-cdn.com/v4/letter/d/d07c76/32.png) [@dkasperski](https://forum.shopware.com/u/dkasperski)\
**Post date:** [20. März 2019 um 10:55 UTC](https://forum.shopware.com/t/saveregisteraction-addressformtype-uberschreiben/58132/4 "2019-03-20T10:55:16Z")

</div>

Ich habe die Dokumentation Shopware verwendet: [https://developers.shopware.com/developers-guide/address-management-guide/#example-#1:-adding-a-new-field](https://developers.shopware.com/developers-guide/address-management-guide/#example-#1:-adding-a-new-field), aber in diesem Fall funktioniert es nicht, weil ich Sie müssen die Methoden addVatIdValidation und private ändern, um eine weitere Methode zum Überprüfen eines neuen checkbox im Formular hinzuzufügen (checkbox companyConfirmation).

Darüber hinaus müsste der Controller Optionen übergeben (public function buildForm(FormBuilderInterface $builder, array $options)) 3 Variablen: isShippingProvided, AddressType und companyConfirmation.

Momentan habe ich einen solchen Fehler:

FormConfigBuilder methods cannot be accessed anymore once the builder is turned into a FormConfigInterface instance. in vendor/symfony/form/FormConfigBuilder.php on line 211

Ich habe es auf folgende Weise versucht:

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

    public function onAddressFormBuild(\Enlight_Event_EventArgs $event)
    {
        if ($event->getReference() !== BaseAddressFormType::class) {
            return;
        }

        $builder = $event->getBuilder();
        $formBuilder = $builder->getConfig();

        $this->addVatIdValidation($formBuilder);

        if ($this->addressType == self::ADDRESS_TYPE_BILLING) {
            $this->addCompanyConfirmationValidation($builder);
        }
    }

    /**
     * @param FormBuilderInterface $builder
     */
    private function addVatIdValidation(FormBuilderInterface $builder)
    {
        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
            $form = $event->getForm();

            /** @var Address $data */
            $data = $form->getData();
            $customerType = $form->get('additional')->get('customer_type')->getData();

            if ($customerType !== Customer::CUSTOMER_TYPE_BUSINESS || !empty($data->getVatId())) {
                return;
            }

            if ($this->addressType == self::ADDRESS_TYPE_SHIPPING && !$this->isShippingProvided) {
                return;
            }

            if (EUStates::isEUCountry($data->getCountry()->getIso())) {
                $notBlank = new NotBlank(['message' => null]);
                $error = new FormError($notBlank->message);
                $error->setOrigin($form->get('vatId'));
                $form->addError($error);
            }
        });
    }

    /**
     * @param FormBuilderInterface $builder
     */
    private function addCompanyConfirmationValidation(FormBuilderInterface $builder)
    {
        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
            $form = $event->getForm();

            /** @var Address $data */
            $data = $form->getData();

            if (!$this->companyConfirmation && !EUStates::isEUCountry($data->getCountry()->getIso())) {
                $message = 'Please confirm you place your order for a business entity by checking the box below. The products on this site are available for commercial customers only.';
                $error = new FormError($message);
                $error->setOrigin($form->get('additional')->get('companyConfirmation'));
                $form->addError($error);
            }
        });
    }

```

&nbsp;
