0

Ubuntu 9.10 で Symfony 1.3.2 と Propel ORM を使用しています。

AJAX を使用して、選択した国の都市を選択ウィジェットに動的に入力するフォームを開発しました。

フォームに入力されたデータが保存される前に、フォームを検証します。検証が失敗した場合、修正のためにフォームがユーザーに返されます。ただし、国リストは動的に生成されるため、修正のために表示されるフォームには有効な都市が選択されていません (国ウィジェットがまだ変更されていないため、空です)。

これは、ユーザーが別の国を選択し (変更イベントが発生する)、選択した元の国に戻り、最後に最後に選択した都市を選択する必要があることを意味するため、ユーザーにとって不便です。

別の (おそらく無関係の) フィールドが検証されなかったため、このすべてがユーザーに強制されます。

$form->getValue('widget_name') を $form->bind() の直後に呼び出してみましたが、どうやら (実際、IIRC、フォームの検証に失敗した場合、すべての値が null にリセットされます) - そうです。うまくいかない。

私は現在、$_POST を介して入力 (つまり、汚染された) データに直接アクセスし、それらをフラッシュ変数に設定するという厄介なハックを試みていますが、非常に厄介なハックだと感じています)

私がやろうとしているのは、一般的なユース ケース シナリオです。$_POST などでハッキングするよりも、これを行うためのより良い方法はありますか?

4

1 に答える 1

1

この正確な問題に対して私が行うことは、フォームを生成したのと同じアクションにフォームを投稿し、そのアクションで、選択した国/地域/都市を POST 変数として取得し、それらをテンプレートに戻すことです (検証に関係なく)。 . テンプレートでは、JQuery を使用して選択値を元の値に設定します。検証に合格すると、それらは使用されます。そうでない場合は、テンプレートに戻されます。

JQuery で少しの PHP を許容できる場合は、テンプレートでこれを行うことができます。

$(document).ready(function()
{
   $("#country-select").val('<?php echo $posted_country; ?>');
});

このアプローチを使用する場合は、最初にテンプレートで $this->posted_country を初期化することを忘れないでください。そうしないと、Jquery が混乱します。

$this->form->setWidget(...)->setDefault(...) なども使用できると思いますが、要素にアクセスするには $_POST をバインドする必要があるように見えるため、 $_POST を使用する方法は見つかりませんでしたそれ以外の形式。

以下のコメントに応じて更新されたコード:

if($_POST['profile']['country_id'] != '') 
{
    $this->posted_country = $_POST['profile']['country_id'];
    $q = Doctrine_Query::create()
        ->select('c.city_id, c.city_name')
        ->from('City c')
        ->where('c.country_id = ?', $this->posted_country);     
    $cities = $q->execute(array(), Doctrine_Core::HYDRATE_NONE);
    foreach($cities as $city) $list[$city[0]] = $city[1];
    $this->form->setWidget('city_id', new sfWidgetFormChoice(array('choices' => array('' => 'Please select') + $list)));
}

だから...私は投稿から国を取得し、それでdbをクエリし、都市を取得し、都市をドロップダウンに戻します。次に、テンプレートで、 $this->posted_city (存在する場合は POST 変数にもな​​ります) のようなものを使用して、デフォルトで選択された都市を設定できます。

于 2010-03-09T10:29:56.793 に答える