Controller Forms.php function commitForm() kann nicht überschrieben werden.

Hallo Zusammen,

ich stehe vor folgenden Problem und zwar möchte ich zur Reply Adresse den entsprechenden Namen des Kunden hinzufügen.
Dazu hab ich versucht die function commitForm() mit einem Plugin zu überschreiben um den entsprechenden effekt zu erhalten.

Leider kriege ich diesen Error:

[2017-02-02 23:46:01] core.ERROR: exception 'Enlight_Exception' with message 'Property "_elements" not found failure' in D:\xampp56\htdocs\shopware2\engine\Shopware\Plugins\Local\Frontend\MailReplayWithName\Bootstrap.php:36 Stack trace: #0 D:\xampp56\htdocs\shopware2\engine\Shopware\Plugins\Local\Frontend\MailReplayWithName\Bootstrap.php(36): Enlight_Class->__get('_elements') #1 D:\xampp56\htdocs\shopware2\engine\Library\Enlight\Event\Handler\Plugin.php(149): Shopware_Plugins_Frontend_MailReplayWithName_Bootstrap->replaceCommitForm(Object(Enlight_Hook_HookArgs)) #2 D:\xampp56\htdocs\shopware2\engine\Library\Enlight\Event\EventManager.php(214): Enlight_Event_Handler_Plugin->execute(Object(Enlight_Hook_HookArgs)) #3 D:\xampp56\htdocs\shopware2\engine\Library\Enlight\Hook\HookManager.php(182): Enlight_Event_EventManager->notify('Shopware_Contro...', Object(Enlight_Hook_HookArgs)) #4 D:\xampp56\htdocs\shopware2\var\cache\production_201701241633\proxies\ShopwareControllersFrontendFormsProxy.php(18): Enlight_Hook_HookManager->executeHooks(Object(Shopware_Proxies_ShopwareControllersFrontendFormsProxy), 'commitForm', Array) #5 D:\xampp56\htdocs\shopware2\engine\Shopware\Controllers\Frontend\Forms.php(95): Shopware_Proxies_ShopwareControllersFrontendFormsProxy->commitForm() #6 D:\xampp56\htdocs\shopware2\engine\Shopware\Controllers\Frontend\Forms.php(81): Shopware_Controllers_Frontend_Forms->handleFormPost('5') #7 D:\xampp56\htdocs\shopware2\engine\Library\Enlight\Controller\Action.php(159): Shopware_Controllers_Frontend_Forms->indexAction() #8 D:\xampp56\htdocs\shopware2\engine\Library\Enlight\Controller\Dispatcher\Default.php(523): Enlight_Controller_Action->dispatch('indexAction') #9 D:\xampp56\htdocs\shopware2\engine\Library\Enlight\Controller\Front.php(223): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp)) #10 D:\xampp56\htdocs\shopware2\engine\Shopware\Kernel.php(179): Enlight_Controller_Front->dispatch() #11 D:\xampp56\htdocs\shopware2\vendor\symfony\http-kernel\HttpCache\HttpCache.php(487): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #12 D:\xampp56\htdocs\shopware2\engine\Shopware\Components\HttpCache\AppCache.php(255): Symfony\Component\HttpKernel\HttpCache\HttpCache->forward(Object(Symfony\Component\HttpFoundation\Request), true, NULL) #13 D:\xampp56\htdocs\shopware2\vendor\symfony\http-kernel\HttpCache\HttpCache.php(258): Shopware\Components\HttpCache\AppCache->forward(Object(Symfony\Component\HttpFoundation\Request), true) #14 D:\xampp56\htdocs\shopware2\vendor\symfony\http-kernel\HttpCache\HttpCache.php(275): Symfony\Component\HttpKernel\HttpCache\HttpCache->pass(Object(Symfony\Component\HttpFoundation\Request), true) #15 D:\xampp56\htdocs\shopware2\engine\Shopware\Components\HttpCache\AppCache.php(133): Symfony\Component\HttpKernel\HttpCache\HttpCache->invalidate(Object(Symfony\Component\HttpFoundation\Request), true) #16 D:\xampp56\htdocs\shopware2\vendor\symfony\http-kernel\HttpCache\HttpCache.php(206): Shopware\Components\HttpCache\AppCache->invalidate(Object(Symfony\Component\HttpFoundation\Request), true) #17 D:\xampp56\htdocs\shopware2\engine\Shopware\Components\HttpCache\AppCache.php(114): Symfony\Component\HttpKernel\HttpCache\HttpCache->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true) #18 D:\xampp56\htdocs\shopware2\shopware.php(117): Shopware\Components\HttpCache\AppCache->handle(Object(Symfony\Component\HttpFoundation\Request)) #19 {main} [] {"uid":"f03b986"}

In meiner Function steht der Part wo _elements verwendet wird noch genau so drin.

//Email field available check
        foreach ($this->_elements as $element) {
            if ($element['typ'] == 'email') {
                $postEmail = $this->_postData[$element['id']];
                $postEmail = trim($postEmail);
            }
        }

 

