是否可以在更新和 extbase 记录时抑制时间戳更新?
Is it possible to surpress tstamp update when updating and extbase record?
我有一个 TYPO3 扩展(extbase,TYPO3 7.6)和一个控制器 showAction
,我增加给定记录的 viewCounter
属性 然后调用 $repo->update($entity)
在相应的存储库 class 上。
问题是,在本网站的另一个地方,有一个 "changed" 记录的列表,它利用了这些记录的 tstamp
字段。所以现在的问题是,每次加载实体时,计数器都会增加,extbase 内部也会自动更新 tstamp
值。在这种情况下,现在根本不需要。
所以我的问题是:是否可以针对某个查询或一般情况(之后再次激活)停用或绕过此行为?当然,我完全可以绕过 extbase ORM 并自己用纯 SQL 更新该记录,但我认为这是一个不太好的解决方案:-)
类似这样的问题最好通过查看代码来回答:
tstamp
值由 repo update
查询自动更新,因为 addCommonDateFieldsToRow
(called from updateObject
via addCommonFieldsToRow
). This automatism happens if $dataMap->getModificationDateColumnName() !== null
, which happens if the TCA $controlSection['tstamp']
of the respective table is set(通常是这种情况)。
由于缓存了 $dataMap,暂时取消设置 $GLOBALS['TCA']['your_table']['ctrl']['tstamp']
将不起作用。在调用 addCommonDateFieldsToRow
之前似乎没有任何挂钩入口点,也没有(有 emitAfterUpdateObjectSignal
,但这在更新 之后被称为 - 和有 没有 emit*Before*UpdateObjectSignal
).
补救措施可能是实施 UPDATEquery_preProcessAction 挂钩并从 $fields_values
中删除 tstamp
以供您在那里查询。不过,此挂钩将在 每个 TYPO3 更新查询时调用。
另一种解决方法(我经常使用的一种)是扩展 (XCLASS) 有问题的核心代码。在您的情况下,您可以扩展 \TYPO3\CMS\Extbase\Persistence\Generic\Backend::addCommonDateFieldsToRow
并且不为您的特殊域对象添加 tstamp
列。
正如我在对您的问题的评论中所说:与其浪费时间解决 extbase 约定和限制,最好的解决方案通常是使用简单的 SQL.
绕过 extbase ORM
PS:您还可以考虑更改数据模型并将视图计数器移动到单独的 table。
我有一个 TYPO3 扩展(extbase,TYPO3 7.6)和一个控制器 showAction
,我增加给定记录的 viewCounter
属性 然后调用 $repo->update($entity)
在相应的存储库 class 上。
问题是,在本网站的另一个地方,有一个 "changed" 记录的列表,它利用了这些记录的 tstamp
字段。所以现在的问题是,每次加载实体时,计数器都会增加,extbase 内部也会自动更新 tstamp
值。在这种情况下,现在根本不需要。
所以我的问题是:是否可以针对某个查询或一般情况(之后再次激活)停用或绕过此行为?当然,我完全可以绕过 extbase ORM 并自己用纯 SQL 更新该记录,但我认为这是一个不太好的解决方案:-)
类似这样的问题最好通过查看代码来回答:
tstamp
值由 repo update
查询自动更新,因为 addCommonDateFieldsToRow
(called from updateObject
via addCommonFieldsToRow
). This automatism happens if $dataMap->getModificationDateColumnName() !== null
, which happens if the TCA $controlSection['tstamp']
of the respective table is set(通常是这种情况)。
由于缓存了 $dataMap,暂时取消设置 $GLOBALS['TCA']['your_table']['ctrl']['tstamp']
将不起作用。在调用 addCommonDateFieldsToRow
之前似乎没有任何挂钩入口点,也没有(有 emitAfterUpdateObjectSignal
,但这在更新 之后被称为 - 和有 没有 emit*Before*UpdateObjectSignal
).
补救措施可能是实施 UPDATEquery_preProcessAction 挂钩并从 $fields_values
中删除 tstamp
以供您在那里查询。不过,此挂钩将在 每个 TYPO3 更新查询时调用。
另一种解决方法(我经常使用的一种)是扩展 (XCLASS) 有问题的核心代码。在您的情况下,您可以扩展 \TYPO3\CMS\Extbase\Persistence\Generic\Backend::addCommonDateFieldsToRow
并且不为您的特殊域对象添加 tstamp
列。
正如我在对您的问题的评论中所说:与其浪费时间解决 extbase 约定和限制,最好的解决方案通常是使用简单的 SQL.
绕过 extbase ORMPS:您还可以考虑更改数据模型并将视图计数器移动到单独的 table。