TYPO3:表格提交后填写表格

时间:2016-08-16 14:44:04

标签: php forms typo3 extbase

我创建了一个扩展程序,允许用户通过前端进行注册。我无法使用工作,因为客户要求特殊任务。

这是检测用户名的代码。

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
    }
}

但遗憾的是,当重定向回到新动作时,字段再次变空 有没有办法将参数传递回新操作并填写表单?

1 个答案:

答案 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渲染它们。