[英]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
}
\\Vendor\\Feregister\\Validator\\UsernameDoesNotExistValidator
是實現ValidatorInterface
或擴展AbstractValidator
的自定義驗證器。 它基本上應該執行您在createAction
中正在執行的驗證(也許使用存儲庫而不是$GLOBALS['TYPO3_DB']
)。 驗證器以標准方式返回錯誤,從而更容易顯示好錯誤消息並將其本地化。
如果驗證失敗,則extbase將嘗試轉發給呈現表單的操作,在本例中為new
-action。 在這種情況下,由於new
-action上的@ignorevalidation
批注,它可以工作。
此外,視圖中還提供了有關驗證錯誤的信息,您可以使用ViewHelper f:form.validationResults
呈現它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.