duanhuang2150 2018-07-20 05:32
浏览 63
已采纳

如何在TYPO3的钩子中更新关系1:n的对象

I have an A entity and this have a property call B as relation 1:n from B to A. When I update A in TCA backend interface, when an particular field is active, the solution runs a hook of type function processDatamap_postProcessFieldArray (...)

I have to create a new element of B and save in ObjectStorage attribute of A. This works in execute time, create an objet and attaching it, but can not save in DB. I have tried with functions of extbase and Repository but it does not work. In my reserch identified the framework Doctrine for create queries, similar to persistence behavior, but in this case I could save the new object of B.

My question is: how could I use Doctrine for build query that allows to make update for object A, adding the new element B and save this element in the relation in DB.

I am working with TYPO3 7.6

  • 写回答

2条回答 默认 最新

  • doulv1760 2018-07-20 07:32
    关注

    You shouldn't use Extbase within the DataHandler hooks. Also plain database queries (neither with Dotrine or TYPO3_DB) are not good idea for creating entities within BE. Better way is to use TYPO3 DataHandler API. Example creation of Entity B during create/edit of Entity A could look like that.

    Register hook 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();
        }
    }
    

    Tested on 8.7, but will work on 7.6 too. Here you can read more about DataHandler https://docs.typo3.org/typo3cms/CoreApiReference/8.7/ApiOverview/Typo3CoreEngine/Database/

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 请问各位,如何在Jetson nano主控板的Ubuntu系统中安装PyQt5
  • ¥15 MAC安装佳能LBP2900驱动的网盘提取码
  • ¥400 微信停车小程序谁懂的来
  • ¥15 ATAC测序到底用什么peak文件做Diffbind差异分析
  • ¥15 安装ubantu过程中第一个vfat 文件挂载失败
  • ¥20 GZ::CTF如何兼容一些靶机?
  • ¥15 etcd集群部署问题
  • ¥20 谁可以帮我一下问一下各位
  • ¥15 为何重叠加权后love图的SMD与svyCreateTableOne函数绘制基线表的不一致
  • ¥150 求 《小魔指》街机游戏机整合模拟软件