2016-08-16 118 views
0

我创建了一个允许用户通过前端注册的扩展名。我无法使用工作的客户端,因为客户端请求了特殊的任务。TYPO3:表格提交后填写表格

这是检测用户名的代码。

public function createAction(\Vendor\Feregister\Domain\Model\FeUserX $newFeUserX) 
{ 
    $uname = $newFeUserX->getUsername(); 
    $select_query = '*'; 
    $from_table = 'fe_users'; 
    $where_clause = 'username="'.$uname.'"'; 

    $test = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_query, $from_table, $where_clause); 

    if ($GLOBALS['TYPO3_DB']->sql_num_rows($test)) { 

     $this->addFlashMessage('Username is already taken.', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR); 

     $this->redirect('new'); 

    } else { 

     // do stuff when the username isn't taken yet 
    } 
} 

但不幸的是,当重定向回到新动作时,这些字段又是空的。
有没有办法将参数传递回新的动作并填写表单?

回答

2

是的,extbase有一个标准化的方式来做到这一点。它的工作原理如下:

如果调用某个操作,则会验证其参数,除非在doc注释中关闭了验证。如果验证失败,则以前的操作(其视图包含提交的表单的操作)将再次被调用,并使用相同的参数。

如下您可以使用此:

/** 
* @param \Vendor\Feregister\Domain\Model\FeUserX $newFeUserX 
* @ignorevalidation $newFeUserX 
*/ 
public function newAction(\Vendor\Feregister\Domain\Model\FeUserX $newFeUserX = null) 
{ 
    $this->view->assign('user', $newFeUserX); 
    // View renders form with name="newFeUserX" and object="{user}", 
    // action="create", fields use the property-attribute to fill 
    // in values and field names. 
} 

/** 
* @param \Vendor\Feregister\Domain\Model\FeUserX $newFeUserX 
* @validate $newFeUserX \Vendor\Feregister\Validator\UsernameDoesNotExistValidator 
*/ 
public function createAction(\Vendor\Feregister\Domain\Model\FeUserX $newFeUserX) 
{ 
    // Do something with the user - you can be sure the username 
    // is not yet taken 
} 

\Vendor\Feregister\Validator\UsernameDoesNotExistValidator是实现ValidatorInterface,或扩展AbstractValidator一个自定义的验证。它应该基本上做你在你的createAction(可能使用存储库,而不是$GLOBALS['TYPO3_DB'])做的验证。验证器以标准方式返回错误,使得更容易显示好的错误消息并对其进行本地化。

如果验证失败,extbase将尝试转发呈现表单的动作,在这种情况下为new -action。在这种情况下,由于new -action上的@ignorevalidation注释会生效。

此外,有关验证错误的信息在视图中可用,您可以使用ViewHelper f:form.validationResults呈现它们。

+0

我一直在努力了一段时间,我无法弄清楚如何让自定义验证运行...你知道TYPO3 7.6的最新教程吗? – Norman

+0

你可以展示你的验证器吗?它是否被称为?在它里面尝试一些'die'或'var_dump'语句。另外,请确保在更新注释后始终清除安装工具中的缓存。 – Jost

+0

好吧,我做的一切都正确,只是缓存问题。必须再次卸载并安装扩展,在安装工具中清除缓存是不够的。 – Norman