Liegt es vllt daran das die Variable nicht Public ist? Wie komme ich an den Inhalt der Variable?

 

Sorry bin recht neu in der Shopware Plugin entwicklung.

 

Viele Grüße

 

Joni

Hallo, 

du kannst einfacher nur daa email model änderen , bei ‚Shopware_Controllers_Frontend_Forms_commitForm_Mail‘ event.

und dann 

$postEmail = $mail->getReplyTo();

// Ihre Code

$mail->setReplyTo($postEmail);

VG,

Ahmad

1 Like

Danke dir aber wie soll das funktionieren? Wie muss ich den konkret ansteuern?

Aktuell habe ich das so 

$this->subscribeEvent(
            'Shopware_Controllers_Frontend_Forms::commitForm::replace',
            'replaceCommitForm'
        );

Dazu benötige ich “_elements” da ich noch nach bestimmen Elementen suchen muss.

Wie stelle ich das an? Kannst du mir vllt ein beispiel schreiben wie ich auf die Variabeln genau zugreife und "

 $mail-\>setReplyTo($postEmail);

abändern kann?

 

Würde mich sehr freuen.

 

Vielen Dank für eure Hilfe.

@ahmadsaad schrieb:

Hallo, 

du kannst einfacher nur daa email model änderen , bei ‘Shopware_Controllers_Frontend_Forms_commitForm_Mail’ event.

und dann 

$postEmail = $mail->getReplyTo();

// Ihre Code

$mail->setReplyTo($postEmail);

VG,

Ahmad

Hab jetzt mal versucht die 

 Shopware\_Controllers\_Frontend\_Forms\_commitForm\_Mail

abzufangen.

 

Eigentlich möchte ich nur aus 

 //Email field available check foreach ($this-\>\_elements as $element) { if ($element['typ'] == 'email') { $postEmail = $this-\>\_postData[$element['id']]; $postEmail = trim($postEmail); } }

 

Ein weiteres Feld abfangen und dieses dann mit übergeben in

 $mail-\>setReplyTo($postEmail);

Daraus soll dann 

 $mail-\>setReplyTo($postEmail,$name);

werden.

 

Wäre sau geil wenn du mir kurz ein Example dafür schreiben könntest. Der Server antwortet nicht mehr wenn ich versuche gewisse Daten abzufagen.

Hallo,

du brauchst nur ReplayTo email änderen, für was möchtsest du $this->_elements!!!??

du kannst einfach : 

      $this->subscribeEvent(
            'Shopware_Controllers_Frontend_Forms_commitForm_Mail',
            'replaceReplayTo'
        );

dann

public function replaceReplayTo($args)
{
  $mail = $args->getReturn();
  $postEmail = $mail->getReplyTo();
  $mail->setReplyTo($postEmail,$name);
  return $mail;
}

ünd dass ist alle

VG,

Ahmad

1 Like

Vielen Dank Ahmad für deine Hilfe.

Ich habs mal so versucht bekomme aber einen Error. Als $name hab ich jetzt zum testen irgend einen Randomwert gesetzt.

 

Ups! Ein Fehler ist aufgetreten!

Wir wurden bereits über das Problem informiert und arbeiten an einer Lösung, bitte versuchen Sie es in Kürze erneut

 Ich brauche _elements um den Vor und Nachnamen des Absenders herauszubekommen. Wie komme ich daran? Oder gibt es hier einen anderen weg?

Würde mich freuen wenn du mir weiterhelfen kannst :slight_smile:

 

EDIT: Weiß zwar nicht woher der Error genau kommt aber scheinbar dadurch das „$mail->setReplyTo($postEmail);“ jetzt zweimal gesetzt ist.

 

Viele Grüße

Joni

Ich würde einfach Closure benutzen um daran zu kommen :slight_smile:

https://ocramius.github.io/blog/accessing-private-php-class-members-without-reflection/

1 Like

@Shyim schrieb:

Ich würde einfach Closure benutzen um daran zu kommen :)

https://ocramius.github.io/blog/accessing-private-php-class-members-without-reflection/

Danke dir :slight_smile: Kannst du vllt ein kurzes Beispiel zu meinem Fall geben?

Fällt mir grade noch etwas schwer es zu verstehen. 

@Shyim schrieb:

Ich würde einfach Closure benutzen um daran zu kommen :)

https://ocramius.github.io/blog/accessing-private-php-class-members-without-reflection/

Hast du vllt ein Plugin da wo dies bereits verwendet wird, damit ich mir die Funktionsweiße unter Shopware ansehen kann?

 Und kann ich jetzt irgendwie “$mail->setReplyTo($postEmail);” neu setzen ohne das ein Fehler geworfen wird oder muss ich dazu die ganze Function überschreiben?

Würde mir sehr helfen wenn jemand helfen könnte.

Viele Grüße

 

joni