Php 类型3:如何通过属性验证覆盖默认错误消息?

Php 类型3:如何通过属性验证覆盖默认错误消息?,php,validation,typo3,extbase,typo3-7.6.x,Php,Validation,Typo3,Extbase,Typo3 7.6.x,我有一个类Publisher,我想用属性验证来验证它。 但是我想覆盖默认的错误消息 以下是我的发行商模型的一个片段: <?php namespace Typo3\LpSurvey\Domain\Model; use TYPO3\CMS\Extbase\DomainObject\AbstractEntity; class Publisher extends AbstractEntity { /** * salutation * * @var boo

我有一个类
Publisher
,我想用属性验证来验证它。 但是我想覆盖默认的错误消息

以下是我的
发行商
模型的一个片段:

<?php
namespace Typo3\LpSurvey\Domain\Model;

use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

class Publisher extends AbstractEntity
{

    /**
     * salutation
     *
     * @var bool
     * @validate NotEmpty
     */
    protected $salutation;

    ...
}
现在,如果称呼字段为空,我会收到默认的
NotEmpty
错误消息,但我想覆盖它

可能在locallang.xlf中有错误代码

我尝试了这个,但没有解决方案:

<xliff version="1.0">
    <file source-language="en" datatype="plaintext" original="messages" date="2016-10-06T09:49:41Z" product-name="lp_survey">
        <header/>
        <body>
            ...
            <trans-unit id="survey.publisher.salutation.1221560910">
                <source>Der angegebene Wert ist leer.</source>
            </trans-unit>
        </body>
    </file>
</xliff>

...
这是我的梦想。

有人有主意吗?

我通常会这样定制:

<f:form.validationResults for="{field}">
    <f:for each="{validationResults.flattenedErrors}" key="propertyPath" as="propertyErrors">
        <f:for each="{propertyErrors}" as="propertyError">
            <div class="form__field-error">
                <f:translate key="validator.{propertyPath}.{propertyError.code}" default="{propertyError}" />
            </div>
        </f:for>
    </f:for>
</f:form.validationResults>

上述结构可以在不使用
的情况下用于
参数,并且功能相同。

要获得更全面的解决方案,您可以在打字脚本中简单地更改extbase的翻译。然后,您不必在模板中执行任何操作,而是像以前一样显示错误消息。此更改将影响所有模板和其他extbase扩展,因此您将在整个应用程序中收到一条漂亮的流线型错误消息

plugin.tx_extbase._LOCAL_LANG.de {
  validator.notempty.empty = Der angegebene Wert ist leer.
  validator.notempty.null = Der angegebene Wert ist leer.
}
作为一个小小的奖励,我添加了
validator.notempty.null
,因为null错误消息对于最终用户来说没有意义

更新 我的FormPropertyError部分如下所示-但您的代码片段也应该可以工作

<f:comment>
    Only required parameter is {property}
</f:comment>
<f:form.validationResults for="{property}">
    <f:if condition="{validationResults.errors}">
        <ul class="errors">
            <f:for each="{validationResults.errors}" as="error">
                <li>{error.message -> f:format.printf(arguments: error.arguments)}</li>
            </f:for>
        </ul>
    </f:if>
</f:form.validationResults>

唯一必需的参数是{property}
  • {error.message->f:format.printf(参数:error.arguments)}
打字方式是

config.tx_extbase._LOCAL_LANG.de {
  validator\.notempty\.empty = Der angegebene Wert ist leer.
  validator\.notempty\.null = Der angegebene Wert ist leer.
}

在Lasse的代码段中,“plugin”必须在“config”中更改,标签键中的点必须转义。

自TYPO3 6.2以来,您可以使用自定义翻译文件覆盖Extbase(或任何其他扩展名)中的默认验证消息

在sitepackage或提供程序扩展的
ext\u localconf.php
中,您需要定义要覆盖的语言文件。下面的示例覆盖了德语文件Extbase本地化

$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['de']['EXT:extbase/Resources/Private/Language/locallang.xlf'][] = 'EXT:your_sitepackage/Resources/Private/Language/de.extbase_locallang.xlf';
这定义了对语言文件
de.extbase\u locallang.xlf
的引用,从中覆盖原始XLIFF文件的本地化

自定义语言文件中的示例内容:

  <trans-unit id="validator.boolean.nottrue">
    <source>The given subject was not true.</source>
    <target>Sie müssen dieses Feld bestätigen.</target>
  </trans-unit>

给定的主题不是真的。
我是穆森·迪塞斯·费尔德·贝斯特·蒂根。

您好,这听起来也很棒,但我无法让它运行。我已将您的代码添加到模板的设置区域,但也会收到默认错误消息。顺便说一句,我的实际直觉是覆盖空消息。:)嗯,真奇怪。这是一个复制粘贴从工作TYPO3 7.6安装。我唯一能做的改变是将它自己翻译成德语,而不是丹麦语。我不会说德语,但这就是你试图改变翻译的语言,对吗?好吧,它应该会起作用,我不知道它对你不起作用。我所能看到的唯一不同之处是消息的输出。我会用我的FormError partialOk更新我的答案,用你更新的partialOk更新我的答案,我也会用。:)Thx的解决方案!
config.tx_extbase._LOCAL_LANG.de {
  validator\.notempty\.empty = Der angegebene Wert ist leer.
  validator\.notempty\.null = Der angegebene Wert ist leer.
}
$GLOBALS['TYPO3_CONF_VARS']['SYS']['locallangXMLOverride']['de']['EXT:extbase/Resources/Private/Language/locallang.xlf'][] = 'EXT:your_sitepackage/Resources/Private/Language/de.extbase_locallang.xlf';
  <trans-unit id="validator.boolean.nottrue">
    <source>The given subject was not true.</source>
    <target>Sie müssen dieses Feld bestätigen.</target>
  </trans-unit>