我有一个TYPO3扩展(extbase,TYPO3 7.6),在控制器showAction
内,我增加了给定记录的viewCounter
属性,然后在相应的存储库上调用$repo->update($entity)
类。
问题是,在本网站的另一个地方,有一个“已更改”记录列表,它使用这些记录的tstamp
字段。所以现在的问题是,每次加载实体时,计数器都会增加,而extbase内部也会自动更新tstamp
值。在这种情况下,现在根本就是需要的。
所以我的问题是:是否可以为某个查询停用或绕过此行为,或者一般情况下(之后再次激活它)?当然,我可以完全绕过extbase ORM和用我自己的普通SQL更新该记录,但我认为这是一个不太好的解决方案: - )
答案 0 :(得分:1)
通过查看代码可以最好地回答这样的问题:
由于addCommonDateFieldsToRow
(从updateObject
通过addCommonFieldsToRow
调用),回复tstamp
查询会自动更新update
值。如果$dataMap->getModificationDateColumnName() !== null
发生if the TCA $controlSection['tstamp']
of the respective table is set(通常就是这种情况),就会发生这种自动现象。
由于$ dataMap已缓存,暂时取消设置$GLOBALS['TCA']['your_table']['ctrl']['tstamp']
将无效。在addCommonDateFieldsToRow
被调用之前似乎没有任何钩子入口点(有emitAfterUpdateObjectSignal
,但在更新后称为 - 并且有< em>没有 emit*Before*UpdateObjectSignal
)。
补救措施可能是实施UPDATEquery_preProcessAction摘要,并从tstamp
中移除$fields_values
以查询您的查询。这个钩子将被调用每个 TYPO3更新查询。
另一种解决方法(我经常使用的一种)是扩展(XCLASS)有问题的核心代码。在您的情况下,您可以扩展\TYPO3\CMS\Extbase\Persistence\Generic\Backend::addCommonDateFieldsToRow
,不要为您的特殊域对象添加tstamp
列。
正如我在你对你的问题的评论中所说:最好的解决方案通常是绕过extbase规则和限制,而不是浪费时间来处理extbase规则和限制。
PS:您可能还会考虑更改数据模型并将视图计数器移动到单独的表中。