0

symfony 1.4 フォーム システムが最適ではなく、多くの人に多くの問題を引き起こしていることはわかっていますが、このタスクを完了する必要があり、助けが必要です。

メインフォームに埋め込まれたサブフォームにサブフォームを埋め込む必要があり、それを Ajax 経由で行います。

基本的に、aForm、bForm、およびcFormがあり、aFormにはbFormが埋め込まれ、bFormには1つ以上のcFormを含めることができます。

各フォームの configure() 関数から通常どおり埋め込むと、機能します。しかし、Ajax を使用して複数の cForms を bForm に埋め込もうとすると、それらをバインドできません。

これは動作するバージョンです。すべてが正常に埋め込まれ、正常に検証されています。

class BookingForm extends BaseBookingForm
{
  public function configure()
  {     
      $this->embedRelation('Journey as journey');
  }
}

[...]

class JourneyForm extends BaseJourneyForm
{
  public function configure()
  {
      $pickup_form = new JourneyItineraryForm();
      $this->embedForm('pickup_form', $pickup_form);

  }
} 

[...]

class JourneyItineraryForm extends BaseJourneyItineraryForm
{
  public function configure()
  {
  }
}

[...]

ここで、ajax を介して JourneyItineraryForm を埋め込もうとすると、テンプレートにウィジェットを表示することはできましたが、バインドに失敗します。「ウェイポイント」という名前の予期しない追加のフォームフィールドが表示されます。

以下のコードを表示します。

class JourneyForm extends BaseJourneyForm
{
      public function configure()
      {
          $waypoint_form = new JourneyItineraryForm();
          $this->embedForm('waypoint', $waypoint_form);

      }

      public function addNewWaypoint($number)
      {
       /*
       * Called from actions.class.php after an ajax request
       */

       $new_waypoints = new BaseForm();

       for($i=0; $i <= $number; $i+=1)
       {
         $waypoint = new JourneyItinerary();
         $waypoint_form = new JourneyItineraryForm($waypoint);
         $new_waypoints->embedForm($i,$waypoint_form);
       }

      $this->embedForm('waypoint', $new_waypoints);
      }

    public function bind(array $taintedValues = null, array $taintedFiles = null)
    {

      $new_occurrences = new BaseForm();
      foreach($taintedValues['waypoint'] as $key => $new_occurrence)
      {
        $occurrence = new JourneyItinerary();      
        $occurrence_form = new JourneyItineraryForm($occurrence);
        $new_occurrences->embedForm($key,$occurrence_form);
      }

      $this->embedForm('waypoint',$new_occurrences);

      parent::bind($taintedValues, $taintedFiles);
    }
 } 

私のテンプレートは、次のようなウェイポイントウィジェットを表示するために管理しています

$form['journey']['waypoint'][0]['field_name']->renderRow();

また、BookingForm から bind メソッドを上書きしようとしましたが、正しく行ったかどうかはわかりません。

public function bind(array $taintedValues = null, array $taintedFiles = null)
{   
    $new_occurrences = new sfForm();
    foreach($taintedValues['journey']['waypoint'] as $key => $new_occurrence)
    {
      $occurrence = new JourneyItinerary();      
      $occurrence_form = new JourneyItineraryForm($occurrence);

      $new_occurrences->embedForm($key,$occurrence_form);
    }

    $this->embedForm('journey',$new_occurrences);

    parent::bind($taintedValues, $taintedFiles);
}

私はこのチュートリアルに従いました: http://tech.cibul.net/embedded-forms-with-symfony-1-4-and-jquery/ また、公式ドキュメントhttp://symfony.com/legacy/doc/moreを読みます-with-symfony/1_4/en/06-Advanced-Forms

どんな助けでも大歓迎です:)ありがとう。

4

1 に答える 1

0

このプラグインahDoctrineEasyEmbeddedRelationsPluginを試すことができます。シンプルで高速です。ただし、埋め込みで埋め込みを行うことはできませんが、あなたの場合は1つのフォーム2埋め込みフォームにあります。

于 2013-03-20T09:24:25.590 に答える