【问题标题】:How to get value from FlexForm to Controller如何从 FlexForm 到 Controller 获取价值
【发布时间】:2015-09-30 22:16:02
【问题描述】:

我正在练习一个非常简单的 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>

【问题讨论】:

    标签: typo3 extbase typo3-extensions


    【解决方案1】:

    好的,我可以自己解决。对于与我遇到同样问题的人:

    我的错误是,我根本不需要控制器中的 $this-&gt;settings['code']; 行,而是在查看器 List.html 中写入 {settings.code} 而不仅仅是 {code}。它与我在书和一些教程中读到的完全不同,但这确实有效。

    【讨论】:

    • 能否请您添加解析标志,因为除了知道确切的位置
    【解决方案2】:

    缺少视图参数的赋值。因此改变

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

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

    这样{code} 应该在视图中可用。

    【讨论】:

      【解决方案3】:

      我不想被限制在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;
          }
      
      

      我在一个与 Alias 类似的 viewhelper 中使用它来获取前端弹性域的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 2016-07-26
        相关资源
        最近更新 更多