正在处理 Typo3 11.5.13
在 be_user 更改某些内容后,我正在尝试更新页面表上的一些数据。 我读过一些关于为此目的设置挂钩的内容,但我似乎找不到关于挂钩如何在 Typo3 中实际运行以及如何配置挂钩的良好解释,特别是为了我的目的。
据我所知,我的这个问题应该很快就能解决,但是typo3文档的复杂性再次阻碍了我的进步。也许你可以解释一下我如何实现我的目标。
简单地说:后端用户应该在日期选择器中选择日期,并在页面设置中选择一些日期间隔。保存后(或者甚至在选择两个值后),我想更新“下次发生”字段,用户可以看到但不更改为更新到给定日期加上所选的日期间隔。
如果您有什么想法请与我分享。
一般来说,钩子没有很好的记录。现代事件更容易找到并得到更好的评论。但是,如果我的用例正确,那么使用 DataHandler Hooks 就是不错的选择。这意味着,每个使用 DataHandler 保存数据的地方都会被覆盖。后端表单引擎正在使用 DataHandler。
核心文档中关于hooks的基本信息:
如何识别或查找钩子、事件、信号槽(取决于TYPO3版本):
简介或“DataHandler”解释:
基本上,DataHandler 有两种主要的处理方式:
process_datamap()
process_cmdmap()
对于 DataHandler,您仅为数据图和/或流程图注册一个类,而不是为具体的钩子本身注册。
// <your-ext>/Classes/Hooks/MyDataHandlerHooks.php
namespace <Vendor>\<YourExt>\Hooks;
class MyDataHandlerHooks {}
// <your-ext>/ext_localconf.php
// -> for cmdmap hooks
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['yourextname']
= \Vendor\YourExt\Hooks\MyDataHandlerHooks::class;
// -> for datamap hooks
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['yourextname']
= \Vendor\YourExt\Hooks\MyDataHandlerHooks::class;
您只需为您想要使用的这些类型的钩子注册您的类。而且您不必实现所有钩子。
可以在
\TYPO3\CMS\Core\DataHandling\DataHandler
中查找钩子(就像通常搜索钩子一样。
下一步是为您的用例找到合适的钩子,然后简单地将该钩子方法添加到您的类中。 DataHandler 钩子的钩子命名不可选择。
TYPO3 核心测试包含 DataHandler 挂钩的测试夹具类 - 该类并不完整,但至少包含自 8.x 以来最常见的类(以及所需的方法签名):
因此,您可能需要查看您的核心版本的版本,以了解该核心版本的签名应如何查看。
一般来说我会猜测这两者之一:
processDatamap_postProcessFieldArray()
:与准备好的字段数组挂钩,您可以简单地添加新内容来编写或更新它,并将其保存。如果您需要直接更改记录,那就太好了。processDatamap_afterDatabaseOperations()
:记录更改后挂钩。如果您在保存记录后需要执行其他操作,这是一个很好的起点。鉴于您的用例,我会提示第一个,因此这里是一个示例实现(在类中并注册为数据映射挂钩,如上所述):
// <your-ext>/Classes/Hooks/MyDataHandlerHooks.php
namespace <Vendor>\<YourExt>\Hooks;
class MyDataHandlerHooks {
/**
* @param string|int $id
*/
public function processDatamap_postProcessFieldArray(
string $status, // Status of the current operation, 'new' or 'update'
string $table, // The table currently processing data for
$id, // The record uid currently processing data for,
// [integer] or [string] (like 'NEW...')
array &$fieldArray, // The field array of a record, cleaned to only
// 'to-be-changed' values. Needs to be &$fieldArray to be considered reference.
DataHandler $dataHandler
): void
{
// $fieldArray may be stripped down to only the real fields which
// needs to be updated, mainly for $status === 'update'. So if you
// need to be sure to have correct data you may have to retrieve
// the record to get the current value, if not provided as with new
// value.
if ($table === 'be_users'
&& $status === 'update'
&& array_key_exists('target_field_name', $fieldArray)
) {
$valueToReactTo = $fieldArray['target_field_name'];
if ($valueToReactTo === 'some-check-value') {
// needs not to be there
$fieldArray['update-field'] = 'my-custom-value';
}
}
}
}