【问题标题】:Typo3: Controller action with hidden record as its parameterTypo3:以隐藏记录为参数的控制器动作
【发布时间】:2021-06-22 15:46:20
【问题描述】:

我目前正在尝试让一个扩展在 Typo3 v10 中运行,它使用户能够显示、编辑、更新、禁用和启用其他用户帐户。

不幸的是,我遇到了无法使用禁用用户作为操作参数的问题:

/**
 * Save user changes
 *
 * @param \Company\MyExtension\Domain\FeUser $feuser
 * @return void
 */
public function updateAction(\Company\MyExtension\Domain\FeUser $feuser): void {}

它会导致以下错误: Object of type \Company\MyExtension\Domain\FeUser with identity "3" not found.

根据我收集的信息,extbase 不依赖存储库的默认查询设置来创建对象,而是使用 PersistenceManager::createQueryForType 通过 QueryFactory::create 获取查询设置。这也是fewbugreports中列出的问题。

a suggestions 关于如何使用自定义 QueryFactory 为我的扩展设置不同的默认 QuerySettings,但这似乎不再适用于 Typo3 v10,至少我的自定义 QueryFactory 在注册后没有被使用。 .. 另外,如果这可行,它不会对所有通过控制器操作实例化的对象使用新的 QueryFactory,而不仅仅是这个扩展?

如何使用 Typo3 v10.4 正确处理我的扩展程序中的隐藏用户?

附: Another suggestion 是通过 initializeAction 提前获取对象,但这仅适用于未修改的模型而不是为对象设置新值时,因为它最终只会加载数据库值...

【问题讨论】:

  • 通过参数传递对象假定您的 FeUser 没有被删除或隐藏(或以任何方式禁用,如开始/编辑时间)而不是获取用户作为操作参数,传递他的 UID 并编写自定义存储库中的查找器,避免使用禁用/删除对象的限制。
  • 手动查找对象需要我手动将更改的值映射到获取的对象,跳过 extbase 的功能...

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


【解决方案1】:

在这里查看扩展“新闻”是如何处理的:

        if ($news === null || $this->settings['isShortcut']) {
            $previewNewsId = ((int)$this->settings['singleNews'] > 0) ? $this->settings['singleNews'] : 0;
            if ($this->request->hasArgument('news_preview')) {
                $previewNewsId = (int)$this->request->getArgument('news_preview');
            }

            if ($previewNewsId > 0) {
                if ($this->isPreviewOfHiddenRecordsEnabled()) {
                    $news = $this->newsRepository->findByUid($previewNewsId, false);
                } else {
                    $news = $this->newsRepository->findByUid($previewNewsId);
                }
            }
        }

https://github.com/georgringer/news/blob/master/Classes/Controller/NewsController.php#L338

【讨论】:

  • 这基本上跳过了 extbase 的功能,因此在 updateAction 的情况下更改值的自动映射将不得不重新实现......这不是一个很好的解决方案。
【解决方案2】:

我假设您也需要 URL。如果你想看看,我在这里给出了答案。

Show, edit and update hidden records in FrontEnd (TYPO3)

您也可以根据自己的需要进行调整。

最好的问候

【讨论】:

  • 我也找到了你的建议,但正如我在 P.S.上面,这在更新对象时效果不佳,因为它只是将条目加载到数据库中,并且不会继承对象的更改后的新(子)值
  • 确实如此。我自己用它来更新我希望用户编辑的广告,然后让用户重新启用广告
  • 当我尝试您的建议时,将(隐藏)对象分配给 $ad 仅使其在同一上下文中可用(initializeShowAction)并且它没有延续到 showAction 方法。我必须通过 $this->request->setArgument("ad", $ad) 设置对象,以使其在 showAction 中可用。这就是为什么我也放弃了更改...那我做错了什么?
猜你喜欢
  • 2021-09-28
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2019-02-20
  • 1970-01-01
  • 2013-05-28
相关资源
最近更新 更多