2010-01-28 48 views
3

我正在使用Symfony 1.4/Doctrine的管理生成器。在Symfony 1.4的管理生成器中創建一個新的刪除object_action

有一個問題的列表,我希望能夠在他們每個人上執行自定義object_action。

我在找的是模仿_delete對象操作,但在此之前做一些計算。

所以我創建了一個新的動作:

public function executeListDeleteAndRecalculate(sfWebrequest $request) 
    { 
    // Do the calculation 

    // Then delete the question 
    } 

而且我將它添加到我的generator.yml:

object_actions: 
    delete_and_recalculate: ~ 

新的動作顯示在管理髮電機,但刪除部分沒有按沒有工作。

我嘗試了一堆東西,使其工作:

  • 一旦所有的計算是這樣做,我第一次嘗試重定向到questionActions/delete行動。
  • 我也嘗試將executeDelete代碼複製到我的新操作中。

但每次我得到的臭名昭著的

500 |內部服務器錯誤| sfValidatorErrorSchema _csrf_token [必需]

所以我猜的Symfony實際上是刪除對象之前做一些魔法。

你知道我在想什麼嗎?實現deleteAndRecalculate類型的動作的最佳方式是什麼?

編輯:

當然,如果我刪除$request->checkCSRFProtection();一切工作就好了。但我認爲這很重要,所以我想找一個更漂亮的解決方案。

回答

4

這是因爲來自管理生成器的delete鏈接使用令牌來防止CSRF攻擊。

基本上,它會在您的會話中設置一個令牌並將其放入表單的隱藏字段中,然後在請求中針對另一個字段檢查它們。這是可能的,因爲管理生成器中的delete鏈接實際上是一個(JavaScript生成的)表單(這是爲了添加sf_method隱藏字段來模擬REST行爲)。

欲瞭解更多關於CSRF如何工作的,並可以預防的,你可以在維基百科上還寫着:http://en.wikipedia.org/wiki/Cross-site_request_forgery

你可以做的是使用同一種鏈接,你只需要一個method參數傳遞給link_to爲了生成表單,請看lib/generator/sfModelGeneratorHelper.class.php第32行,看看它是如何在admin-gen中完成的。

這樣,你會在你的executeDeleteAndRecalculate方法執行$request->checkCSRFProtection(),並且與任何你想做的事,包括手工刪除對象進行。

要正確生成的鏈接,你會在輔助類的模塊添加linkToDeleteAndRecalculate方法(即應當處於在lib/${YourModule}GeneratorHelper.class.php文件的模塊目錄),並添加以下代碼(直接截斷並從sfModelGeneratorHelper改編):

public function linkToDeleteAndRecalculate($object, $params) 
{ 
    if ($object->isNew()) 
    { 
    return ''; 
    } 

    return '<li class="sf_admin_action_delete">'.link_to(__($params['label'], array(), 'sf_admin'), 'delete_and_recalculate', $object, array('method' => 'delete', 'confirm' => !empty($params['confirm']) ? __($params['confirm'], array(), 'sf_admin') : $params['confirm'])).'</li>'; 
} 

請注意,你必須改變路線(我已經默認把delete_and_recalculate但你可能想用你的模塊名稱前綴的話)從link_to電話。

然後,您可以使用您的delete_and_recalculate幾乎像是從管理生成一個內置的方法(從generator.yml傳遞給它一個標籤爲例)

現在是硬的方式。

最簡單的方法是將訂閱admin.delete_object事件,從你的模塊的預執行,例如,和你的工作有:-)

+0

謝謝您的回答。 但是,即使我嘗試複製linkToDelete創建鏈接的方式,我無法生成創建窗體的onclick javascript事件。而且我也無法找到它爲_delete對象操作完成的地方。 關於「簡單的方法」:我不認爲這將工作,因爲我想保持默認的「刪除」行爲。 – 2010-01-28 14:28:01

+0

好的,我已經編輯了我的答案,指導如何生成鏈接,這有幫助嗎? – 2010-01-28 14:49:24

+0

我幾乎在那裏,一切似乎都沒事,直到我點擊鏈接。我不知道我在後端/ config/routing.yml中寫的路線有什麼問題(請參閱http://pastie.org/798862)。但是我得到一個404「Action」supprimer_et_recalculer/33「不存在。」 – 2010-01-28 15:27:51

相關問題