1

ドキュメントに記載されているカスタムフォームタイプの作成に関するドキュメントに従っています: http://symfony.com/doc/master/cookbook/form/create_custom_field_type.html#using-the-field-type

与えられた例の GenderType を持っているので、新しい FormType で作業しているエンティティを「ポン引き」したいと思います。

class Person {

    const GENDER_MALE = "m";
    const GENDER_FEMALE = "f";

    private $gender;

    ....
    /* generated getter/setter  */

    .....

    public function getGenderAsText() 
    {
          return $this->getGender() == self::GENDER_MALE?"male":"female";
    }


} 

私の質問は、おそらく誰かに良いアドバイスがあります.. .私のモデルで魅力のようなフォームを選択するGenderTypeの優雅さをどのように組み合わせるか、テンプレートなどでの使用を容易にする.. ?

アップデート

Alex は、自作の性別小枝拡張機能を使用して特定のフィールドを表示する方法を指摘しました。

特にフィールド {{ item.gender|gender }} で拡張子を呼び出すと、これは魅力のように機能します

共通フィールドに継承を使用して、たくさんのオブジェクトを持っていますが、各クラスに固有のデータがたくさんあります。すべてのプロパティを抽出し、それらをテンプレートに渡し、TwigExtension がレンダリングを処理するロジックをいくつか書きました。

public function dynamicContractFilter($value)
{
    // handle DateTime
    if ($value instanceof \DateTime) {
        return $value->format('d.m.Y');
    }
    ....
    } elseif (is_bool($value)) {
        return $value ? 'yes' : 'no';
    } else {
        return $value;  // plain string
    }

}

それが単純な文字列/整数なのか「GenderTypedField」なのか判断できません..

型がないので、これはPHP自体のある種の制限だと思います..サイト

4

1 に答える 1

1

最良のアプローチは、性別小枝拡張を作成することです。

そうすれば、エンティティだけでなく、どこでもm同じようMaleに表示できます。また、データと表示コードを明確に分離します。fFemalePerson

そのようです:

namespace Acme\DemoBundle\Twig;

class GenderExtension extends \Twig_Extension
{
    const
        MALE   = 'Male',
        FEMALE = 'Female';

    public function getFilters()
    {
        return array(
            'gender' => new \Twig_Filter_Method($this, 'gender'),
        );
    }

    public function gender($token)
    {
        if ('m' === $token)
            return self::MALE;

        if ('f' === $token)
            return self::FEMALE;

        throw new \InvalidArgumentException('Invalid argument, expecting either "m" or "f".');
    }

    public function getName()
    {
        return 'acme_gender_extension';
    }
}

次に、テンプレートに次のように記述します。

{{ person.gender | gender }}
于 2012-10-21T20:16:30.950 に答える