1

編集。要約: DoctrineForms を拡張して特定のフィールドを含めないようにする SomeForm が欲しいだけです。それらは編集できません。コードのどこかに設定したい固定値。うまくいけば、これで十分な情報が得られ、この投稿の残りの部分を読む必要はありません...

やあ。これが私の状況です:

  • 教義によって生成された SomeModel があります
  • フロントエンド アプリとバックエンド アプリの両方に、このモデルの CRUD 画面があります。
  • これら 2 つの CRUD 画面の唯一の違い (見た目の違いは別として) は、フロントエンドにあります。1 つの特定のフィールドは FIXED です。つまり、管理者は必要に応じてその値を変更できますが、通常のユーザーは変更できません。値は、コードで定義した定数になります。このフィールドは、フロントエンドの追加/編集画面には表示されません。

私が知りたいのは、これを行う「正しい」方法は何ですか? ハッキングする方法はいくつか考えられますが、何をしても厄介な回避策のように感じます。

Form クラス (BaseFormDoctrine) または他の適切な場所を拡張する適切な方法はありますか?

編集: 以下のコメントで指摘されているように、私は実際に "CRUD" とは異なる doctrine:generate-module を使用しています。

また、私はまだこれを理想的に解決していませんが、解決策がどこにあるのかはわかっていると思います。symfony フォームをさらに深く掘り下げる必要があります: http://www.symfony-project.org/forms/1_4/en/02 -フォーム検証

4

1 に答える 1

3

/lib/form フォルダーに別のフォームを作成して、通常のフォームを拡張し、適切なフィールドを上書きします。以下は、フォームからフィールドを削除して、まったく表示されないようにします。

<?php

class FrontendSomeModelForm extends SomeModelForm {

  public function configure()
  {
    unset($this["some_field"]);
  }

}

または、値をレンダリングしたいが、編集できないようにしたい場合は、次のようにすることができます。

<?php

class FrontendSomeModelForm extends SomeModelForm {

  public function configure()
  {
    $this->setWidget("some_field", new sfWidgetFormPlain());
  }

}

そしてsfWidgetFormPlain、値を出力するだけのウィジェットを作成し、symfony が見つけられる場所 (lib/form/widget など) に貼り付けます。

<?php

class sfWidgetFormPlain extends sfWidgetForm
{
  /**
   * Constructor.
   *
   * @param array $options     An array of options
   * @param array $attributes  An array of default HTML attributes
   *
   * @see sfWidgetForm
   */
  protected function configure($options = array(), $attributes = array())
  {
      $this->addOption('value');
  }

  /**
   * @param  string $name        The element name
   * @param  string $value       The value displayed in this widget
   * @param  array  $attributes  An array of HTML attributes to be merged with the default HTML attributes
   * @param  array  $errors      An array of errors for the field
   *
   * @return string An HTML tag string
   *
   * @see sfWidgetForm
   */
  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    //optional - for easy css styling
    $attributes['class'] = 'plain';

    return $this->renderContentTag('div', $value, $attributes);
  }
}

次に、編集したくないフォームに対して、通常のフォームではなくこのフォームを使用します。これを行う方法については、モジュールで表示しているか、admin ジェネレーターで表示しているかに応じて、symfony のドキュメントを確認してください。

于 2011-04-05T11:44:01.060 に答える