我创建了一个扩展程序,允许用户通过前端进行注册。我无法使用工作,因为客户要求特殊任务。
这是检测用户名的代码。
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
}
}
但遗憾的是,当重定向回到新动作时,字段再次变空 有没有办法将参数传递回新操作并填写表单?
答案 0 :(得分: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
- 操作。在这种情况下,由于@ignorevalidation
- 操作上的new
注释,它会起作用。
此外,视图中提供了有关验证错误的信息,您可以使用ViewHelper f:form.validationResults
渲染它们。