如何访问导致TYPO3 Extbase操作的验证器结果



我有一个带有新/create操作的Extbase模块。模型中有@validate注释。

到目前为止一切都很好。

但是:我不喜欢表单错误在视图中的表现方式。我想在视图中为未正确填写的字段添加一个类似error的CSS类。

但是访问表单中错误的唯一方法似乎是通过<f:form.validationResults>-Viewhelper。

当我尝试用<f:debug>{validationResults}</f:debug>调试结果时,我得到一个NULL值。

如何访问单个字段的错误?

实际上,我更喜欢访问控制器中的错误,这样我就可以将一个数组传递给包含错误的字段的视图。

我正在使用Fluid和TYPO3 9.5

此类流体模板应开箱即用:

<f:form.validationResults>
<f:if condition="{validationResults.flattenedErrors}">
<ul>
<f:for each="{validationResults.flattenedErrors}" key="propertyPath" as="errors">
<li>
{propertyPath}: <ul>
<f:for each="{errors}" as="error">
<li>{error}</li>
</f:for>
</ul>
</li>
</f:for></ul>
</f:if>
</f:form.validationResults>

另一种方法

您还可以编写自己的ViewHelper,以自己的HTML标记形式显示错误消息:


<?php
namespace VENDORYourextViewHelpers;
use TYPO3CMSExtbaseUtilityDebuggerUtility;
use TYPO3FluidFluidCoreViewHelperAbstractViewHelper;
/**
* @author Marcus Biesioroff biesior@gmail.com>
*
* ViewHelper for displaying custom-designed errors
*
* Usage:
* {namespace yvh=VENDORYourextViewHelpers}
* or in ext_tables.php:
* $GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['yvh'] = ['VENDORYourextViewHelpers'];
*
* <yvh:myError  key="yourObj.somefield" flattenedErrors="{validationResults.flattenedErrors}"/>
*/
class MyErrorViewHelper extends AbstractViewHelper
{
protected $escapeOutput = false;
public function initializeArguments()
{
parent::initializeArguments();
$this->registerArgument('key', 'sring', 'Name of the field for which errors should be displayed');
$this->registerArgument('flattenedErrors', 'mixed', 'Flatenned errors if any');
}
public function render()
{
$flattenedErrors = $this->arguments['flattenedErrors'];
if (is_null($flattenedErrors)) return null;
// DebuggerUtility::var_dump($flattenedErrors);
$key = $this->arguments['key'];
if (is_array($flattenedErrors) && array_key_exists($key, $flattenedErrors)) {
$errMsg = $flattenedErrors[$key][0]->getMessage();
return "<div class='my-very-own-error-class'>$errMsg</div>";
}
return null;
}
}

请记住,无论如何,您都需要用<f包装字段才能获得flawnErrors数组;

{namespace yvh=VENDORYourextViewHelpers}
<f:form.validationResults>
<div>
<label for="name">Name (required)</label>
<f:form.textfield property="name"/>
<yvh:myError key="yourObj.name" flattenedErrors="{validationResults.flattenedErrors}"/>
</div>
<div>
<label for="slug">Slug (required)</label><br/>
<f:form.textfield property="slug"/>
<yvh:myError key="yourObj.slug" flattenedErrors="{validationResults.flattenedErrors}"/>
</div>
<div>
<label for="buildYear">Year of build (required)</label>
<f:form.textfield property="buildYear"/>
<yvh:myError key="yourObj.buildYear" flattenedErrors="{validationResults.flattenedErrors}"/>
</div>
</f:form.validationResults>

最新更新