0

私はこれを間違った方法で行っていると確信していますが、sfWidgetFormChoice の選択肢の 1 つから配列キーを設定解除する必要があります。その変数をフォームに取得する唯一の方法は、アクションからです。ここに私が持っているものがあります:

アクション:

$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
    ));
4

1 に答える 1

3

フォームとアクションの理解:
通常、フィールドを含むフォームをセットアップし、それを HTML ページに印刷して、フォームにデータを入力します。フォームの送信ボタンを押すと、フォームのactionhtml 属性で定義されたメソッドにすべてのデータが送信されます。
このメソッドは$request、多くのパラメーターとデータを含むフォームを受け取って取得します。これらの値はアクションで処理されます。

symfony で正確にどのように動作するか見てみましょう:

  • 上に示したような symfony フォームを定義してセットアップします。フォームを印刷し、アクション パラメータで、リクエストを受け取る送信メソッドを指定します。

    <form action="currentModuleName/update"

  • symfony は自動的にリクエストをaction.class.php モジュールの に送信し、データを探して関数に送信します executeUpdate

    public function executeUpdate(sfWebRequest $request){
    //...
    $this->form = new TestForm($doctrine_record_found);
    $this->processForm($request, $this->form);
    }

  • いくつかのチェックの後、symfony はフォームを処理し、結果テンプレートを設定します。

    processForm(sfWebRequest $request, sfForm $form) { ... }
    $this->setTemplate('edit');

processFormモジュールのaction.class.phpで、受信したすべての値 (リクエスト) も次の形式で処理する必要があります。

  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'];
    }
  }


を処理する方法について、あなたのような例については、次のリンクを 確認してくださいsfWidgetFormChoice
そして、実際の質問に答えて、削除されたユーザーを選択するために、アクションに次のコードを追加します。

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



アクションからフォームに変数を渡す:
質問をまったく理解していない場合は申し訳ありませんが、アクションからフォームにいくつかのパラメーターを渡す必要がある場合は、配列内の初期化変数をフォーム コンストラクターに送信します:
変数を渡すあなたの場合、ユーザーのリストを取得し、不要
なユーザーを削除し、削除されていないユーザーをフォームコンストラクターに送信します。フォームの初期化を変更できるように、 configure()関数
でフォームを再度宣言/上書きする必要があります。同じコードをコピーして configure() 関数に貼り付け、次の行をコメント化します。

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.
  }
}
于 2013-06-25T08:07:52.630 に答える