Admin GeneratorのDoctrineフォームレイアウトの変更

私はAdmin GeneratorのDoctrine Formを変更する必要があります。

$this->embedRelation('MyRelation');

デフォルトのレイアウトは次のようになります。

Screenshot 1

目標 - セレクトの各アイテムは、別々の行にテキストとして表示され、さらに価格と数量が表示されます。

Screenshot 2

schema.yml

Game:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      game_name: { type: string(100), notnull: true }
    indexes:
      it:
  fields: game_name
  type: unique

  Campaign:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      name: { type: string(100), notnull: true }
      is_active: { type: boolean, notnull: true, default: 0 }
      start: { type: datetime, notnull: true }
      end: { type: datetime, notnull: true }
    relations:
      CampaignMatrix: { onDelete: CASCADE, local: id, foreign: campaign_id, foreignAlias: CampaignMatrixCampaign }

  CampaignGames:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      campaign_id: { type: integer(4), notnull: true, unsigned: true }
      game_id: { type: integer(4), notnull: true, unsigned: true }
    indexes:
      tc:
  fields: [campaign_id, game_id]
  type: unique
    relations:
      Campaign: { onDelete: CASCADE, local: campaign_id, foreign: id, foreignAlias: CampaignCampaignGames }
      Game: { onDelete: CASCADE, local: game_id, foreign: id, foreignAlias: GameCampaignGames }

  CampaignMatrix:
    actAs:
      Timestampable: ~
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      item_id: { type: integer(4), notnull: true, unsigned: true }
      campaign_id: { type: integer(4), notnull: true, unsigned: true }
      price_id: { type: integer(4), notnull: true, unsigned: true }
      quantity: { type: integer(4), notnull: true, unsigned: true }
    relations:
      Item: { onDelete: CASCADE, local: item_id, foreign: id, foreignAlias: ItemCampaignMatrix }
      Campaign: { onDelete: CASCADE, local: campaign_id, foreign: id, foreignAlias: CampaignCampaignMatrix }
      Price: { onDelete: CASCADE, local: price_id, foreign: id, foreignAlias: PriceItems }

  Price:
    columns:
      id: { type: integer(4), unsigned: true }
      currency_code: { type: string(3), notnull: true }
      price: { type: float, notnull: true }
    indexes:
      tc:
  fields: [id, currency_code]
  type: unique

  Item:
    actAs:
      Timestampable: ~
      I18n:
  fields: [name, description, image]
    columns:
      id: { type: integer(4), primary: true, autoincrement: true, unsigned: true }
      game_id: { type: integer(4), notnull: true, unsigned: true }
      product_id: { type: string(100), notnull: true }
      price_id: { type: integer(4), notnull: true, unsigned: true }
      quantity: { type: integer(4), notnull: true, unsigned: true }
      name: { type: string(100), notnull: true }
      description: { type: string(255), notnull: true }
      image: { type: string(255), notnull: true }
    indexes:
      it:
  fields: item_type
    relations:
      Game: { onDelete: CASCADE, local: game_id, foreign: id, foreignAlias: GameItems }
      Price: { onDelete: CASCADE, local: price_id, foreign: id, foreignAlias: PriceItems }

これが私のやり方です:

$list = MainItemTable::getInstance()->findByGameId($gameId);

$CampaignMatrix = new CampaignMatrix();

foreach($list as $index => $item) {

    $itemAssocForm = new CampaignMatrixForm($CampaignMatrix);
    $itemAssocForm->item_id = $item->getId();//Need it in the form as hidden field
    $this->embedForm($item->getProductId(), $itemAssocForm);
}

そして、これは私が値を取得しようとしている方法です:

$this->widgetSchema['item_id'] = new sfWidgetFormInputText(array(), array('value' => $this->item_id));//It doesn't get the Id

しかし、私はエラーがあります: 致命的なエラー:最大実行時間が30秒を超えました/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Relation/Parser.php on line 237

  1. CampaignMatrixFormでprice_idの設定を解除してもエラーは発生しません。ループ内のすべてのアイテム行に対して同じデータを選択して実行するのを避けるには?
  2. アイテムIDがありませんが、非表示フィールドとして必要です。現在の行のCampaignMatrix IDをCampaignMatrixFormに渡すにはどうすればよいですか?
0
私は私の質問^
追加された 著者 Roman Newaza,
あなたのスキーマから関連するテーブルを投稿できますか?
追加された 著者 yitznewton,

3 答え

メインフォームへのアソシエイションフォームを呼び出すためには、アソシエーションを繰り返す必要があります。 schema.ymlの一部を投稿すると簡単かもしれません。

このスニペットを再利用してみてください:

$list = MyRelatedObjectTable::getInstance()->findAll();

foreach($list as $item)
{
  $itemAssoc = AssociationTable::getInstance()->findByObjectId($this->object->id, $item->id);

  if(!$itemAssoc)
  {
    $itemAssoc = new Association();
    $itemAssoc->value_id = $itemAssoc->id;
    $itemAssoc->user_id = $this->object->id;
  }

  $itemAssocForm = new AssociationForm($itemAssoc);
  $this->embedForm('itemAssoc'.$item->code, $itemAssocForm);
}
1
追加された
だから、あなたはどのようにフォームのpreference_idとuser_idにアクセスしますか?
追加された 著者 Roman Newaza,
それは全く複雑ではありません;-)
追加された 著者 Roman Newaza,
私は自分のフォームでデータを更新することができませんでしたが、挿入するだけです...挿入されたアイテムを埋め込みフォームであらかじめ選択することはできませんでした。私は完全にカスタムにする必要がありますような継ぎ目。私はAJAXが助けると思う。
追加された 著者 Roman Newaza,
あなたのモデルは複雑すぎるかもしれません... CampaignGamesでCampaignMatrixをリファクタリングしてみてください。目標を達成するには、カスタムフォームの作成と処理に深く投資する必要があります。カスタムフォームクラスを作成し、カスタムウィジェットとwidgetSchemaをロードします。処理のために、独自のdobindを作成し、doctrine objetcを更新するためのメソッドを保存します。 EmbedFormはデザインが悪く、あなたの目標に合わないこともあります。
追加された 著者 dxb,

キャッシュからコードを取得し、バックエンド/ modules/nameAPPに移動して次のテンプレートを編集することができます

0
追加された
この教義の形式。私は良い方法があると思う。
追加された 著者 Roman Newaza,

最善の方法はそれを部分的に作成することです。 FormクラスのItemの選択ボックスを unset する必要があることに注意してください。そうしないと、関連付けが失われます。あなたがもっと助けを必要とするなら、私はそれについて詳述することができます。

0
追加された
送信アクションがそのフィールドに情報を受け取らない場合(ウィジェットはレンダリングされません)、空のフィールドを送信するようなものです。値がクリアされます。 しかし、最良の選択肢はフィールドを sfWidgetFormInputHidden に変換することです。これは関連付けを維持し、値が失われるのを防ぎます。
追加された 著者 samura,
私がItem selectを設定していない場合、関連が失われるのはなぜですか?
追加された 著者 Roman Newaza,
私は質問を更新しました
追加された 著者 Roman Newaza,