【问题标题】:TYPO3: Own content element dataProcessing gives back an arrayTYPO3:自己的内容元素 dataProcessing 返回一个数组
【发布时间】:2019-02-01 18:12:14
【问题描述】:

问题如下。我创建了一个手风琴作为包含三个表格的内容元素。

  1. 第一个是 tt_content 表,它与 accordionsettings 表有 1-1 的关系。

  2. accordionsettings 表与 accordioncontent 之间存在 1-n 关系。

  3. 手风琴内容

这是我后端的结果:

到目前为止一切正常。当我尝试在同一页面上呈现多个元素时出现问题。我的意思是:

案例:我在网站顶部有一个手风琴内容元素,在底部有一个。这意味着,我创建了两个不同的内容元素。

我的数据正在处理中

ext_name/Configuration/Setup/tt_content.typoscript

ext_accordion < lib.contentElement
ext_accordion {
    templateRootPaths.30 = {$ExtPrivate}Templates/
    partialRootPaths.30 = {$ExtPrivate}Partials/
    templateName = Accordion.html
    dataProcessing {
        30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
        30 {
            table = accordionsettings

            as = accordionsettings
            dataProcessing {
                50 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
                50 {
                    if.isTrue.field = accordion_content_relation

                    table = accordioncontent

                    pidInList = this
                    where.field = uid
                    where.intval = 1
                    where.dataWrap = accordionsettings = |

                    as = accordionContents
                    dataProcessing {
                        70 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
                        70 {
                            references.fieldName = files
                            as = images
                        }
                    }
                }
            }
        }
    }
}

我在调试时在前端得到的结果如下:

问题:我想在网站上呈现这两个,但正如你所看到的,它以数组的形式返回了我的结果。这意味着如果我想在流体上声明一个变量来读取信息,我必须包括数字 0 和 1。如果我有三个手风琴元素,那么我也必须包括 2。这不是动态的,也不是一个选项。目前的变量如下:

  1. accordionsettings.0.data.accordion_speed
  2. accordionsettings.0.accordionContents

问题:我怎样才能得到这样的变量并且仍然渲染两个手风琴?

  1. accordionsettings.data.accordion_speed
  2. accordionsettings.accordionContents

我必须以不同的方式重建整个事物吗?我现在处于死胡同。

编辑 @Claus Due

我尝试创建一个循环,它看起来像这样:

<f:for each="{accordionsettings}" as="settings" key="key">
<div class="grid-container">
    <div class="grid-x">
        <div class="cell">
            <f:alias map="{
                speed: settings.data.accordion_speed,
                multiexpand:settings.data.accordion_multiexpand,
                allClosed:settings.data.accordion_all_closed,
                disabled:settings.data.accordion_disabled,
                accordionContents:settings.accordionContents
                }">
                <f:debug>{settings}</f:debug>
                    <f:render partial="Accordion/Accordion" arguments="{speed: speed, multiexpand: multiexpand, allClosed: allClosed, disabled: disabled, accordionContents: accordionContents}"/>
            </f:alias>
        </div>
    </div>
</div>
</f:for>

但我在前端得到的是以下内容:

它为创建的每个元素呈现所有手风琴元素。

