2016-08-16 162 views
0

我創建了一個允許用戶通過前端註冊的擴展名。我無法使用工作的客戶端,因爲客戶端請求了特殊的任務。TYPO3:表格提交後填寫表格

這是檢測用戶名的代碼。

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

但不幸的是,當重定向回到新動作時,這些字段又是空的。
有沒有辦法將參數傳遞迴新的動作並填寫表單?

回答

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 -action。在這種情況下,由於new -action上的@ignorevalidation註釋會生效。

此外,有關驗證錯誤的信息在視圖中可用,您可以使用ViewHelper f:form.validationResults呈現它們。

+0

我一直在努力了一段時間,我無法弄清楚如何讓自定義驗證運行...你知道TYPO3 7.6的最新教程嗎? – Norman

+0

你可以展示你的驗證器嗎?它是否被稱爲?在它裏面嘗試一些'die'或'var_dump'語句。另外,請確保在更新註釋後始終清除安裝工具中的緩存。 – Jost

+0

好吧,我做的一切都正確,只是緩存問題。必須再次卸載並安裝擴展,在安裝工具中清除緩存是不夠的。 – Norman