DataHandler在TYPO3的是使用下面的數組結構來創建新的或更新現有記錄 - 這是有效直至幷包括TYPO3 CMS 8:
$dataMap = ['<table-name>' => ['<record-uid>' => ['<field-name>' => '<field-value>']]
現有的記錄使用記錄的uid
的整數值字段,例如123
,新記錄使用以NEW
爲前綴的一些隨機但唯一的標識符,例如, NEWa2b3c4f8
由uniqid('NEW', true)
創建 - 與TYPO3 CMS 7 StringUtility::getUniqueId('NEW')
也可用於此目的。
通用實例
假設以下記錄將被創建: *在表中的新內容元素tt_content
*兩個新的在線文件表sys_file_reference
現場tt_content.image
+參考現有sys_file
紀錄UID引用123
+參考現有sys_file
紀錄UID 234
$ttContentId = 'NEW58d5079c8741c8.22627844'; // uniqid('NEW', true)
$fileRefId1st = 'NEW58d506f3cd0c41.59344142'; // uniqid('NEW', true)
$fileRefId2nd = 'NEW58d50714c12260.92562338'; // uniqid('NEW', true)
準備數據映射
哈瓦仔細看到tt_content.image
,這實際上是定義(新的)的內聯的引用,由新記錄或現有記錄的逗號分隔值定義 - 這可能要麼是NEWabc,NEWdef
,123,234,345
或NEWabc,123,NEWdef
,混合新的和現有的記錄參考。
$dataMap = [
'tt_content' => [
'NEW58d5079c8741c8.22627844' => [
'title' => 'My new content element',
'bodytext' => 'Look at the following images...',
'CType' => 'textpic',
// $fileRefId1st & $fileRefId2nd, the sorting order is defined by this as well
'image' => 'NEW58d506f3cd0c41.59344142,NEW58d50714c12260.92562338',
],
],
'sys_file_reference' => [
'NEW58d506f3cd0c41.59344142' => [
'uid_local' => 123,
'title' => 'Image #123',
],
'NEW58d50714c12260.92562338' => [
'uid_local' => 234,
'title' => 'Image #234',
],
]
];
準備命令映射
// the command-maps is similar to the data-map to copy, localize, move records
// however, it's not required in this scenario and thus stays empty
$commandMap = [];
執行的DataHandler
$dataHandler = new \TYPO3\CMS\Core\DataHandling\DataHandler();
$dataHandler->start($dataMap, $commandMap);
$dataHandler->process_datamap();
// $dataHandler->process_cmdmap(); // if $commandMap should be processed as well
如果你需要創建的記錄uid
,這可以從內部的DataHandler記錄映射來解決。例如,下面的代碼解析所創建tt_content
記錄的新uid
:
$ttContentId = $dataHandler->substNEWwithIDs['NEW58d5079c8741c8.22627844']; // e.g. 333
注
定義的參考字段tt_content.image
,它可以包含NEW...
IDS以及在例如發生上述的直接現有的整數ID。對於該行爲是在TYPO3所有引用類型是相同的:
- TCA類型
inline
,對於所有變體(普通紙,foreign_field
,MM
)
- TCA類型
select
,對於所有變體(普通紙,MM
)
- TCA類型
group
,對於所有變體(普通紙,MM
)通過DataHandler
確保日誌條目
傳遞數據創建,而且在大多數情況下,修改可以使用TYPO3的歷史/回滾模塊進行恢復。
除此之外,還可以執行批量操作 - DataHandler
的調用不僅限於聚合(上述示例中的tt_content
記錄)。但是,NEW...
ID必須是唯一的,並且在批量執行期間不得重複使用以避免副作用。
轉化到table_a
& table_b
場景
轉化這個最初的問題的table_a
和table_b
情況下,$dataMap
可能看起來像下面這樣。當然,您必須確定哪些對table_b
的引用綁定到table_a
。
$dataMap = [
// existing records of table_a, thus using the real ids
'table_a' => [
'11' => [ 'reference_field' => 'NEW_b_1,NEW_b_2' ],
'22' => [ 'reference_field' => 'NEW_b_3,NEW_b_4' ],
'33' => [ 'reference_field' => 'NEW_b_5,NEW_b_6' ],
],
// new records to be references for table_b, thus using NEW... ids
'table_b' => [
'NEW_b_1' => [ ... field values of this particular table_b record ... ],
'NEW_b_2' => [ ... field values of this particular table_b record ... ],
'NEW_b_3' => [ ... field values of this particular table_b record ... ],
'NEW_b_4' => [ ... field values of this particular table_b record ... ],
'NEW_b_5' => [ ... field values of this particular table_b record ... ],
'NEW_b_6' => [ ... field values of this particular table_b record ... ],
],
];
您不必通過記錄創建數據記錄,但是對於批量執行,您必須確保這些'NEW ...'ID是唯一的,不能用於不同的記錄數據。 –