TYPO3 Extbase:如何在没有原始 sql 查询的情况下获取禁用的相关对象?

2023-12-23

设想:

I have following model: Domain-Model

ContactPerson 与 FrontendUser 有关系,并且是该关系的拥有方。现在我有以下问题:
我正在根据活动的联系人激活/停用任务中的 FrontendUsers。当 FrontendUser 被禁用或删除时,contactPerson->getFrontendUser() 的结果为 null,即使两个存储库都忽略EnableFields:

    /** @var Typo3QuerySettings $querySettings */
    $querySettings = $this->objectManager->get(Typo3QuerySettings::class);
    $querySettings->setIgnoreEnableFields(true);
    $querySettings->setRespectStoragePage(false);
    $this->frontendUserRepository->setDefaultQuerySettings($querySettings);

    $debugContactPerson = $this->contactPersonRepository->findOneByContactPersonIdAndIncludeDeletedAndHidden('634');
    $debugFrontendUser = $this->frontendUserRepository->findOneByUid(7);
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump(
        array(
            '$debugContactPerson' => $debugContactPerson,
            '$debugFrontendUser' => $debugFrontendUser,
        )
    );

Result: DebugResult

P.s.: $this->frontendUserRepository->findByUid(7);也不起作用,因为它没有使用查询,但是persistenceManager->getObjectByIdentifier(...这当然忽略了查询设置。

问题是,在我的实际代码中,我无法使用 findOneByUid(),因为我无法在 contact_person 的 frontend_user 字段中获取整数值(uid)。

有什么方法可以在不使用原始查询获取 contact_person-row 的情况下解决此问题?


我的(是的原始查询)解决方案:

因为我不想编写自己的 QueryFactory 并且不想向 contactPerson 添加冗余字段,所以我现在用原始语句解决了它。也许它可以帮助遇到同样问题的人:

class FrontendUserRepository extends \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{
    /**
     * @param \Vendor\ExtKey\Domain\Model\ContactPerson $contactPerson
     * @return Object
     */
    public function findByContactPersonByRawQuery(ContactPerson $contactPerson){
        $query = $this->createQuery();

        $query->statement(
            "SELECT fe_users.* FROM fe_users" .
            " LEFT JOIN tx_extkey_domain_model_contactperson contact_person ON contact_person.frontend_user = fe_users.uid" .
            " WHERE contact_person.uid = " . $contactPerson->getUid()
        );
        return $query->execute()->getFirst();
    }

}

直接调用存储库

表的启用字段有两个方面fe_users:

  • $querySettings->setIgnoreEnableFields(true);
  • $querySettings->setEnableFieldsToBeIgnored(['disable']);

看看一些维基页面中的概述 https://wiki.typo3.org/Default_Orderings_and_Query_Settings_in_Repository#Default_Orderings_and_Query_Settings_TYPO3_6.0_-_6.2_.28extbase_6.0_-_6.2.29- 它说的是 6.2,但它在大多数情况下对于 7.6 和 8 仍然有效。但是,这仅在直接调用存储库时才有效,但如果将一个实体作为另一个实体的一部分进行检索,则不起作用 - 在这种情况下,存储库不用于嵌套实体。

修改嵌套实体的查询设置

嵌套实体被隐式检索 - 这发生在DataMapper::getPreparedQuery(DomainObjectInterface $parentObject, $propertyName)。要调整子实体的查询设置,QueryFactoryInterface实施必须超载。

注册一个替代实现ext_localconf.php(代替\Vendor\ExtensionName\Persistence\Generic\QueryFactory与您的扩展的真实类名):

$extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    \TYPO3\CMS\Extbase\Object\Container\Container::class
);
$extbaseObjectContainer->registerImplementation(
    \TYPO3\CMS\Extbase\Persistence\Generic\QueryFactoryInterface::class,
    \Vendor\ExtensionName\Persistence\Generic\QueryFactory::class
);

在新的 Typo3 版本 (v8+) 中,registerImplementation 方法不再适用于 QueryFactory。相反,一个XCLASS https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Xclasses/Index.html必须用于覆盖/扩展类:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\TYPO3\CMS\Extbase\Persistence\Generic\QueryFactory::class] = [
    'className' => \Vendor\ExtensionName\Persistence\Generic\QueryFactory::class,
];

