簡體   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