读出受保护属性TYPO3 \ CMS \ Core \ DataHandling \ DataHandler :: $ historyRecords的值

时间:2016-09-16 10:12:25

标签: typo3

我正在将TYPO3安装从v6更新到v7并且遇到类TYPO3\CMS\Core\DataHandling\DataHandler的问题

https://typo3.org/api/typo3cms/class_t_y_p_o3_1_1_c_m_s_1_1_core_1_1_data_handling_1_1_data_handler.html)。

我收到以下错误:

  

致命错误:无法访问受保护的属性   TYPO3 \ CMS \ Core \ DataHandling \ DataHandler :: $ historyRecords ...

由以下电话引起

public function processCmdmap_afterFinish(&$data)
{
    $dataChanged = $data->historyRecords;

有谁能告诉我在TYPO3 v7中你如何获得historyRecords的价值?

提前致谢!!!

1 个答案:

答案 0 :(得分:2)

DataHandler::$historyRecords未在TYPO3 6.2中定义为属性,但由DataHandler内的类成员访问隐式设置(请参阅DataHandler of 6.2)。在TYPO3 7.6中,属性已首次声明,并定义为protected

可以将$historyRecords数组视为更改模式,包含oldRecordnewRecord,用于DataHandler的特定调用。这可以看作是RecordDataChangedEvent的内容 - 在TYPO3中不存在这种方式。该信息收集在DataHandler::compareFieldArrayWithCurrentAndUnset()

要获取信息,您可以在TYPO3 7.6中找到三种可能性:

  1. 通过XCLASSing重载DataHandler并提供getHistoryRecords()方法
    • XCLASSing基本上是一个错误的原则,因为您可以覆盖功能 在上游版本中可能会更改。在这种情况下它会“好” 因为你只提供了一个在
    • 之前不存在的新getter方法
    • XCLASS documentation
    • 中查找更多详情
  2. 使用挂钩自行收集和确定更改
    • processDatamap_preProcessFieldArray($incomingFieldArray, $table, $id, DataHandler $dataHandler)
    • processDatamap_postProcessFieldArray($status, $table, $id, $fieldArray, DataHandler $dataHandler)
    • 针对$incomingFieldArray$fieldArray
    • 的组合,将$table$id进行比较,收集单身对象的差异
    • 然而,这留下了可能在
    • 之间应用于字段数组的版本和阴影交互
  3. 从数据库表sys_history中检索
    • 请参阅DataHandler::setHistory()并进行反向查找
    • 在调用processCmdmap_afterFinish挂钩时,此数据已经写入
    • sys_history查找以下条件的组合
      • tstamp等于$GLOBALS['EXEC_TIME']
      • tablename等于$tablerecuid等于$id
    • 字段history_data包含$historyRecords
    • 的序列化表示