删除内联记录但会出现警告:尝试在未经许可或不存在页面的情况下修改记录

时间:2017-11-01 07:46:50

标签: typo3 extbase typo3-7.6.x typo3-extensions

在Backend中保存记录时我正在使用TCEmainHook processDatamap_preProcessFieldArray。我根据此记录中的其他字段创建,更改和删除内联记录。一切都按预期工作,但删除内联记录仍然存在错误/警告,即使作业执行正确。错误发生在TYPO3 7和8中。

详细信息:对于我删除的每个内联记录,我收到以下Flash消息(在TYPO3 7中,它只在sys_log中写入):

  

未经许可,尝试修改记录'foo bar'(tx_datednews_domain_model_newsrecurrence:527)。或者不存在的页面。

在TYPO3 8中我可以将问题跟到typo3 / sysext / core / Classes / DataHandling / DataHandler.php方法:recordInfoWithPermissionCheck。 添加了删除限制。当我删除它,一切都很好。这引出了我的想法,即记录已被删除,因此它无法再找到记录。但我不会删除它两次。

但正如我上面提到的,最后删除此内联记录已完美执行。

这些可能是相关的代码段:

通过以下方式删除/删除内联记录。切换这两行并没有帮助。当我重新打开新闻并且没有从新闻记录中删除oldRec或删除但未删除时,仅使用其中一个会导致致命错误。所以我确定我需要做两个步骤。

$this->newsRecurrenceRepository->remove($oldRec);
$news->removeNewsRecurrence($oldRec);

tx_datednews_domain_model_newsrecurrence的TCA:

return [
'ctrl' => [
    'title'                    => 'LLL:EXT:dated_news/Resources/Private/Language/locallang_db.xlf:tx_datednews_domain_model_newsrecurrence',
    'label'                    => 'eventstart',
    'tstamp'                   => 'tstamp',
    'crdate'                   => 'crdate',
    'cruser_id'                => 'cruser_id',
    'default_sortby'           => 'eventstart',
    'versioningWS'             => true,
    'languageField'            => 'sys_language_uid',
    'transOrigPointerField'    => 'l10n_parent',
    'transOrigDiffSourceField' => 'l10n_diffsource',
    'delete'                   => 'deleted',
    ...

内联元素的TCA:

'newsrecurrence' => [
    'config'  => [
        'type'              => 'inline',
        'foreign_table'     => 'tx_datednews_domain_model_newsrecurrence',
        'MM'                => 'tx_datednews_news_newsrecurrence_mm',
        'foreign_field'     => 'parent_event', 
        'foreign_default_sortby'    => 'eventstart DESC',
        'maxitems'          => 9999,
        'appearance'        => [
            'collapseAll'                     => 1,
            'levelLinksPosition'              => 'top',
            'showSynchronizationLink'         => 1,
            'showPossibleLocalizationRecords' => 1,
            'useSortable'                     => 0,
            'showAllLocalizationLink'         => 1,
            'enabledControls'                 => [
                'info'     => true,
                'new'      => false,
                'dragdrop' => true,
                'sort'     => false,
                'hide'     => true,
                'delete'   => false,
                'localize' => true,
            ],
        ],
    ],
] 

newsRecurrenceRepository中的Defaul QuerySettings:

$this->defaultQuerySettings = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
$this->defaultQuerySettings->setIgnoreEnableFields(true);
$this->defaultQuerySettings->setEnableFieldsToBeIgnored(['hidden', 'deleted']);
$this->defaultQuerySettings->setRespectStoragePage(FALSE);

理解警告出现的原因以及如何摆脱它将会非常棒。

1 个答案:

答案 0 :(得分:0)

解决方法是,使用钩子中可用的DataHandler对象作为$ pObj。

因此,使用存储库删除记录,需要使用DataHandler删除它。我替换了

$this->newsRecurrenceRepository->remove($oldRec);

使用这段代码:

$cmd = [];
$cmd['tx_datednews_domain_model_newsrecurrence'][$oldRec->getUid()]['delete'] = true;
$pObj->start([], $cmd);
$pObj->process_cmdmap();
相关问题