【问题讨论】:

    标签: typo3 css-tables fluid


    【解决方案1】:

    据我所知,FilesProcessor 将始终为您提供文件s,因此命名。因此,在 Fluid 中,您确实必须使用 .0 访问属性,或者将单个数组传递给一个部分或部分,然后可以只使用每个数组中的属性名称。

    但这并没有改变这个简单的事实:如果您需要渲染所有这些但不必手动引用它们,那么您需要创建一个循环。

    另一个问题是您确实创建了 IRRE,它根据定义是一个记录数组,自然会成为一个模板变量数组。如果您始终只有一个设置对象,那么我建议不要将其创建为 IRRE,而是将与手风琴的关系直接放在列中。这为您提供了一组手风琴面板,每个面板都可以包含一组文件(换句话说,它们仍然是数组,但结构更清晰)。

    【讨论】:

    • 我已经编辑了我的问题。我之前试过循环的东西,结果是这样的
    • 更精确的问题文本有所帮助。 where.intval = 1 会导致 SQL 查询选择所有带有 accordionsettings = 1 的记录,这可能不正确。在任何情况下,您都应该看一下您构建的相当复杂的 IRRE 结构,并稍微清理一下。这也使得 SQL 查询更容易创建;)
    • &lt;f:for each="{accordionsettings}" as="settings" key="key"&gt; 也是一个问题,因为这会覆盖在模板之间自动传输的{settings} 变量。除非你真的,真的,真的知道你在做什么,否则你应该避免在 Fluid 中写入这个变量 - 并且只在 TS、控制器等中声明/更改它。
    • “设置”变量就是一个例子。我将名称更改为“settingsAcc”,但我仍然得到相同的结果。你认为我做这样的事情会更好吗? prnt.sc/knbnmh
    • 从您的图表来看,如果您将Accordion 与 IRRE 关联到 tt_content,那么是的 - 这应该有助于所有必须使用这些关系的功能,例如您的 TS 查询设置。
    【解决方案2】:

    由于手风琴设置属于手风琴而不是其项目,因此您应该将它们移动到父记录的字段而不是其每个子记录。

    所以恕我直言,手风琴设置表不应该是手风琴和项目之间的连接中间表,而只是与项目表一样连接到手风琴表的另一个表。相反,应该有一个额外的面板表来分组不仅仅是单个项目和一些额外的数据,例如面板标题。

    原来如此

    accordion => 1:n panels
    accordion => 1:1 settings
    panels => 1:n items
    

    您可以使用 flexform 来提供它们,而不是使用自己的表格来提供设置,因为这是目前为任何类型的插件提供设置的默认方式。

    【讨论】:

    • 这将如何帮助我分离每个手风琴?如果我使用您刚刚向我解释的方式,如果我调试它,当我有两个不同的手风琴时会产生什么结果?不要忘记我不是将元素用作插件,而是用作内容元素。这意味着 tt_content 进入游戏。关于桌子:你的意思是这样的吗? prntscr.com/knbnmh 。请记住,我对此比较陌生。
    • Flexforms 不一定要连接到插件,但也可以用“真正的”CTypes 存储。因此,对于每个手风琴父容器,您将获得一组自己的 flexform 数据,为该特定容器提供配置。它们使用的结构相同,但值可能不同。所以这就是你要求的分离。由于配置属于手风琴而不是面板,因此与将配置放入面板相比,这将是一种更简洁的方法。
    【解决方案3】:

    我找到了解决问题的方法。我不需要更改我的数据库结构上的任何内容尽管我同意@Jo Haenau 和@Claus 由于我没有使用最有效的方式来构建我的数据库,但是:

    在我的数据处理中,我必须包括:

    ext_accordion < lib.contentElement
    ext_accordion {
        templateRootPaths.30 = {$ExtPrivate}Templates/
        partialRootPaths.30 = {$ExtPrivate}Partials/
        templateName = Accordion.html
        dataProcessing {
            30 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
            30 {
                table = accordionsettings
    
                pidInList = this
                where = uid=
                where.dataWrap = |{field:accordion_settings_relation}
    
                as = accordionsettings
                dataProcessing {
                  50 = TYPO3\CMS\Frontend\DataProcessing\DatabaseQueryProcessor
                  50 {
                    if.isTrue.field = accordion_content_relation
    
                    table = accordioncontent
    
                    pidInList = this
                    where.field = uid
                    where.intval = 1
                    where.dataWrap = accordionsettings = |
    
                    as = accordionContents
                    dataProcessing {
                        70 = TYPO3\CMS\Frontend\DataProcessing\FilesProcessor
                        70 {
                            references.fieldName = files
                            as = images
                      }
                   }
                }
             }
          }
       }
    }
    

    所以我所做的是首先选择保存内容的pid:

    pidInList = this

    然后根据tt_content元素的'外表选择UID。

    where = uid=

    where.dataWrap = |{field:accordion_settings_relation}

    结果如下:

    现在我可以使用带有 0 的变量了。

    不是最清晰的方法,但效果很好

    【讨论】:

      猜你喜欢
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 2015-04-26
      • 2016-10-21
      相关资源
      最近更新 更多