Как получить ценность от FlexForm к контроллеру

Я практикуюсь с очень простым расширением Extbase и использовал FlexForm для получения трех полей формулы.
Одно из них называется кодом, который должен перейти в EmbedderController.php, а затем в средство просмотра List.html.

Я проверил все учебники, которые смог найти.

Я не понимаю, как передать код значения FlexForm в свой контроллер.
Я получаю пустую страницу или не получаю никакого значения.

Это моя FlexForm: Embedder.xml

<T3DataStructure>
        <meta type="array">
                <langChildren>0</langChildren>
                <langDisable>1</langDisable>
        </meta>
        <ROOT>
                <type>array</type>
                <el>
                        <settings.code>
                                <TCEforms>
                                        <label>Video Code</label>
                                        <config>
                                                <type>input</type>
                                                <size>20</size>
                                                <max>30</max>
                                                <eval>trim</eval>
                                        </config>
                                </TCEforms>
                        </settings.code>
                        <settings.width>
                                <TCEforms>
                                        <exclude>1</exclude>
                                        <label>Breite in Pixel</label>
                                        <config>
                                                <type>input</type>
                                                <size>10</size>
                                                <max>10</max>
                                                <eval>trim</eval>
                                        </config>
                                </TCEforms>
                        </settings.width>
                        <settings.height>
                                <TCEforms>
                                        <exclude>1</exclude>
                                        <label>Höhe in Pixel</label>
                                        <config>
                                                <type>input</type>
                                                <size>10</size>
                                                <max>10</max>
                                                <eval>trim</eval>
                                        </config>
                                </TCEforms>
                        </settings.height>
                </el>
        </ROOT>
</T3DataStructure>

А это мой EmbedderController.php

<?php
namespace HhuMediathek\Hhumediathek\Controller;
     
/**
 * EmbedderController
 */
class EmbedderController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
     
        /**
         * embedderRepository
         *
         * @var \HhuMediathek\Hhumediathek\Domain\Repository\EmbedderRepository
         * @inject
         */
        protected $embedderRepository = NULL;
     
        /**
         * action list
         *
         * @return void
         */
        public function listAction() {
                $this->settings['code'];
        }
}

А это просмотрщик List.html

<f:layout name="Default" />
<f:section name="main">
<iframe width='570' height='321' style='width: 570px; height: 321px; border: 1px solid #ccc;' src='//xxx.de/embed/{code}' frameborder='0' allowfullscreen></iframe>
    </f:section>

person Kendel Ventonda    schedule 12.07.2015    source источник


Ответы (3)


Ладно, я бы сам разобрался. Для тех, кто борется с той же проблемой, что и я:

Моя ошибка заключалась в том, что мне вообще не нужна была строка $this->settings['code']; в контроллере, а вместо {code} в просмотрщике List.html было написано {settings.code}. Это полностью отличается от того, что я читал в своей книге и некоторых учебниках, но это действительно сработало.

person Kendel Ventonda    schedule 12.07.2015
comment
не могли бы вы добавить флаг разрешения, потому что кроме того, чтобы знать, где именно искать - person webfacer; 30.10.2017

Отсутствует назначение параметра вида. Поэтому измените

public function listAction() {
    $this->settings['code'];
}

to

public function listAction() {
    $this->view->assign('code', $this->settings['code']);
}

Таким образом, {code} должен быть доступен в представлении.

person ViRuSTriNiTy    schedule 03.07.2017

Я не хочу ограничиваться settings.*. Я использую следующий скрипт в своем контроллере.

        /** @var ContentObjectRenderer $content */
        $content = $this->configurationManager->getContentObject();
        $flexFormString = $content->data['pi_flexform'];
        $flexFormRaw = GeneralUtility::xml2array($flexFormString);
        if (is_callable([FlexformUtilities::class,'arrayFlatten'])) {
            $flexFormSimple = FlexformUtilities::arrayFlatten( $flexFormRaw); // second Param is ['data','sDEF','lDEF','vDEF']
            $referenceUidsList = $flexFormSimple['referenceList'];
        } else {
            $referenceUidsList = (int)$flexFormRaw['data']['sDEF']['lDEF']['referenceList']['vDEF'];
        }

Utilities-Class содержит следующий метод flattenArray


    protected const DEFAULT_FLATTEN_KEYS = ['data','sDEF','lDEF','vDEF'];

 
   /**
     * https://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array
     *
     * @param array $listFlatKeys
     * @param $array
     * @return array
     */
    public static function arrayFlatten( $array, &$listFlatKeys = self::DEFAULT_FLATTEN_KEYS)
    {

        if (!is_array($array)) {
            return $array;
        }

        if (count($array) === 1) {
            $key = array_key_first($array);
            $value = self::arrayFlatten( $array[$key],$listFlatKeys);
            if (in_array($key, $listFlatKeys)) {
                return $value;
            } else {
                return [$key => $value];
            }
        }

        $return = [];
        foreach ($array as $key => $value) {
            if (in_array($key, $listFlatKeys)) {
                $return[] = self::arrayFlatten( $value, $listFlatKeys);
            } else {
                $return[$key] = self::arrayFlatten( $value, $listFlatKeys);
            }
        }
        return $return;
    }

Я использую его, хотя и в псевдониме, похожем на viewhelper, чтобы получить информацию о flex-поле во внешнем интерфейсе.

person Padina42    schedule 14.01.2021