如何扩展 EXT:powermail 的日期选择器 viewhelper?

How to extend date picker viewhelper of EXT:powermail?

我需要向日期选择器字段添加自定义验证器。默认情况下,此字段没有任何验证器。

我已经在 tx_powermail_domain_model_field 的 TCA 中设置了验证器设置,并像往常一样添加了我的自定义验证器。

现在我需要将属性 data-parsley-customXXXdata-parsley-error-message 添加到 HTML 输入字段,这通常是通过 ValidationDataAttributeViewHelper.php 中的 viewhelper 完成的:
https://github.com/einpraegsam/powermail/blob/develop/Classes/ViewHelpers/Validation/ValidationDataAttributeViewHelper.php#L342
https://github.com/einpraegsam/powermail/blob/develop/Classes/ViewHelpers/Validation/ValidationDataAttributeViewHelper.php#L348

这是我需要扩展的代码: https://github.com/einpraegsam/powermail/blob/develop/Classes/ViewHelpers/Validation/DatepickerDataAttributeViewHelper.php#L32

我找到了解决问题的方法。正如评论中所建议的那样,可以扩展 Viewhelper:

ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']['SYS']['Objects'][\In2code\Powermail\ViewHelpers\Validation\DatepickerDataAttributeViewHelper::class] = [
  'className' => \Vendor\MyExt\Powermail\ViewHelpers\Validation\DatepickerDataAttributeViewHelper::class
];

myext/Classes/Powermail/ViewHelpers/Validation/DatepickerDataAttributeViewHelper.php

<?php
declare(strict_types=1);
namespace Vendor\MyExt\Powermail\ViewHelpers\Validation;

use In2code\Powermail\Domain\Model\Field;
use In2code\Powermail\Utility\LocalizationUtility;

class DatepickerDataAttributeViewHelper extends \In2code\Powermail\ViewHelpers\Validation\DatepickerDataAttributeViewHelper
{
    /**
     * Returns Data Attribute Array Datepicker settings (FE + BE)
     *
     * @return array for data attributes
     */
    public function render(): array
    {
        /** @var Field $field */
        $field = $this->arguments['field'];
        $additionalAttributes = $this->arguments['additionalAttributes'];
        $value = $this->arguments['value'];

        $additionalAttributes['data-datepicker-force'] =
            $this->settings['misc']['datepicker']['forceJavaScriptDatePicker'];
        $additionalAttributes['data-datepicker-settings'] = $this->getDatepickerSettings($field);
        $additionalAttributes['data-datepicker-months'] = $this->getMonthNames();
        $additionalAttributes['data-datepicker-days'] = $this->getDayNames();
        $additionalAttributes['data-datepicker-format'] = $this->getFormat($field);
        if ($value) {
            $additionalAttributes['data-date-value'] = $value;
        }

        if ($field->getValidation() && $this->isClientValidationEnabled()) {
            $value = 1;
            if ($field->getValidationConfiguration()) {
                $value = $field->getValidationConfiguration();
            }
            $additionalAttributes['data-parsley-custom' . $field->getValidation()] = $value;
            $additionalAttributes['data-parsley-error-message'] =
                LocalizationUtility::translate('validationerror_validation.' . $field->getValidation());
        }

        $this->addMandatoryAttributes($additionalAttributes, $field);

        return $additionalAttributes;
    }
}