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 呈现它们。