问题如下。我创建了一个具有三个表的手风琴作为内容元素。
第一个是 tt_content 表,该表与 accordionsettings 表具有1-1的关系。
手风琴设置表与手风琴内容具有1-n关系。
手风琴内容
这是我后端的结果:
到目前为止,一切正常。当我尝试在同一页面上呈现多个元素时出现问题。我的意思是:
案例:我在网站顶部有一个手风琴内容元素,在底部有一个。这意味着,我创建了两个不同的内容元素。
我在我的数据上进行处理
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。这不是动态的,也不是一种选择。此刻的变量如下:
问题::如何获得这样的变量,同时仍然呈现两个手风琴?
我是否必须以其他方式重建整个东西?我现在快要死了。
编辑 @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>
但是我在前端得到的是以下内容:
它为创建的每个元素呈现所有手风琴元素。
答案 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}
结果如下:
现在我可以将变量与0一起使用。
不是最清楚的方法,但效果很好