2015-05-30 10 views
6

Ich habe eine funktionierende Extbase-Erweiterung in TYPO3 V6.2, die Produkte speichert. Jetzt möchte ich über die Verwendung von Signal/Slot (Extbase-Variante von Hooks) lernen. Ich frage mich, warum das Beispiel nicht funktioniert. Wenn ich ein Produkt im List-Modul im TYPO3-Backend aktualisiere, wird es korrekt gespeichert, aber es wird keine Nachricht angezeigt.TYPO3 Extbase - wie Core Signal/Slots zu verwenden

Datei typo3conf/ext/myext/ext_localconf.php

$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher'); 
$signalSlotDispatcher->connect(
    'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Backend', 
    'afterUpdateObject', 
    'MyVendor\\MyExt\\Service\\Signalservice',  
    'myAfterUpdate', 
    FALSE 
); 

Datei typo3conf/ext/myext/Service/Signalservice.php

namespace MyVendor\MyExt\Service; 

class Signalservice implements \TYPO3\CMS\Core\SingletonInterface { 

    /** 
    * @param \TYPO3\CMS\Extbase\DomainObject\DomainObjectInterface $object 
    */ 
    public function myAfterUpdate(\TYPO3\CMS\Extbase\DomainObject\DomainObjectInterface $object){ 

      if ($object instanceof \MyVendor\MyExt\Domain\Model\Products) { 

       // check if we come to this point 
       \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump('Successfully hooked - I am a slot.'); 
       die(); 

      } 

    } 

} 


-Update 15.06 .2015
Ein Hinweis von Patrick Lobacher bemerkte, dass wir in diesem Zusammenhang nicht sterben() verwenden können. Stattdessen sollten wir eine Logdatei schreiben. Aber das funktioniert auch nicht für mich. Keine Datei geschrieben wurde:

Datei typo3conf/ext/myext/ext_localconf.php

/** 
* @var \TYPO3\CMS\Extbase\SignalSlot\Dispatcher $signalSlotDispatcher 
* */ 
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Object\\ObjectManager')->get('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher'); 
$signalSlotDispatcher->connect(
    'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Backend', 
    'afterUpdateObject', 
    function ($payload) { 

     $logfile = "fileadmin/test/logfile.txt"; 
     $handle = fopen($logfile, "a+"); 
     fwrite ($handle, 'Hi. I was written by ext_localconf.php. ' . time()); 
     fclose ($handle); 

    }); 


-Update 29.06.2015
Auf https://forge.typo3.org/issues/61979 Francois schrieb, dass „Object Manager kann nur im Extbase Context, nicht in ext_localconf.php ". Allerdings funktioniert die gegebene Antwort auch nicht für mich. Aber vielleicht hilft es jemand anderem.

Antwort

3

Derzeit gibt es keine offizielle Dokumentation, aber in der Ausgabe können Sie inoffizielle Dokumentation: https://forge.typo3.org/issues/59089

Das Problem ist, dass Sie Signal Slots von Extbase in Listenmodul verwenden. In 6.2 ist das Listenmodul nicht mit Extbase implementiert. Es gibt also keine Slots, die du benutzen kannst. Stattdessen müssen Sie das alte, dokumentierte, Art und Weise mit Hooks folgen: https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Hooks/Concept/Index.html

In Ihrem Fall der folgende Code sollte als Einstiegspunkt arbeiten:

ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][$_EXTKEY] 
    = 'Vendor\ExtName\Hook\DataMapHook'; 

Es Sie konfigurieren Die Klasse, die als Hook für t3lib_tcemain den alten Klassennamen verwendet, bevor TYPO3 6.2 mehr als nur die Daten für die Listenansicht behandelt.

Innerhalb Ihrer Klasse können Sie Ihren Code implementieren, wie bereits von Ihnen getan:

Classes/Hook/DataMapHook.php:

<?php 
namespace Vendor\ExtName\Hook; 

/** 
* Hook to process updated records. 
* 
* @author Daniel Siepmann <[email protected]> 
*/ 
class DataMapHook 
{ 

    /** 
    * Hook to add latitude and longitude to locations. 
    * 
    * @param string $action The action to perform, e.g. 'update'. 
    * @param string $table The table affected by action, e.g. 'fe_users'. 
    * @param int $uid The uid of the record affected by action. 
    * @param array $modifiedFields The modified fields of the record. 
    * 
    * @return void 
    */ 
    public function processDatamap_postProcessFieldArray(
     $action, $table, $uid, array &$modifiedFields 
    ) { 
     if(!$this->executeHook($table, $action)) { 
      return; 
     } 

     // check if we come to this point 
     \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump('Successfully hooked - I am a slot.'); 
     die(); 
    } 

    /** 
    * Check whether to execute hook or not. 
    * 
    * @param string $table 
    * @param string $action 
    * @param array $modifiedFields 
    * 
    * @return bool 
    */ 
    protected function executeHook($table, $action) 
    { 
     // Do not process if foreign table, unintended action, 
     // or fields were changed explicitly. 
     if ($table !== 'tx_extname_domain_model_modelname' || $action !== 'update') { 
      return false; 
     } 

     return false; 
    } 
} 

Und ja, können Sie die in diesem Zusammenhang verwenden, für die Fehlersuche und so weiter. Da TYPO3 einfach über die konfigurierten Hooks iteriert und die Methoden aufruft. Also nichts Schickes hier. Sie erhalten einige durch die Implementierung definierte Parameter und können mit ihnen arbeiten.

Im obigen Beispiel gibt es einen Haken, um den Haken nur auszuführen, wenn Tabelle und Aktion übereinstimmen. Da dieser Code aus vielen Gründen aufgerufen wird, stellen Sie sicher, dass Sie ihn auf die Whitelist setzen, damit er nur in Umgebungen ausgeführt wird, die Sie kennen. Aus Sicherheits- und Leistungsgründen.

+2

In Bezug auf Hooks, Signale und Slots habe ich vor kurzem eine kurze Anleitung geschrieben: https://usetypo3.com/signals-and-hooks-in-typo3.html – Daniel

Verwandte Themen