首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TYPO3 Extbase -如何使用核心信号/插槽

TYPO3 Extbase -如何使用核心信号/插槽
EN

Stack Overflow用户
提问于 2015-05-30 09:22:41
回答 1查看 2.7K关注 0票数 6

我在TYPO3 V6.2中有一个Extbase扩展,它存储产品。现在我想学习如何使用信号/插槽(钩子的Extbase变体)。我不知道为什么这个例子行不通。当我更新TYPO3后端列表模块中的产品时,它会正确保存,但不会显示任何消息。

文件typo3conf/ext/myext/ext_localconf.php

代码语言:javascript
复制
$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
);

文件typo3conf/ext/myext/Service/Signalservice.php

代码语言:javascript
复制
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();

            }   

    }

}

更新15.06.2015

Patrick的一个提示是,我们不能在这种情况下使用die()。相反,我们应该编写一个日志文件。但这对我也不起作用。没有编写任何文件:

文件typo3conf/ext/myext/ext_localconf.php

代码语言:javascript
复制
/** 
 * @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);

   });

更新29.06.2015

https://forge.typo3.org/issues/61979上,Francois写道,“对象管理器只能在Extbase上下文中使用,而不能在ext_localconf.php中使用”。然而,给出的答案甚至对我不起作用。但也许这对其他人有帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-22 12:40:29

目前还没有正式的文档,但是在这个问题上您可以找到非官方文档:https://forge.typo3.org/issues/59089

问题是您正在使用列表模块中Extbase的信号插槽。在6.2中,没有使用Extbase实现列表模块。所以没有你可以使用的插槽。相反,您需要遵循旧的、有文档记录的使用钩子的方式:https://docs.typo3.org/typo3cms/CoreApiReference/ApiOverview/Hooks/Concept/Index.html

在您的示例中,以下代码应该用作入口点:

ext_localconf.php

代码语言:javascript
复制
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][$_EXTKEY]
    = 'Vendor\ExtName\Hook\DataMapHook';

在这里,您将类配置为用于t3lib_tcemain的Hook,即TYPO3 6.2之前的旧类名,处理更多的列表视图数据。

在类中,您可以实现代码,就像您已经完成的那样:

Classes/Hook/DataMapHook.php

代码语言:javascript
复制
<?php
namespace Vendor\ExtName\Hook;

/**
 * Hook to process updated records.
 *
 * @author Daniel Siepmann <d.siepmann@web-vision.de>
 */
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;
    }
}

是的,您可以在这个上下文中使用die进行调试等等。因为TYPO3只会在配置的钩子上迭代并调用方法。所以这里没什么花哨的。您可以获得一些由实现定义的参数,并可以使用它们。

在上面的示例中,只有在表和操作匹配的情况下才执行钩子。由于许多原因,调用此代码时,请确保将其白名单,只在您所知道的环境中执行。出于安全和性能方面的原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30544422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档