2015-05-30 17 views
6

Ho un'estensione Extbase funzionante in TYPO3 V6.2, che memorizza i prodotti. Ora voglio imparare a usare Signal/Slot (variante Extbase di Hooks). Mi chiedo perché l'esempio non funzioni. Quando aggiorno un prodotto nel modulo Elenco nel backend di TYPO3, esso viene salvato correttamente ma non viene visualizzato alcun messaggio.TYPO3 Extbase - come utilizzare il core Signal/Slot

File 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 
); 

File typo3conf/ext/myext/servizio/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(); 

      } 

    } 

} 


Aggiornamento 15.06 .2015
Un accenno di Patrick Lobacher ha osservato che non possiamo usare die() in questo contesto. Invece, dovremmo scrivere un logfile. Ma non funziona nemmeno per me. Nessun file è stato scritto:

File 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); 

    }); 


Aggiornamento 29.06.2015
Su https://forge.typo3.org/issues/61979 Francois ha scritto, che "Object Manager può essere usato solo in contesto extbase, non in ext_localconf.php ". Tuttavia, anche la risposta data non funziona per me. Ma forse aiuta qualcun altro.

risposta

3

Attualmente non v'è alcuna documentazione ufficiale, ma nel numero si possono trovare la documentazione non ufficiale: https://forge.typo3.org/issues/59089

Il problema è che si sta utilizzando segnale Slot di Extbase nella lista modulo. In 6.2 l'elenco del modulo non è implementato usando Extbase. Quindi non ci sono slot che puoi usare. Invece è necessario seguire le vecchie, documentati, in modo personalizzato tramite Ganci: https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Hooks/Concept/Index.html

nel tuo caso, il seguente codice dovrebbe funzionare come un punto di ingresso:

ext_localconf.php:

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

Ci si configura la classe da utilizzare come Hook per t3lib_tcemain il vecchio Classname prima che TYPO3 6.2 gestisca più quindi solo i dati per la Visualizzazione elenco.

All'interno della classe è possibile implementare il codice come già fatto da voi:

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; 
    } 
} 

E sì, è possibile utilizzare die in questo contesto, per il debug e così via. Poichè TYPO3 esegue semplicemente iterazioni sugli hook configurati e chiama i metodi. Quindi niente di speciale qui. Ottieni alcuni parametri definiti dall'implementazione e puoi lavorare con loro.

Nell'esempio precedente c'è un solo controllo per eseguire il gancio se la tabella e l'azione corrispondono. Poiché questo codice viene chiamato per molte ragioni, assicurati di inserirlo nella whitelist, per eseguire solo gli ambienti che conosci. Per motivi di sicurezza e prestazioni.

+2

Per quanto riguarda Hook, Segnali e Slot, di recente ho scritto un breve tutorial: https://usetypo3.com/signals-and-hooks-in-typo3.html – Daniel