然后在实现内部:

<?php
namespace \Vendor\ExtensionName\Persistence\Generic;
use TYPO3\CMS\Extbase\Domain\Model\FrontendUser;

class QueryFactory extends \TYPO3\CMS\Extbase\Persistence\Generic\QueryFactory {
    public function create($className) {
        $query = parent::create($className);
        if (is_a($className, FrontendUser::class, true)) {
            // @todo Find a way to configure that more generic
            $querySettings = $query->getQuerySettings();
            $querySettings->setIgnoreEnableFields(true);
            // ... whatever you need to adjust in addition ...
        }
        return $query;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TYPO3 Extbase:如何在没有原始 sql 查询的情况下获取禁用的相关对象? 的相关文章

  • TYPO3:未找到模板。无法解决视图的操作

    我正在尝试使用 TYPO3 后端模块 当我单击后端左侧菜单中的模块时 我试图获取视图 但是 当我单击此按钮时 我收到以下消息 抱歉 未找到请求的视图 技术原因是 没有找到模板 无法解析 MyVendor MyModule Controlle
  • TYPO3 9.5.2 Slug:多语言:如果不存在页面翻译,则找不到页面 404 异常

    我有一个有两种语言的网站 例如德文和英文 De 是我的默认语言 没有路径前缀 En 第二种语言 在 url 中以 en 作为前缀 现在 当我切换到 en 语言时 菜单项链接的 url 中包含 en 这很好 但是 当我单击后端未显式翻译的菜单
  • TYPO3后端:搜索自定义记录

    我开发了一个允许创建新记录的扩展 在列表模块中 记录列表下有搜索表单 例如 它适用于 fe 用户 但不适用于我的自定义记录 我是否需要在 tca 中添加任何特殊配置才能使此表单与我的自定义记录一起使用 EDIT 这似乎是在更新到 TYPO3
  • TYPO3 中的 eID 是什么?

    我已经多次遇到这个词了 通常 资源会直接解释如何做某事 但没有提及这是什么或它的用途 另外 很多资源都是德语的 或者不是很清楚 So 什么是 eID 这是 TYPO3 特有的东西还是一般概念 你能用它做什么 这对于 TYPO3 gt 9 仍
  • Typo3:8.7.9 CKeditor 保存后删除块样式

    我在 Typo3 中有以下 CKEditor 的 YAML 配置 Load default processing options imports resource EXT rte ckeditor Configuration RTE Pro
  • 显示来自 EXT:news 的特定语言记录

    我正在尝试以与默认语言不同的语言显示新闻记录 但默认语言中不存在记录 多语言配置是 config sys language mode strict sys language overlay 0 页面上的插件设置为 所有语言 仅以默认语言存在
  • TYPO3:从 Extbase 中的文件引用中获取路径

    我使用 Fluid 和 Extbase TYPO3 6 1 创建了一个自定义内容元素 您可以在其中定义图片 在图片设置中 我可以设置一个img链接 它的目标是一个文件 在我的控制器中我可以访问这些数据 this gt configurati
  • TYPO3:如何在后端添加css和JS

    我该如何添加css and javascript后端有文件吗 我想将这些文件用于自定义创建的内容元素以使它们对用户更具吸引力 System TYPO3 v9 Mode 作曲家模式 Target 自定义内容元素 在 TYPO3 v9 中 您必
  • 如何在没有 Extbase 的情况下渲染流体视图模板?在电子邮件模板中通过 eID

    我想通过 TYPO3 eID 脚本使用 Fluid 模板文件来呈现邮件正文来发送电子邮件 我找不到一种简单的方法来在正常的 MVC Extbase 上下文之外初始化 Fuid 视图 我发现的所有来源似乎都已过时且非常复杂 那么渲染流体模板需
  • TYPO3:为一个扩展设置多个存储pid

    我构建了一个扩展 它有一个 详细信息 表 其中包含包含内联到另一个对象的标题和描述的详细信息 现在新的详细信息存储在与对象相同的 pid 中 但我想更改它 这个问题 https stackoverflow com questions 151
  • 带有方面的 RouteEnhancer 会抛出 InvalidParameterException

    我逐字使用了来自变更日志 https docs typo3 org typo3cms extensions core Changelog 9 5 Feature 86365 RoutingEnhancersAndAspects html p
  • realUrl 不为默认语言编写 preVar

    我在 TYPO3 4 5 26 上运行 realURL 1 12 6 我习惯于 realURL 创建包含 preVar 的路径 也适用于默认语言 例如 www example com de seite 和 www example com e
  • 在本地安装和设置 TYPO3 的最快方法是什么?

    我想在本地计算机上安装并设置 TYPO3 最佳实践和最快方法是什么 要在本地计算机上运行 TYPO3 您需要在计算机上运行 Web 服务器 这可以通过不同的方式完成 基于 Linux 的机器上的本机 Web 服务器 PHP 和数据库 虚拟机
  • TYPO3 Extbase如何清空ObjectStorage

    我想在更新对象时 清空 ObjectStorage 它是 TYPO3 4 6 带有 Extbase 扩展 允许您在前端显示 添加 编辑 删除数据集 乍一看一切看起来都不错 我有一个字段引用另一张表 TCA partner gt array
  • 将插件插入流体模板?

    扩展名客搜索 https typo3 org extensions repository view ke search有一个搜索字段插件 我想将其插入到我的流体模板中并显示在每个页面上 我对此很陌生 不知道如何开始 任何帮助表示赞赏 您可以
  • 如何编辑这个 Typo3 菜单?

    我有一个一页示例站点 使用 Typo3 版本 7 6 10 的 bootstrap package Introduction 包 问题是我是 Typo3 的新手 需要帮助转换导航菜单 我希望它们成为页面中各个部分的锚点 更详细地说 从我在后
  • Typo3:如何上传文件并创建文件引用?

    我将尝试在 FE 中上传一个文件 或稍后的多个文件 这有效 就像我当前的代码一样 但是我现在如何获取该文件的文件引用呢 var array fileData var integer feUserId return TYPO3 CMS Ext
  • 如何避免 TYPO3 中的日期时间问题?

    我创建了一个小扩展 它使用日期时间来查看一些特定事件 事件日期和事件时间 但如果我尝试从数据库获取正确的日期时间到前端 我总是会遇到麻烦 我可以通过 TYPO3 后端设置每个事件的日期时间 但是如果我尝试在前端获取这个值 例如
  • TYPO3:如何将页面内容插入模板

    我有一些内容想要出现在 TYPO3 网站的多个页面上 我可以将其插入模板中 但我还希望该内容可以在富文本编辑器中编辑 所以我有了创建隐藏页面的想法 但我不知道如何将此内容插入到模板中 是否需要select打字稿声明 另外 作为后续问题 我可
  • TYPO3 显示子页面的内容,包括 css 类

    使用以下打字稿 我从一页上的子页面获取所有内容 lib allPid COA lib allPid 10 HMENU 10 special directory special value 2 1 TMENU 1 expAll 1 NO do

随机推荐

  • 如何在node.js中逐块进行压缩?

    我正在以块的形式获取压缩网页的内容 并希望在收到每个内容后立即对其进行解压缩 因此我正在尝试执行以下操作 为了可读性而将内容剥离 var decompress function string callback zlib gunzip str
  • 使用宏刷新 Excel 工作簿中的所有数据透视表

    我有一本包含 20 个不同数据透视表的工作簿 有没有简单的方法可以找到所有数据透视表并在 VBA 中刷新它们 Yes ThisWorkbook RefreshAll 或者 如果您的 Excel 版本足够旧 Dim Sheet as Work
  • 使用 OAuth 从 Twitter 获取名字/姓氏/电子邮件

    我专门使用omniauth 来允许通过facebook google twitter 登录我的网站 我存储名字 姓氏和电子邮件 但是 当我从 oauth 提出 twitter auth 哈希时 我只能在 auth 哈希中获得昵称 名称 位置
  • iPhone Web 应用程序的日期选择器

    显示基于 iPhone 的 Web 应用程序的日期选择器的最佳方式是什么 我们可以在 Web 应用程序中显示类似 iPhone 本机日期选择器的内容吗 最简单的方法 可以说是最好的方法 是使用 safari 的内置日期选择器作为输入框 使用
  • 使用 Google Apps 脚本更新 Google 文档中的嵌入图表

    太长了 如何使用文档中的脚本编辑器更新文档中嵌入的表格图表 我知道有一个脚本可以为 Google 幻灯片执行此操作 但我正在尝试在 Google 文档中执行此操作 但找不到任何相关文档 https developers google com
  • 尝试连接到 localhost:5000 Firebase 时出现“无法获取/”

    我正在尝试让 Firebase 上的本地主机服务器正常工作 但我继续在浏览器中收到以下消息 无法获取 我看了一下控制台 它只说 http 本地主机 5000 http localhost 5000 404 未找到 我尝试使用 firebas
  • 外部 swf 卸载后声音继续播放

    我有一个 Flash 应用程序 某种加载外部 SWF 视频播放器的播放列表 我没有对该外部文件的代码访问权限 因此用户可以观看视频或跳到另一个视频 当用户切换到另一个视频时 将加载新的 SWF 文件 问题 如果用户没有看完视频并跳到下一个
  • onClick 里面有两个参数

    我试图在 ReactJs 中的 onClick 上传递两个事件操作 基本上我想要类似的东西 div prop2 value2 this continue project gt 我尝试了 1000 种不同的语法编写方式 div prop2 v
  • 如何将 Python 3 和 Django 与 Apache 结合使用?

    我的目标是使用 Apache 设置 Python 3 我最大的问题实际上是获取 mod python so 在我的一生中 我只找到一个可以下载它的网站 http www modpython org 而我得到的是一堆构建和安装文件 我找不到解
  • Django:在 queryset.update 上发出信号

    如果您使用的是 Django 会发送 pre post delete 信号queryset delete 方法 但不应该也发送 pre post save onqueryset update 也许应该如此 但事实并非如此 update 不调
  • 您在 Netbeans 中创建了哪些有用的宏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Typescript i18next 不满足约束 'string |模板字符串数组 NextJS

    我正在尝试输入要使用 i18next 进行翻译的对象数组 但变量 navItems 中出现以下消息 我在其中声明 i18next 然后迭代该数组Type NavItemProps does not satisfy the constrain
  • 版权信息的正确语义标签 - html5

    在网站页脚中包含版权声明的最佳且最语义化的标签 方法是什么 将其放入您的
  • 让“$watch”功能远离控制器的最佳实践

    我试图找到一些搬家最佳实践的好例子 watch例如 从控制器到工厂的功能 我发现实际上对于什么是最好的做法并没有一致的意见 我见过注入的例子 rootScope进入工厂并 watch那里的价值变化 另一个建议是尽可能避免它们 并使用ngCh
  • 使用 struct.pack 和 struct.unpack_from 写入数据结构无法正确读取

    我在获取二进制文件中的数据时遇到这个问题 Write data f open path wb start date 2014 1 1 0 0 0 0 end date 2014 2 1 0 0 0 0 for x in range 10 f
  • 检查 HttpWebResponse 是否为空

    我正在向 REST 服务发出 HTTP post 请求 当我收到 HttpWebResponse 返回时 我正在执行以下检查 当我执行 webresponse null 时 我是否还应该检查 responseStream null Http
  • 如何在android服务中处理保持活动连接

    我正在将 asmack 用于 Android IM 应用程序 其中我使用带有 AIDL 接口的远程服务 代替onStartCommand我的服务方法我编写的代码如下 我创建连接 然后使用它登录 当有人在里面运行我的应用程序时onCreate
  • 读取文件附件(例如;.txt 文件)-Discord.JS

    第二次在 StackOverflow 上发帖 对于任何错误我深表歉意 请多多包涵 与标题相同 您如何阅读不和谐附件的内容比方说 txt文件并打印内容 我尝试过fs但不幸的是失败了 我也搜索了文档但也失败了 Ideas 你不能使用fs模块 因
  • 用于从网站提取域的 Google Sheets 公式?

    REGEXEXTRACT A1 A m http s 尝试从网站中提取域名 如果链接是这样的 上面的公式对我有用 https walmart com careers https walmart com careers 但是 如果它已经是一个
  • TYPO3 Extbase:如何在没有原始 sql 查询的情况下获取禁用的相关对象?

    设想 I have following model ContactPerson 与 FrontendUser 有关系 并且是该关系的拥有方 现在我有以下问题 我正在根据活动的联系人激活 停用任务中的 FrontendUsers 当 Fron