Typo3 Fluid 将字符串分成元素以便进行比较
Typo3 Fluid separating a string into elements to be able to compare
第一次使用液体。
挑战:
在一种形式中,我试图标记那些必填的字段(突出显示或指示器)。
必填字段以字符串形式提供(在数组 {settings.registration.requiredFields}
中)
方法
我认为可以创建一个部分,我将当前字段名传递给该部分并将该字段名与 requiredFields 列表进行比较。
问题
1) 我发现部分字符串无法比较。
2) 所以我想用 v:interator.explode
将字符串分解成一个数组,然后可以与 f:for
进行比较,并在那里完成标记,如 here
经过几个小时的谷歌搜索后,我发现我需要添加 vhs
和 flux
扩展名。没有成功。
在输出中显示语句而不是结果。
<v:iterator.explode content="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam" glue=" " as="bar">
<div class="event-registration-value event-title">
</div>
</v:iterator.explode>
来自(测试)输入
<v:iterator.explode content="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam" glue=" " as="bar">
<div class="event-registration-value event-title">
{bar}
</div>
</v:iterator.explode>
我需要做什么才能得到这个 运行?
PS: 我使用的是 typo3 7.6.2
由于您没有提及我假设的表单的任何扩展,您只是创建自己的表单,在这种情况下,您也可以轻松添加自己的 ViewHelper,这将完全满足您的需要,即:
在你的 TypoScript 中的某处:
plugin.tx_myext.settings.registration.requiredFields = foo bar baz
typo3conf/ext/myext/Classes/ViewHelpers/IsFieldRequiredViewHelper.php:
<?php
namespace Vendor\Myext\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class IsFieldRequiredViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper {
/**
* @param string $fieldName Current field name
* @param string $requiredFields List of required names separated by spaces
*
* @return string the rendered string
*/
public function render($fieldName, $requiredFields) {
$requiredArray = GeneralUtility::trimExplode(' ', $requiredFields, true);
return (in_array($fieldName, $requiredArray))
? $this->renderThenChild()
: $this->renderElseChild();
}
}
因此,在您的 Fluid 模板中,您可以通过多种方式使用它,几个示例:
{namespace myvhs=Vendor\Myext\ViewHelpers}
<!-- 1: Use your condition with then/else blocks -->
<myvhs:isFieldRequired
fieldName="foo"
requiredFields="{settings.registration.requiredFields}">
<f:then>This field IS required</f:then>
<f:else>It's optional...</f:else>
</myvhs:isFieldRequired>
<!-- 2: or just with `then` implicit block: -->
<myvhs:isFieldRequired
fieldName="bar"
requiredFields="{settings.registration.requiredFields}">Fill the bellow input...</myvhs:isFieldRequired>
<!-- 3: Add `required-field` class inline -->
<input type="text" class="{myvhs:isFieldRequired(fieldName: 'baz', requiredFields: settings.registration.requiredFields, then: 'required-field')}">
(请注意,您当然需要更改供应商和扩展名称以适合您当前的情况)
要获得 v:
函数 运行 有两件重要的事情要做:
- 包括 TER 的 vhs 扩展
- 定义命名空间
命名空间是通过添加
来定义的
{namespace v=FluidTYPO3\Vhs\ViewHelpers}
在文件顶部。
提示:
如果模板在添加后损坏,可能不是 namespace
行,而是 <v:...>
语句中的拼写错误。
在我的例子中,缺少结尾 "
并且围绕相同的变量缺少 {}
。
作为新手我花了三天时间解决了
第一次使用液体。
挑战:
在一种形式中,我试图标记那些必填的字段(突出显示或指示器)。
必填字段以字符串形式提供(在数组 {settings.registration.requiredFields}
中)
方法 我认为可以创建一个部分,我将当前字段名传递给该部分并将该字段名与 requiredFields 列表进行比较。
问题
1) 我发现部分字符串无法比较。
2) 所以我想用 v:interator.explode
将字符串分解成一个数组,然后可以与 f:for
进行比较,并在那里完成标记,如 here
经过几个小时的谷歌搜索后,我发现我需要添加 vhs
和 flux
扩展名。没有成功。
在输出中显示语句而不是结果。
<v:iterator.explode content="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam" glue=" " as="bar">
<div class="event-registration-value event-title">
</div>
</v:iterator.explode>
来自(测试)输入
<v:iterator.explode content="Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam" glue=" " as="bar">
<div class="event-registration-value event-title">
{bar}
</div>
</v:iterator.explode>
我需要做什么才能得到这个 运行?
PS: 我使用的是 typo3 7.6.2
由于您没有提及我假设的表单的任何扩展,您只是创建自己的表单,在这种情况下,您也可以轻松添加自己的 ViewHelper,这将完全满足您的需要,即:
在你的 TypoScript 中的某处:
plugin.tx_myext.settings.registration.requiredFields = foo bar baz
typo3conf/ext/myext/Classes/ViewHelpers/IsFieldRequiredViewHelper.php:
<?php
namespace Vendor\Myext\ViewHelpers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
class IsFieldRequiredViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper {
/**
* @param string $fieldName Current field name
* @param string $requiredFields List of required names separated by spaces
*
* @return string the rendered string
*/
public function render($fieldName, $requiredFields) {
$requiredArray = GeneralUtility::trimExplode(' ', $requiredFields, true);
return (in_array($fieldName, $requiredArray))
? $this->renderThenChild()
: $this->renderElseChild();
}
}
因此,在您的 Fluid 模板中,您可以通过多种方式使用它,几个示例:
{namespace myvhs=Vendor\Myext\ViewHelpers}
<!-- 1: Use your condition with then/else blocks -->
<myvhs:isFieldRequired
fieldName="foo"
requiredFields="{settings.registration.requiredFields}">
<f:then>This field IS required</f:then>
<f:else>It's optional...</f:else>
</myvhs:isFieldRequired>
<!-- 2: or just with `then` implicit block: -->
<myvhs:isFieldRequired
fieldName="bar"
requiredFields="{settings.registration.requiredFields}">Fill the bellow input...</myvhs:isFieldRequired>
<!-- 3: Add `required-field` class inline -->
<input type="text" class="{myvhs:isFieldRequired(fieldName: 'baz', requiredFields: settings.registration.requiredFields, then: 'required-field')}">
(请注意,您当然需要更改供应商和扩展名称以适合您当前的情况)
要获得 v:
函数 运行 有两件重要的事情要做:
- 包括 TER 的 vhs 扩展
- 定义命名空间
命名空间是通过添加
来定义的 {namespace v=FluidTYPO3\Vhs\ViewHelpers}
在文件顶部。
提示:
如果模板在添加后损坏,可能不是 namespace
行,而是 <v:...>
语句中的拼写错误。
在我的例子中,缺少结尾 "
并且围绕相同的变量缺少 {}
。
作为新手我花了三天时间解决了