簡體   English   中英

TYPO3 9,將表單驗證錯誤分配給相應的字段

[英]TYPO3 9, assign form validation errors to the corresponding field

通常 TYPO3 在 FrontEnd 中分配一個名為validationResults的變量,它看起來像這樣。

錯誤

然后我們必須遍歷錯誤對象並獲得包含所有錯誤及其消息的列表。 但是沒辦法把每一個都單獨拿來賦值到出現錯誤的對應字段上。

所以問題是,我該怎么做?

最好的祝福,

經過一些編程和 larry-pete (typo3.slack.com) 的幫助,我找到了一個解決方案。

我創建了自己的 ViewHelper ,它看起來像這樣:

ext_localconf.php

$GLOBALS['TYPO3_CONF_VARS']['SYS']['fluid']['namespaces']['mytag'][] = 'Vendor\\ExtensionName\\ViewHelpers';

類/ViewHelpers/Form/ErrorViewHelper.php

namespace Vendor\ExtensionName\ViewHelpers\Form;

use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFieldViewHelper;


class ErrorViewHelper extends AbstractFormFieldViewHelper
{
  use CompileWithRenderStatic;

  /**
  * As this ViewHelper renders HTML, the output must not be escaped.
  *
  * @var bool
  */
  protected $escapeOutput = false;

  public function initializeArguments()
 {
    $this->registerArgument('for', 'string', 'The name of the error name (e.g. argument name or property name). This can also be a property path (like blog.title), and will then only display the validation errors of that property.', false, '');
    $this->registerArgument('as', 'string', '', false, 'flattenedErrors');
 }


 /**
 * @param array $arguments
 * @param \Closure $renderChildrenClosure
 * @param RenderingContextInterface $renderingContext
 * @return mixed
 */
 public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext)
 {
    $as = $arguments['as'];
    $for = $arguments['for'];

    $templateVariableContainer = $renderingContext->getVariableProvider();
    $controllerContext = $renderingContext->getcontrollerContext();
    $validationResults = $controllerContext->getRequest()->getOriginalRequestMappingResults();

    if ($validationResults !== null){
        $validationResults = $validationResults->forProperty($for);
    }
    $flattenedErrors = $validationResults->getErrors();

    $output = $renderChildrenClosure();
    $withKeys = [];
    if (empty($output)) {
        if ($flattenedErrors) {
            foreach ($flattenedErrors as $error) {
                $withKeys[$error->getTitle()] = $error;
            }
        }
    }
    $templateVariableContainer->add($as, $withKeys);

    return $output;
 }
}

表單.html

<mytag:form.error as="error" for="error"/>

這返回:

結果

所以現在,你可以這樣做:

<f:if condition="{offer.firstName}"><span style="display: block">{offer.firstName.message}</span></f:if>

最好的祝福

我稍微更改了您的 Viewhelper,因為它在我的版本中不起作用(typo3 9)

<?php

namespace Vendor\Extension\ViewHelpers;

use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;


class ErrorViewHelper extends AbstractViewHelper
{
  use CompileWithRenderStatic;

  /**
   * As this ViewHelper renders HTML, the output must not be escaped.
   *
   * @var bool
   */
  protected $escapeOutput = false;

  public function initializeArguments()
  {
    $this->registerArgument('for', 'string', 'The name of the error name (e.g. argument name or property name). This can also be a property path (like blog.title), and will then only display the validation errors of that property.', false, '');
  }


  /**
   * @param array $arguments
   * @param \Closure $renderChildrenClosure
   * @param RenderingContextInterface $renderingContext
   * @return mixed
   */
  public static function renderStatic(
    array $arguments,
    \Closure $renderChildrenClosure,
    RenderingContextInterface $renderingContext
  ) {
    $for = $arguments['for'];

    $controllerContext = $renderingContext->getControllerContext();
    $validationResults = $controllerContext->getRequest()->getOriginalRequestMappingResults();

    if ($validationResults !== null) {
      $validationResults = $validationResults->forProperty($for);
    }

    $flattenedErrors = $validationResults->getFlattenedErrors();
    return $flattenedErrors;
  }
}

你可以做:

{myExt:error() -> f:variable(name: 'errors')}}

要么

{ff:error( for:"user" ) -> f:variable(name: 'errors')}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM