2015-05-30 13 views
6

Tôi có một tiện ích mở rộng Extbase hoạt động trong TYPO3 V6.2, lưu trữ Sản phẩm. Bây giờ tôi muốn tìm hiểu về cách sử dụng Signal/Slot (biến thể Extbase của Hooks). Tôi tự hỏi tại sao ví dụ này không hiệu quả. Khi tôi cập nhật một sản phẩm trong mô-đun Danh sách trong Phụ lục TYPO3, nó sẽ lưu chính xác nhưng không có thông báo nào xuất hiện.TYPO3 Extbase - cách sử dụng Tín hiệu/Slots lõi

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/Dịch vụ/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(); 

      } 

    } 

} 


Cập nhật 15.06 .2015
Một gợi ý từ Patrick Lobacher nhận xét, rằng chúng ta không thể sử dụng die() trong bối cảnh này. Thay vào đó, chúng ta nên viết một logfile. Nhưng điều đó cũng không hiệu quả với tôi. Không có tập tin đã được viết:

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

    }); 


Cập nhật 29.06.2015
On https://forge.typo3.org/issues/61979 Francois đã viết, rằng "Object Manager có thể chỉ được sử dụng trong Extbase Context, không phải trong ext_localconf.php ". Tuy nhiên, câu trả lời nhất định thậm chí không làm việc cho tôi. Nhưng có lẽ nó giúp người khác.

Trả lời

3

Hiện nay không có tài liệu chính thức, nhưng trong vấn đề này bạn có thể tìm thấy tài liệu không chính thức: https://forge.typo3.org/issues/59089

Vấn đề là bạn đang sử dụng tín hiệu Slots của Extbase trong danh sách Module. Trong 6.2 danh sách Module không được thực hiện bằng cách sử dụng Extbase. Vì vậy, không có Slots bạn có thể sử dụng. Thay vào đó bạn cần phải làm theo cái cũ, tài liệu, cách sử dụng Hooks: https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Hooks/Concept/Index.html

Trong trường hợp của bạn, đoạn code sau sẽ làm việc như một điểm nhập cảnh:

ext_localconf.php:

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

Ở đó bạn cấu hình lớp để sử dụng như Hook cho t3lib_tcemain Classname cũ trước khi TYPO3 6.2 xử lý nhiều hơn thì chỉ là dữ liệu cho Chế độ xem danh sách.

Bên trong lớp học của bạn, bạn có thể thực hiện mã của bạn như đã được thực hiện bởi bạn:

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

Và vâng, bạn có thể dùng die trong bối cảnh này, để gỡ lỗi và như vậy. Như TYPO3 chỉ sẽ lặp qua các móc cấu hình và gọi các phương thức. Vì vậy, không có gì lạ mắt ở đây. Bạn nhận được một số thông số được xác định bằng cách triển khai và có thể làm việc với chúng.

Trong ví dụ trên, có một kiểm tra chỉ thực thi móc nếu bảng và hành động khớp. Vì mã này được gọi vì nhiều lý do bạn đảm bảo đưa vào danh sách trắng, để chỉ thực thi trong các môi trường mà bạn biết. Vì lý do bảo mật và hiệu suất.

+2

Về móc, tín hiệu và khe cắm, gần đây tôi đã viết một hướng dẫn ngắn: https://usetypo3.com/signals-and-hooks-in-typo3.html – Daniel

Các vấn đề liên quan