2013-06-24 65 views
0

我確定我正在以這種錯誤的方式進行,但我需要從sfWidgetFormChoice中的某個選項中取消設置數組鍵。將該變量賦給表單的唯一方法是從動作中獲取。下面是我有:如何將變量從動作傳遞到形式

操作:

$id = $request->getParameter('id'); 
$deleteForm = new UserDeleteForm(); 
$choices = array(); 
$choices = $deleteForm->getWidgetSchema('user')->getAttribute('choices'); 
unset($choices[$id]); //I obviously don't want the user to be able to transfer to the user being deleted 
$this->deleteForm = $deleteForm; 

形式:

$users = Doctrine_Core::getTable('sfGuardUser')->getAllCorpUsers()->execute(); 
$names = array(); 
    foreach($users as $userValue){ 
     $names[$userValue->getId()] = $userValue->getProfile()->getFullName(); 
    }; 
//  unset($names[$id]); //this works, but I can't figure out how to get $id here. 
    $this->widgetSchema['user'] = new sfWidgetFormChoice(array(
     'choices' => $names 
    )); 
    $this->validatorSchema['user'] = new sfValidatorChoice(array(
     'required' => true, 
     'choices' => $names 
    )); 
+0

你爲什麼要爲它標記symfony2? – cheesemacfly

+0

symfony2用戶以1.4開頭,這是理所當然的。我正在儘可能多地尋找我的問題。 – Patrick

+2

您應該使用[一個賞金](http://stackoverflow.com/help/bounty)。應避免將不相關標籤添加到問題以獲得可見性。 – cheesemacfly

回答

3

理解的形式和行動:
通常我們會設置與字段的表格,打印在一個HTML頁面並用數據填寫表單。按提交表單按鈕將發送所有數據到您的表格action html屬性中定義的方法。
該方法將收到並得到一個$request,有很多參數和形式與數據。這些值將在操作中處理。

讓我們看看它是如何工作的究竟了symfony:

  • 定義和設置一個symfony的形式,像你上面顯示的一個。 打印表格,並在動作參數點提交方法 將接收請求:

    <form action="currentModuleName/update"

  • 的Symfony會自動發送請求到action.class.php 你的模塊,並會查找並將數據發送到功能 executeUpdate

    公共職能的executeUpdate(sfWebRequest $請求){
    // ...
    $ this-> form = new TestForm($ doctrine_record_found);
    $ this-> processForm($ request,$ this-> form);
    }

  • 一些檢查後,symfony會處理的形式,並且一個結果集 模板。

    processForm(sfWebRequest $請求,sfForm $形式) {...}
    $這 - > setTemplate( '編輯');

在你的模塊action.class.phpprocessForm,你應該處理所有接收到的值(要求)也與形式:

protected function processForm(sfWebRequest $request, sfForm $form) 
    { 
    $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName())); 
    if ($form->isValid()) 
    { 
     $formValues = $this->form->getValues(); 
     $Id = $formValues['yourWidgetName']; 
    } 
    } 


您可以檢查以下link爲例像你的一樣,關於如何處理sfWidgetFormChoice
現在回答了真正的問題,以便選擇刪除用戶,添加以下代碼在你的行動:

//process the form, bind and validate it, then get the values. 
$formValues = form->getValues(); 
$choicesId = $formValues['choices']; 



通變量從行動到窗體:
藉口如果我根本不瞭解你的問題,但是如果你需要將一些參數從你的動作傳遞給表單,發送一個數組中的初始化變量給表單構造函數:
Pass a variable to a Symfony Form
在你的情況下,獲取用戶列表,刪除你不想要的用戶,並將未刪除的用戶發送到窗體構造函數。
您需要在configure()函數中重新聲明/覆蓋表單,以便您可以更改表單的初始化。將相同的代碼複製並粘貼到configure()函數中並註釋以下行:// parent :: setup();

class TbTestForm extends BaseTbTestForm 
{ 
    public function configure() 
    { 
     //.. copy here the code from BaseTbTestForm 
     //parent::setup(); 
     $vusers = $this->getOption('array_nondeleted_users'); 
     //now set the widget values with the updated user array. 
    } 
} 
+0

這是如何回答這個問題的? –

+0

對不起,我在完成之前按錯誤發送時正在應答。我仍然在修改答案。 – xtrm

+0

是的 - 我現在看到:)我認爲最後一部分將是最有用的OP。 –