steinsoftwaresteinsoftware MitgliedKommentare: 983 Danke erhalten: 208 Mitglied seit: April 2014 bearbeitet November 2014
Habe soeben vom Shopware-Support (Shopware inklusive Professional Lizenz) gesagt bekommen, dass die Funktionalität des Shopware-Event-Systems wohl nicht im Standardleistungsumfang von Shopware enthalten ist und mir deshalb wohl kein Support zusteht. Es handelt sich anscheinend um ein reines Programmier-Problem.

Ich wende mich deshalb jetzt an die Community. Ich hoffe es meldet sich doch noch jemand von Shopware hier zu Wort...

Ich möchte den Inhalt aller E-Mails abfangen bevor diese versendet werden. Das Problem ist, dass das zugehörige Event nicht funktioniert.

Leider bekomme ich es nicht hin das Event 'Enlight_Components_Mail_Send' ​in der Datei '/engine/Library/Enlight/Components/Mail.php' abzufangen.

Ich nutze folgenden Code in meiner Bootstrap.php (Nur ein Ausschnitt der Bootstrap):
public function install()
{
   $this->subscribeEvent(
        'Enlight_Components_Mail_Send',
        'onMailSend'
    );
}
   
public function onMailSend(Enlight_Event_EventArgs $args)
{
    $mail = $args->getSubject();
       
    echo '<pre>';
    print_r($mail);
    echo '</pre>';
    die('');
}
Eventuell muss ich das Event anders aufrufen?

Kann mir hier bitte jemand helfen? Macht jemand etwas ähnliches?

