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

时间:2018-08-27 08:28:27

标签: typo3 css-tables fluid

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

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

  2. 手风琴设置表与手风琴内容具有1-n关系。

  3. 手风琴内容

这是我后端的结果:

enter image description here

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

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

我在我的数据上进行处理

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
                        }
                    }
                }
            }
        }
    }
}

调试时在前端获得的内容如下:

enter image description here

问题:我想在网站上同时渲染两者,但好像您可以看到的那样,它以数组的形式返回了结果。这意味着,如果要在流体上声明一个变量以读取信息,则必须包括数字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>

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

enter image description here

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

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

应该是

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

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

答案 2 :(得分:0)

我找到了解决问题的方法。我不必更改数据库结构上的任何内容 ALTHOUGH ,我同意@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}

结果如下:

enter image description here

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

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