如何从 FlexForm 到 Controller 获取价值
Posted
技术标签:
【中文标题】如何从 FlexForm 到 Controller 获取价值【英文标题】:How to get value from FlexForm to 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>
【问题讨论】:
【参考方案1】:好的,我可以自己解决。对于与我遇到同样问题的人:
我的错误是,我根本不需要控制器中的 $this->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://***.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 中使用它来获取前端弹性域的信息。
【讨论】:
以上是关于如何从 FlexForm 到 Controller 获取价值的主要内容,如果未能解决你的问题,请参考以下文章
从 Flexform 上传图像后出现 Fluid TYPO3 Flux 500 错误