TYPO3 TCA自定义评估(验证)三个字段的组合。

5
我阅读了有关type=input的eval属性的文档,并尝试进行了自己的评估。
应该使用以下逻辑评估三个字段的组合: start_date和end_date必填(非空),或者需要date_on_request。
类已加载,evaluateFieldValue()函数正常运行,但我在表单中缺少反馈。
<?php
namespace Vendor\Extension\Evaluation;

class StartDateAndEndDateOrDateOnRequestEvaluation {

    /**
     * JavaScript code for client side validation/evaluation
     *
     * @return string JavaScript code for client side validation/evaluation
     */
    public function returnFieldJS() {
        return 'return value;';
    }

    /**
     * Server-side validation/evaluation on saving the record
     *
     * @param string $value The field value to be evaluated
     * @param string $is_in The "is_in" value of the field configuration from TCA
     * @param bool $set Boolean defining if the value is written to the database or not.
     * @return string Evaluated field value
     */
    public function evaluateFieldValue($value, $is_in, &$set) {

        foreach($_POST['data']['tx_extension_domain_model_course'] as $id => $course) {
            if ( (!empty($course['start_date']) && !empty($course['start_date'])) || !empty($course['date_on_request']) ) {
                $set = true;
            } else {
                $set = false;
            }
        }
        return $value;
    }

    /**
     * Server-side validation/evaluation on opening the record
     *
     * @param array $parameters Array with key 'value' containing the field value from the database
     * @return string Evaluated field value
     */
    public function deevaluateFieldValue(array $parameters) {
        return $parameters['value'];
    }

}

我正在寻找JavaScript中验证的示例(returnFieldJS):

  • 我如何获取这三个字段?
  • 如何设置错误类?

在evaluateFieldValue()中应该检查什么?

1个回答

0
方法returnFieldJS()deevaluateFieldValue(array $parameters)不适用于datetime字段。这就是为什么我猜测没有干净的方法来添加JavaScript验证到datetime字段的原因。 然而,为了在后端获得错误消息,您可以使用FlashMessageService。我实现了一个示例来检查course_end日期是否在course_start日期之后:

<?php
namespace Vendor\Extension\Evaluation;

use TYPO3\CMS\Core\Messaging\FlashMessage;
use TYPO3\CMS\Core\Messaging\FlashMessageService;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;

class StartDateAndEndDateOrDateOnRequestEvaluation {
    /**
     * JavaScript code for client side validation/evaluation
     *
     * @return string JavaScript code for client side validation/evaluation
     */
    public function returnFieldJS() 
    {
        return 'return value;';
    }

    /**
     * Server-side validation/evaluation on saving the record
     *
     * @param string $value The field value to be evaluated
     * @param string $is_in The "is_in" value of the field configuration from TCA
     * @param bool $set Boolean defining if the value is written to the database or not.
     * @return string Evaluated field value
     */
    public function evaluateFieldValue($value, $is_in, &$set)
    {
        $formData = GeneralUtility::_GP('data');
        $courseId = key($formData['tx_extension_domain_model_course']);
        $course = $formData['tx_extension_domain_model_course'][$courseId];

        $courseStart = new \DateTime($course['course_start']);
        $courseEnd = new \DateTime($course['course_end']);

        if ($courseStart > $courseEnd) {
            $this->flashMessage('Invalid field value', 'Course end date can not be before course start date!', FlashMessage::ERROR);
            $set = false; //do not save value
        }

        return $value;
    }

    /**
     * Server-side validation/evaluation on opening the record
     *
     * @param array $parameters Array with key 'value' containing the field value from the database
     * @return string Evaluated field value
     */
    public function deevaluateFieldValue(array $parameters) 
    {
        return $parameters['value'];
    }

    /**
     * @param string $messageTitle
     * @param string $messageText
     * @param int $severity
     */
    protected function flashMessage($messageTitle, $messageText, $severity = FlashMessage::ERROR)
    {
        $message = GeneralUtility::makeInstance(
            FlashMessage::class,
            $messageText,
            $messageTitle,
            $severity,
            true
        );

        $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
        $flashMessageService = $objectManager->get(FlashMessageService::class);
        $messageQueue = $flashMessageService->getMessageQueueByIdentifier();
        $messageQueue->addMessage($message);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接