TYPO3:提交表格后保留表格
TYPO3: Keep forms filled after form submit
我创建了一个允许用户通过前端注册的扩展。我不能使用工作的,因为客户要求特殊任务。
这是检测被占用用户名的代码。
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
}
}
但不幸且显而易见的是,当重定向回新操作时,字段再次为空。
有没有办法将参数传递回新操作并填写表格?
是的,extbase 有一个标准化的方法来执行此操作。它的工作原理如下:
如果调用一个动作,它的参数会被验证,除非在文档注释中关闭验证。如果验证失败,将使用相同的参数再次调用之前的操作(其视图包含已提交表单的操作)。
您可以按如下方式使用:
/**
* @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
}
class \Vendor\Feregister\Validator\UsernameDoesNotExistValidator
是实现 ValidatorInterface
, or extends AbstractValidator
的自定义验证器。它应该基本上完成您在 createAction
中所做的验证(可能使用存储库而不是 $GLOBALS['TYPO3_DB']
)。验证器 returns 以标准方式出错,更容易显示漂亮的错误消息并将它们本地化。
如果验证失败,extbase 将尝试转发到呈现表单的操作,在本例中为 new
-操作。在这种情况下,它会起作用,因为 new
-action 上的 @ignorevalidation
注释。
此外,有关验证错误的信息在视图中可用,您可以使用 ViewHelper f:form.validationResults
呈现它们。
我创建了一个允许用户通过前端注册的扩展。我不能使用工作的,因为客户要求特殊任务。
这是检测被占用用户名的代码。
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
}
}
但不幸且显而易见的是,当重定向回新操作时,字段再次为空。
有没有办法将参数传递回新操作并填写表格?
是的,extbase 有一个标准化的方法来执行此操作。它的工作原理如下:
如果调用一个动作,它的参数会被验证,除非在文档注释中关闭验证。如果验证失败,将使用相同的参数再次调用之前的操作(其视图包含已提交表单的操作)。
您可以按如下方式使用:
/**
* @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
}
class \Vendor\Feregister\Validator\UsernameDoesNotExistValidator
是实现 ValidatorInterface
, or extends AbstractValidator
的自定义验证器。它应该基本上完成您在 createAction
中所做的验证(可能使用存储库而不是 $GLOBALS['TYPO3_DB']
)。验证器 returns 以标准方式出错,更容易显示漂亮的错误消息并将它们本地化。
如果验证失败,extbase 将尝试转发到呈现表单的操作,在本例中为 new
-操作。在这种情况下,它会起作用,因为 new
-action 上的 @ignorevalidation
注释。
此外,有关验证错误的信息在视图中可用,您可以使用 ViewHelper f:form.validationResults
呈现它们。