Kommentare

  • Daniel NögelDaniel Nögel AdministratorKommentare: 1560 Danke erhalten: 382 Mitglied seit: September 2012
    steinsoftware schrieb:
    Habe soeben vom Shopware-Support (Shopware inklusive Professional Lizenz) gesagt bekommen, dass die Funktionalität des Shopware-Event-Systems wohl nicht im Standardleistungsumfang von Shopware enthalten ist und mir deshalb wohl kein Support zusteht.
    Hi,

    ich *vermute*, dass der Support darauf hinweisen wollte, dass du den Entwickler-Support nicht gebucht hast: http://www.shopware.de/shopware-support ... tegory=385

    Was ist denn genau mit "funktioniert nicht" gemeint? Wird dir nichts ausgegeben oder wird dein Callback nie ausgeführt? Hast du das Plugin neu installiert, nachdem du das Event hinzugefügt hast? Das ist notwendig.
    Enlight()->Events()->notify(
                'Enlight_Components_Mail_Send',
                array(
                    'mail'      => $this,
                    'transport' => $transport
                )
            );
    
    Versuch mal auf "$args->get('mail')" oder "$args->get('transport')" zuzugreifen - "subject" wird ja hier gar nicht übergeben, weswegen der Getter get('subject') bzw. das Pendant getSubject() nicht zur Verfügung steht.

    lG

    Daniel
    Danke von 1steinsoftware
  • steinsoftwaresteinsoftware MitgliedKommentare: 983 Danke erhalten: 208 Mitglied seit: April 2014
    Hallo Daniel,

    vielen Dank für die Antwort! Super, dass sich hier jemand von Shopware meldet! Leider hilft sie mir nicht weiter... ;(
    ich *vermute*, dass der Support darauf hinweisen wollte, dass du den Entwickler-Support nicht gebucht hast: http://www.shopware.de/shopware-support ... tegory=385
    -> Stimmt wohl.
    Was ist denn genau mit "funktioniert nicht" gemeint? Wird dir nichts ausgegeben oder wird dein Callback nie ausgeführt?
    -> Der Callback wird nie ausgeführt. Da ist ja ein "die('');" im Code enthalten. Die Mail wird jedoch einfach versendet und das Frontend wird angezeigt. Mein Code wird also nie ausgeführt.
    Hast du das Plugin neu installiert, nachdem du das Event hinzugefügt hast? Das ist notwendig.
    -> Selbstverständlich. Das Plug-In besteht im Moment aus kaum mehr als oben angegeben. Nur noch getVersion(), getLabel() und getInfo()
    Versuch mal auf "$args->get('mail')" oder "$args->get('transport')" zuzugreifen - "subject" wird ja hier gar nicht übergeben, weswegen der Getter get('subject') bzw. das Pendant getSubject() nicht zur Verfügung steht.
    -> Ist natürlich richtig. Mein "die('');" sollte ja aber trotzdem ausgeführt werden...

    Die Frage ist nur wie kann ich dann alle Mails vor dem versenden abfangen?

    Für Hilfe wäre ich sehr dankbar...
  • Daniel NögelDaniel Nögel AdministratorKommentare: 1560 Danke erhalten: 382 Mitglied seit: September 2012
    Hi,

    das Event funktioniert definitiv und wird bspw. bei der Passwort-Vergessen-Funktion korrekt aufgerufen.
    Wenn du willst, kannst du eine aufs Minimum reduzierte aber funktionale Bootstrap bereit stellen, die das Problem veranschaulicht, dann werfe ich da kurz einen Blick drauf.

    lG

    dsn
    Danke von 1steinsoftware
  • steinsoftwaresteinsoftware MitgliedKommentare: 983 Danke erhalten: 208 Mitglied seit: April 2014
    Vielen Dank für die Antworten!
    Wenn du willst, kannst du eine aufs Minimum reduzierte aber funktionale Bootstrap bereit stellen, die das Problem veranschaulicht, dann werfe ich da kurz einen Blick drauf.
    -> Klar gerne. Ich nehme das Angebot an. :)

    Wie gesagt war das eigentlich schon die gesamte Bootstrap ;)
    <?php
    
    class Shopware_Plugins_Frontend_SteinsoftwareEMailDomainChanger_Bootstrap extends Shopware_Components_Plugin_Bootstrap
    {
    
       //Version of Plugin
        public function getVersion()
        {
            return '1.0.0';
        }
    
    	//Plugin name in plugin manager
        public function getLabel()
        {
            return "Austausch der Domain-URL in den E-Mail Templates";
        }
    
    	//info displayed in plugin manager
        public function getInfo()
        {
            return array(
                'version'     => $this->getVersion(),
                'label'       => $this->getLabel(),
                'link'        => 'http://www.steinsoftware.de',
    			'supplier' => 'Stein Software Entwicklung GmbH',
    			'author' => 'Stein Software Entwicklung GmbH',
    			'description' => 'Austausch der Domain-URL in den E-Mail Templates'
            );
        }
    
    	//what and where is it done during installation of plugin 
        public function install()
        {
           $this->subscribeEvent(
                'Enlight_Components_Mail_Send',
                'onMailSend'
            );
        }
        
    	public function onMailSend(Enlight_Event_EventArgs $args)
    	{
    		$mail = $args->getSubject();
    		
    		echo '<pre>';
    		print_r($mail);
    		echo '</pre>';
    		die('');
    	}
    }
    
    Das war alles. Wenn ich das "die('')" direkt in die Mail.php unter das Event in den Shopware-Dateien einbaue und z.B. eine Artikelbewertung abgebe, dann komme ich zum "die('')" - wenn ich jedoch das Event so im Plug-In abfange und dann eine Artikelbewertung abgebe jedoch nicht.
  • Patrick StahlPatrick Stahl ModeratorKommentare: 386 Danke erhalten: 150 Mitglied seit: August 2011
    Hallo steinsoftware,

    dir fehlt am Ende deiner Install-Methode ein "return true".
    Dadurch zählt dein Plugin weiterhin als "nicht installiert" und das Event wird nicht beachtet.

    Sobald du das return true nachträglich ergänzt und das Plugin neuinstallierst, dürfte dein Event funktionieren.
    public function install()
    	{
    		$this->subscribeEvent(
    				'Enlight_Components_Mail_Send',
    				'onMailSend'
    		);
    
    		return true;
    	}
    

    Gruß,
    Patrick :shopware:
    Danke von 1steinsoftware
  • steinsoftwaresteinsoftware MitgliedKommentare: 983 Danke erhalten: 208 Mitglied seit: April 2014
    Oh - Mein - Gott...

    Vielen, vielen herzlichen Dank für die Antworten.

    Jetzt schäme ich mich ja fast schon, deswegen hier im Forum gepostet zu haben... ;)

    Das kommt davon wenn man kein Copy and Paste beherscht.

    Vielen Dank für die Zeit die aufgwendet wurde!
  • TipoTipo MitgliedKommentare: 46 Danke erhalten: 0 Mitglied seit: September 2014
    Guten Morgen Steinsoftware,

    vielen Dank für deinen Post. Genau dasselbe Problem hatte ich auch gerade.
    Konntest du bei Deinen Abfragen noch zufällig an den Empfängername bzw. -Mail gelangen?
    Alle Daten dazu sind als Protected deklariert, so dass man sie nur per print_r sehen aber nicht direkt ansprechen oder speichern kann.
  • steinsoftwaresteinsoftware MitgliedKommentare: 983 Danke erhalten: 208 Mitglied seit: April 2014
    Hallo Tipo,

    habe das ganze so gelöst:
    public function onMailSend(Enlight_Event_EventArgs $args)
    {
        $mailObject = $args->get('mail');
    
        $plainBody = $mailObject->getPlainBodyText();
      
        //CODE
    
        $plainChanged = str_replace($stringOld, $stringNew, $plainBody);
    		
        $mailObject->setBodyText($plainChanged);	
    
        return array(
            'mail'      => $mailObject,
            'transport' => $args->get('transport')
        );
    }
    
    Dort wo //CODE steht solltest du dann eben kucken wie du an die Daten kommst ($stringOld und $stringNew) -> z.B. mit nem Explode. Ich habe bei mir keine Rücksicht darauf genommen welche mail es ist, da ich immer und bei jeder mail die rausging etwas ändern musste aber evtl. solltest du vorher noch kucken in welcher mail du dich befindest.

    Für die mail sORDER z.B. gibt es z.B. die eMail variable {$additional.user.email} in der die e-mail drinsteht. Wenn man die im eMail-Template dann einfügt sagen wir so:
    <<want-this-mail>>{$additional.user.email}<<want-this-mail>>
    
    Dann kann man an die Stelle von //CODE so was in der Art schreiben:
    $split = explode("<<want-this-mail>>", $plainBody);
    $stringOld = "<<want-this-mail>>" . $split[1] . "<<want-this-mail>>";
    $stringNew = "";
    $empfaengerMail = $split[1];
    
    P.S. Code nicht getestet!!!

    EDIT: sehe gerade, dass da $args->get('transport') dransteht -> evtl. ist da die mail-Adresse schon drin?
  • TipoTipo MitgliedKommentare: 46 Danke erhalten: 0 Mitglied seit: September 2014
    Die E-Mailadresse für den Empfänger ist in
    $args->get('mail')->getTo()
    
    Es ist ein Array, das die Mailadressen enthält.

    Ok, also dein Ansatz geht davon aus, dass ich in den Mail-Templates schon etwas drin stehen habe, damit ich es filtern kann.
    Verstehe ich das richtig?

    Mir wäre es lieb zu wissen welches Template es ist.
    Also ob es sBIRTHDAY, sARTICLECOMMENT usw. ist.
    Diese Templates stehen z.B. in der Datenbank in s_core_config_mails.

    Die Methode habe ich soweit auch schon gefunden unter
    engine\Shopware\Components\TemplateMail.php -> createMail()
    
    In der Methode übergibt man z.B. "sBIRTHDAY" usw.
    Aber es gibt scheinbar kein Event, dass dort eingreift.

    Aber trotzdem schon einmal vielen Dank für deinen Ansatz.
  • MisengoMisengo MitgliedKommentare: 209 Danke erhalten: 31 Mitglied seit: Dezember 2015
    Die E-Mailadresse für den Empfänger ist in
    $args->get('mail')->getTo()
    
    Es ist ein Array, das die Mailadressen enthält.

    Ok, also dein Ansatz geht davon aus, dass ich in den Mail-Templates schon etwas drin stehen habe, damit ich es filtern kann.
    Verstehe ich das richtig?

    Mir wäre es lieb zu wissen welches Template es ist.
    Also ob es sBIRTHDAY, sARTICLECOMMENT usw. ist.
    Diese Templates stehen z.B. in der Datenbank in s_core_config_mails.

    Die Methode habe ich soweit auch schon gefunden unter
    engine\Shopware\Components\TemplateMail.php -> createMail()
    
    In der Methode übergibt man z.B. "sBIRTHDAY" usw.
    Aber es gibt scheinbar kein Event, dass dort eingreift.

    Aber trotzdem schon einmal vielen Dank für deinen Ansatz.

    Lang lang ists her, geändert hat sich leider noch nichts ^^ - hast du einen Weg gefunden wie du auf dem  Event 

    Enlight_Components_Mail_Send

    den Namen des Templates bekommst? (z.B. sREGISTERCONFIRMATION )

Anmelden oder Registrieren, um zu kommentieren.