私のアプリケーションには、独自のウィジェットを備えた多くのモジュールと多くのフォームがあります。ウィジェット
をグローバルに「設定解除」、「非表示」、または「読み取り専用にする」ことを試みています。フォームのconfigure()
関数で
1つのウィジェットに対してそれを行うことが可能であることは知っていますが、可能であればグローバルな方法でより良い解決策を探しています。すべてのモジュール フォームを変更し、それらを追跡するのは面倒な場合があります。
スレッドは少し長くなる可能性がありますが、問題を理解しやすいと思います。読む時間があれば、どうもありがとうございます :)
いくつかのオプションをテストするために Timestampable 動作を備えた単純なニュース モジュールを作成しましたが、それでもどれも機能しませんでした。
- テーブル:
TbNews
- 列:
id
主キーとしてscontent
ニュースコンテンツを保存するためのテキストフィールドとして。created_at
日時として。(タイムスタンプ可能な動作)updated_at
日時として。(タイムスタンプ可能な動作)
TbNews schema.yml:
TbNews: connection: doctrine_master tableName: tb_news columns: id: type: integer(8) fixed: false unsigned: false primary: true autoincrement: true scontent: type: string(64000) fixed: false unsigned: false primary: false notnull: true autoincrement: false actAs: Timestampable: created: name: created_at type: timestamp format: Y-m-d H:i:s options: notnull: false required: false updated: name: updated_at type: timestamp format: Y-m-d H:i:s options: notnull: false required: false
フォーム内の TbNews updated_at
(例として、ここでは updated_at 列のみを記述):
class TbNewsForm extends PluginTbNewsForm { public function configure() { $this->setWidgets(array( 'updated_at' => new sfWidgetFormDateTime(), )); $this->setValidators(array( 'updated_at' => new sfValidatorDateTime(array('required' => false)), )); } }
TbNews updated_at のテンプレート _form.php :
多くのオプションをテストし、updated_at を次のように手動でレンダリングしました: "echo $form['updated_at']" を使用し、レンダリングせずに。
<?php echo $form->renderHiddenFields(false) ?>
update_at
列を含むグローバル テスト lib/form/doctrine/BaseFormDoctrine.class.php
: :
- では
sfWidgetFormInputHidden()
、ウィジェットはテンプレートでレンダリングされません。
setWidget を使用して、設定を解除せずに、設定を解除して、それを使用せずにテストしました...すべての可能なオプションですが、フィールド updated_at はテンプレートでレンダリングされません。( renderHiddenFields() を使用)
abstract class BaseFormDoctrine extends sfFormDoctrine { public function setup() { $value_updated_at = $this->getObject()->updated_at; unset($this->widgetSchema['updated_at']); unset($this->validatorSchema['updated_at']); $this->widgetSchema['updated_at'] = new sfWidgetFormInputHidden(); $this->widgetSchema['updated_at']->setOption('is_hidden', 'true'); $this->widgetSchema['updated_at']->setOption('type', 'hidden'); $this->setDefault('updated_at', $value_updated_at); $this->setWidget('updated_at', new sfWidgetFormInputHidden(array('value'=>$value_updated_at))); //$this->setWidget('updated_at', $this->widgetSchema['updated_at']); } }
- 読み取り専用: _form.php テンプレートに
フィールドを追加しましたが、読み取り専用として表示されません。updated_at
では動作しないようsfWidgetFormDateTime
です。$this->widgetSchema['updated_at']->setAttribute('readonly', 'readonly');
質問と考え:
おそらく
BaseFormDoctrine
、すべてのフォーム モジュールでウィジェットをグローバルに変更する正しい方法ではないか、テストに問題がある可能性があります。
おそらくご存知かもしれませんが、上記のコードを Form ウィジェット
TbNewsForm configure()
で直接使用すると、ウィジェットをあるタイプから別のタイプに簡単に変更し、個別にレンダリングまたは非表示にすることができ、機能します。
- しかし、どうすればそれをグローバルな方法で実装できるでしょうか?
- symfony Doctrine のコアコードを変更する必要がありますか?
時間を割いて読んでいただければ、どうもありがとうございます。コメントや解決策は大歓迎です:)