我有一个A实体,该实体具有从B到A的关系1:B的属性调用B。当我在TCA后端接口中更新A时,当某个特定字段处于活动状态时,解决方案会运行{ 1}}
我必须创建B的新元素并保存在A的ObjectStorage属性中。这在执行时起作用,创建对象并附加它,但不能保存在DB中。我已经尝试过extbase和Repository的功能,但是它不起作用。在我的研究中,确定了用于创建查询的框架学说,类似于持久性行为,但是在这种情况下,我可以保存B的新对象。
我的问题是:如何使用Doctrine进行构建查询,该查询允许对对象A进行更新,添加新元素B并将该元素保存在DB中的关系中。
我正在使用TYPO3 7.6
答案 0 :(得分:3)
您不应在DataHandler挂钩中使用Extbase。同样,普通的数据库查询(都不使用Dotrine或TYPO3_DB)也不是在BE中创建实体的好主意。更好的方法是使用TYPO3 DataHandler API。在实体A的创建/编辑过程中创建实体B的示例看起来像这样。
注册挂钩 typo3conf / ext / example / ext_localconf.php
defined('TYPO3_MODE') || die('Access denied.');
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass']['example'] = 'Vendor\\Example\\DataHandling\\DataHandler';
typo3conf / ext / example / Classes / DataHandling / DataHandler.php
namespace Vendor\Example\DataHandling;
use TYPO3\CMS\Core\SingletonInterface;
use TYPO3\CMS\Core\Utility\StringUtility;
class DataHandler implements SingletonInterface
{
public function processDatamap_afterDatabaseOperations(
string $status,
string $table,
$id,
$fieldArray,
\TYPO3\CMS\Core\DataHandling\DataHandler $dataHandler
) {
// Do nothing if other table is processed
if ($table !== 'tx_example_domain_model_entitya') {
return;
}
// Get real UID of entity A if A is new record
$idOfEntityA = $dataHandler->substNEWwithIDs[$id];
// Example fields of entity B
$entityB = [
'sys_language_uid' => '0',
'entitya' => $idOfEntityA,
'hidden' => '0',
'title' => 'I\'m entitty B',
'starttime' => '0',
'endtime' => '0',
'pid' => $fieldArray['pid'],
];
// Add entity B associated with entity A
$dataHandler->start(
[
'tx_example_domain_model_entityb' => [
StringUtility::getUniqueId('NEW') => $entityB
]
],
[]
);
$dataHandler->process_datamap();
}
}
在8.7上进行了测试,但在7.6上也可以使用。在这里,您可以了解有关DataHandler https://docs.typo3.org/typo3cms/CoreApiReference/8.7/ApiOverview/Typo3CoreEngine/Database/
的更多信息答案 1 :(得分:2)
与先前的回答相反,我没有理由,为什么不应该在DataHandler Hooks中使用extbase。我自己在扩展中完成了动态对象,这些对象通过SOAP-Webservice进行同步。
您需要记住一些事情(在挂钩函数中按此顺序):
-服从命名政策! -通过GeneralUtility :: makeInstance手动实例化ObjectManager -手动获取所有存储库(我实际上是指所有所有..以及在挂钩函数中正在使用的模型子存储库)。 -使用对象管理器=>(而不是“新”)创建新的对象实例。
然后,您可以按照惯常的方式将孩子添加到父母中。.但不要忘记最后通过persistenceManager手动执行persistAll()。
希望这会有所帮助。基本上,通过DataMap Hook挂钩的函数就像通过ajax =>调用的静态函数一样,您必须确保手动获取所有所需的实用程序和管理类,因为typo3不会自动注入它们。
希望这会有所帮助, 奥利弗