Zum Inhalt springen

Powermail 2.0.19 und Signalslots

Erstellt am 13. Februar 2015 · 5 Antworten · letzte Antwort am 24. Februar 2015

Tags: Extbase, Powermail, TYPO3 6.x, Frage

fahn ·

Hallo *,

ich habe eine Typo3-Webseite in der Version 6.1.12 am laufen. In dieser kommt auch powermail 2.0.19 zum Einsatz. In einem Formular möchte ich gerne, dass nach dem Eintragen, Validieren ein Wert vor dem Versenden in Speichern in die DB manipuliert wird. Dazu habe ich die SignalSlots genutzt: Tx_Powermail_Controller_FormsController

Damit ich wie gewünscht auf die Felder vor dem Versenden und Speichern in die DB darauf zugreifen kann.

Folgenden Code habe ich erstellt und das funktioniert auch in den DEBUG-Ausgaben, aber leider arbeitet er danach nicht mit dem neuen Wert, sondern wieder mit dem alten:

class Tx_Powermailext_receiver extends Tx_Powermail_Controller_FormsController {
  function callMe($field, $form, $mail, $controller) {
        \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($field); // Wert mit dem Index 75: 2
        $field[75] = 3; // Vorher war der Wert 2 und er soll auf 3 manipuliert werden
        \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($field);  // Wert mit dem Index 75: 3
  }
}
// Ich werde da später natürlich eine andere Funktion hinterlegen aber zur Ansicht reicht das ja :)

Was kann ich da tun, dass auch danach der Wert die Zahl 3 hat ?

// EDIT
Wenn ich in der Datei beim Aufruf des Signal Slots den Wert ändere, dann funktioniert das:

$this->signalSlotDispatcher->dispatch(__CLASS__, __FUNCTION__ . 'BeforeRenderView', array($field, $form, $mail, $this));
            $field[75] = 3;

Gruß,
fahn

einpraegsam.​net ·

Ich habe im Handbuch der aktuellen Version von powermail beschrieben, wie man Werte ändern kann - siehe http://docs.typo3.org/typo3cms/extensions/powermail/ForDevelopers/SignalSlots/Index.html
Dort wird zwar nur die Mail-Adresse geändert, aber genauso sollten sich Werte beim Speichern überschreiben lassen.

Für die alte Version habe ich kein Beispiel parat, aber was ist wenn du den Slot CreateActionAfterSubmitView nutzt und dort das Mail-Object direkt änderst?

Ganz davon abgesehen, dass die verwendete TYPO3-Version keine Sicherheitsupdates mehr erhält und du dringend auf 6.2 updaten solltest.

fahn ·

Hey,
danke erst einmal für die Antwort! Also die SignalSlots gab es auch schon in 2.0.x ... Daher funktioniert der Ansatz. Ich nutze diesen einen ja auch ..
Laut dem Code(FormController.php) ist dort sogar der beschriebene sogar vorhanden, nur funktionieren tut er nach meiner Ansicht nicht! Wenn ich um die Zeile wo der SignalSlot aufgerufen wird die Werte von Hand wie im 2. Code-Auschnitt verändere, dann klappt dies ja ...

PS: Nicht jede HP verträgt 6.2 und die Updates
PS2: mittlerweile ist auch powermail 2.0.20 raus gekommen ... Trotzdem keine Änderung

fahn ·

Hey,
also ich habe zum test mal auf 6.2.9 geupgraded + die aktuelle powermail 2.1.x -Version am laufen.
Da klappt das Beispiel was du verlinkt hast, aber wenn ich das einfach auf meine Thematik anpasse, dann klappt das nicht! Könnte es sein, dass dort ein Fehler im Code exisiert ? Weil nicht nur der Signal-Slot funktioniert aus der Klasse FormController nicht 🙁

Hier mein Code:

ext_localconf.php

// klappt nicht
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\SignalSlot\Dispatcher');
$signalSlotDispatcher->connect(
    '\In2code\Powermail\Controller\FormController',
    'createActionBeforeRenderView',
    'In2code\Powermailext\Utility\SendMail',
    'callMe',
    FALSE
);

// klappt nicht
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\SignalSlot\Dispatcher');
$signalSlotDispatcher->connect(
    '\In2code\Powermail\Controller\FormController',
    'formActionBeforeRenderView',
    'In2code\Powermailext\Utility\SendMail',
    'callMe',
    FALSE
);

// klappt
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\SignalSlot\Dispatcher');
$signalSlotDispatcher->connect(
    'In2code\Powermail\Utility\SendMail',
    'sendTemplateEmailBeforeSend',
    'In2code\Powermailext\Utility\SendMail',
    'manipulateMail',
    FALSE
);

sendMail.php

<?php
namespace In2code\powermailext\Utility;

/**
 * SendMail
 *
 * @package powermailextend
 * @license http://www.gnu.org/licenses/lgpl.html
 *                  GNU Lesser General Public License, version 3 or later
 */
class SendMail {

    /**
     * @param \TYPO3\CMS\Core\Mail\MailMessage $message
     * @param array $email
     * @param \In2code\Powermail\Domain\Model\Mail $mail
     * @param array $settings
     * @param string $type Email to "sender" or "receiver"
     */
    public function manipulateMail($message, $email, $mail, $settings, $type) {
        die("manipulateMail");
    }
    
    function callMe($field, $form, $mail, $controller) {
        die("callme");
    }
}
?>

Mir ist klar, dass sich das eine DIE auf das andere auswirkt, daher habe ich zum testen jeweils das andere DIE auskommentiert. Aber wenn nur die("callme") aktiv ist, dann läuft das form einwandfrei durch! Was ja nicht sein dürfte!

Gruß,

// Nachtrag
Hier noch etwas aus dem var_dump von der Variable $this->signalSlotDispatcher nach dem Aufruf vom Signal Slot in der Datei FormController.php (Zeile ~115[direkt nach dem Aufruf des SignalSlots in der Methode createAction])

TYPO3\CMS\Extbase\SignalSlot\Dispatchersingletonobject
   isInitialized => TRUE
   objectManager => TYPO3\CMS\Extbase\Object\ObjectManagersingletonobjectfiltered
   slots => array(5 items)
      TYPO3\CMS\Core\Resource\ResourceStorage => array(1 item)
      TYPO3\CMS\Core\Resource\Index\MetaDataRepository => array(1 item)
      TYPO3\CMS\Install\Service\SqlExpectedSchemaService => array(1 item)
      \In2code\Powermail\Controller\FormController => array(2 items)
         createActionBeforeRenderView => array(1 item)
            0 => array(4 items)
               class => 'In2code\Powermailext\Utility\SendMail' (38 chars)
               method => 'callme' (6 chars)
               object => NULL
               passSignalInformation => FALSE
         formActionBeforeRenderView => array(1 item)
            0 => array(4 items)
               class => 'In2code\Powermailext\Utility\SendMail' (38 chars)
               method => 'callme' (6 chars)
               object => NULL
               passSignalInformation => FALSE
      In2code\Powermail\Utility\SendMail => array(1 item)
         sendTemplateEmailBeforeSend => array(1 item)
            0 => array(4 items)
               class => 'In2code\Powermailext\Utility\SendMail' (38 chars)
               method => 'manipulateMail' (14 chars)
               object => NULL
               passSignalInformation => FALSE