TYPO3 9, присвоить ошибки проверки формы соответствующему полю - PullRequest
0 голосов
/ 24 января 2020

Обычно TYPO3 назначает переменную в FrontEnd с именем validationResults, и это выглядит так:

Errors

Затем мы должны выполнить итерацию Объекты ошибок и получить список со всеми ошибками и их сообщениями. Но нет способа взять каждый из них по отдельности и назначить его в соответствующем поле, где появляется ошибка.

Итак, вопрос в том, как мне это сделать?

С уважением,

1 Ответ

0 голосов
/ 24 января 2020

После некоторого программирования и помощи от larry-pete (typo3.slack.com) я нашел решение.

Я создал свой собственный ViewHelper , и он выглядит так:

ext_localconf. php

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

Классы / ViewHelpers / Форма / 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"/>

И это возвращает:

Results

Итак, теперь вы можете сделать что-то подобное:

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

С уважением

...