TYPO3: собственный элемент содержимого dataProcessing возвращает массив - PullRequest
0 голосов
/ 27 августа 2018

Проблема в следующем.Я создал аккордеон в качестве элемента контента, который имеет три таблицы

  1. Первой является таблица tt_content , которая имеет отношение 1-1 к таблице accordionsettings .

  2. Таблица accordionsettings имеет отношение 1-n к accordioncontent .

  3. аккордеонное содержание

Это результат моего бэкенда:

enter image description here

Покатак хорошо все работает отлично.Проблема возникает, когда я пытаюсь сделать несколько элементов на одной странице.Что я подразумеваю под этим:

CASE : у меня есть элемент аккордеонного контента вверху веб-сайта и один внизу.Это означает, что я создал два разных элемента содержимого.

Мои данные обрабатываются на моем

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 голосов
/ 27 августа 2018

Поскольку настройки аккордеона принадлежат аккордеону, а не его элементам, вы должны переместить их в поле родительской записи, а не в каждую из ее дочерних записей.

Так что ИМХО таблица аккордеонных настроек не должна бытьпромежуточная таблица, соединяющая аккордеон и предметы, но еще одна таблица, которая соединяется с таблицей аккордеона точно так же, как таблица предметов.Вместо этого должна быть дополнительная таблица панелей для группировки не только отдельных элементов и некоторых дополнительных данных, таких как, например, название панели.

Таким образом, это будет

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

Вместо того, чтобы предоставлять настройкамсвою собственную таблицу, вы можете использовать гибкую форму для их предоставления, поскольку в настоящее время это стандартный способ предоставления настроек для любого вида плагина.

0 голосов
/ 27 августа 2018

Я нашел решение своей проблемы.Мне не пришлось ничего менять в структуре моей базы данных ALTHOUGH Я согласен с @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

затем выберите UID элемента tt_content в соответствии с его внешней таблицей.

где = uid =

где.dataWrap = | {поле: accordion_settings_relation}

И результат следующий:

enter image description here

Теперь я могу использовать переменные с 0.

Не самый понятный способ, но работает отлично

0 голосов
/ 27 августа 2018

Насколько я знаю, FilesProcessor всегда даст вам файл s , отсюда и название. Так что в Fluid вам действительно придется либо получить доступ к .0 для доступа к свойствам, либо передать отдельные массивы в раздел или часть, которые затем могут использовать только имена свойств в каждом массиве.

Но это не меняет этого простого факта: если вам нужно отобразить все из них, но не нужно ссылаться на них вручную, вам нужно создать цикл.

Другая проблема заключается в том, что вы создаете IRRE, который по определению является массивом записей и, естественно, станет массивом переменных шаблона. Если у вас всегда есть только один объект настроек, тогда я предлагаю не , создавая его как IRRE, а вместо этого поместите отношение к вашим аккордеонам прямо в столбец. Это дает вам массив аккордеонных панелей, каждая из которых может иметь массив файлов (другими словами, они все еще являются массивами, но имеют более чистую структуру).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...