繁体   English   中英

TYPO3:自己的内容元素dataProcessing返回一个数组

[英]TYPO3: Own content element dataProcessing gives back an array

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

  1. 第一个是tt_content表,它与手风琴设置表具有1-1关系。

  2. 所述accordionsettings表然后具有1-n的相对于accordioncontent。

  3. accordioncontent

这是我后端的结果:

在此处输入图片说明

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

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

我有我的数据处理

ext_name /配置/设置/ 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>

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

在此处输入图片说明

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

据我所知, FilesProcessor总会给你的文件S,因此命名。 因此,在Fluid中,您确实必须使用.0进行访问以访问属性,或者将各个数组传递给可以仅在每个数组中使用属性名称的部分或部分。

但这并不能改变这个简单的事实:如果您需要呈现所有这些内容而不必手动引用它们,则需要创建一个循环。

另一个问题是您确实创建了IRRE,它实际上是一个记录数组,并且自然会变成模板变量数组。 如果始终只有一个设置对象,则建议不要将其创建为IRRE,而应将与手风琴的关系直接放在一列中。 这为您提供了一个手风琴面板阵列,每个面板都可以具有一个文件阵列(换句话说,它们仍然是阵列,但结构更简洁)。

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

因此,恕我直言,手风琴设置表不应是手风琴和项目之间的连接中间表,而应是与项目表一样连接到手风琴表的另一个表。 取而代之的是应该有一个额外的面板表,以将多个项目分组,而不仅仅是单个项目和一些其他数据,例如面板标题。

原来如此

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

可以使用Flexform来提供设置,而不是使用自己的表来提供设置,因为当前这是为任何类型的插件提供设置的默认方法。

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

在我的dataProcessing上,我必须包括:

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 =此

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

其中= uid =

where.dataWrap = | {field:accordion_settings_relation}

结果如下:

在此处输入图片说明

现在我可以将变量与0一起使用。

不是最清晰的方法,但是它可以完美地工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM