TYPO3 Extbase:如何验证表单

3

我创建了一个简单的“订阅通讯”表单:

<f:form action="subscribe" method="post" name="newsletterform">
  <f:form.textfield id="name" name="name" required="true" />
  <f:form.textfield id="email" name="email" required="true"/>
  <button type="submit">Submit</button>
</f:form>

正如您所看到的,这不是基于现有模型的表单,我对将通讯订阅保存到数据库没有兴趣(它们将在其他地方存储)。

现在,在我的subscribeAction中,我想进行一些表单验证。我想检查电子邮件是否真的是电子邮件地址,如果不为空等。是否有一种方法可以使用typo3 / extbase Validators?如果有-如何使用?

3个回答

7
您可以创建一个专用的类,它不是数据库模型,但扩展了\TYPO3\CMS\Extbase\DomainObject\AbstractEntity,并允许您通过Extbase映射该类:
例如文件:typo3conf/ext/yourext/Classes/Domain/Form/SubscribeForm.php
<?php

namespace Vendor\Extname\Domain\Form;

use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;

class SubscribeForm extends AbstractEntity {

    /**
     * @var string
     * @validate NotEmpty
     */
    protected $name;

    /**
     * @var string
     * @validate NotEmpty
     * @validate EmailAddress
     */
    protected $email;

    /** @return string */
    public function getName() {
        return $this->name;
    }

    /** @param string $name */
    public function setName($name) {
        $this->name = $name;
    }

    /** @return string */
    public function getEmail() {
        return $this->email;
    }

    /** @param string $email */
    public function setEmail($email) {
        $this->email = $email;
    }

}

使用这样的类,您可以像使用普通的领域模型一样工作,但它不会保存到任何地方 - https://docs.typo3.org/typo3cms/ExtbaseFluidBook/9-CrosscuttingConcerns/2-validating-domain-objects.html 在您的控制器中,您只需使用两个操作来处理它:
/**
 * Displays the subscription form
 *
 * @param \Vendor\Extname\Domain\Form\SubscribeForm|NULL $subscribeForm
 * @dontvalidate $subscribeForm
 */
public function subscribeAction(\Vendor\Extname\Domain\Form\SubscribeForm $subscribeForm = NULL) {

}

/**
 * Handle the valid subscription form
 */
public function subscribeSaveAction(\Vendor\Extname\Domain\Form\SubscribeForm $subscribeForm) {
    // Handle the $subscribeForm
}

抱歉,文件/类名中有一个错误 - 我使用了 Subscribe,应该是 SubscribeForm,所以如果您正在尝试使用代码片段,请修复它。 - biesior

0

是的,你可以使用Fluid Validator,但我建议你使用ValidationEngine

<input type="email" name="email" id="email" data-validation-engine="validate[required,custom[email]]"
data-errormessage-value-missing="Email is required!" 
data-errormessage-custom-error="Let me give you a hint: someone@nowhere.com" 
data-errormessage="This is the fall-back error message."/>

0

如果您想在控制器操作中验证邮件地址,可以使用EmailAddressValidator类。

这里是一个参考: https://typo3.org/api/typo3cms/class_t_y_p_o3_1_1_c_m_s_1_1_extbase_1_1_validation_1_1_validator_1_1_email_address_validator.html#a72063d2e922edda5321b1970297eb0c3

我认为更好的方法是在客户端验证表单。用户可以直接看到哪里出了问题。

有关HTML5表单验证,请查看此处: https://www.sitepoint.com/client-side-form-validation-html5/

http://www.w3schools.com/html/html_form_attributes.asp


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