28

現在、Silex マイクロフレームワークを介して Symfony2 フォーム コンポーネントを使用しようとしています。

私のログインフォームは次のように生成されます。

$app = $this->app;

$constraint = new Assert\Collection(array(
    'username' => new Assert\NotBlank(),
    'password' => new Assert\NotBlank(),
));

$builder = $app['form.factory']->createBuilder('form', $data, array('validation_constraint' => $constraint));

$form = $builder
    ->add('username', 'text', array('label' => 'Username'))
    ->add('password', 'password', array('label' => 'Password'))
    ->getForm()
;

return $form;

問題は、結果のフォームが次のように作成されていることです。

<fieldset>
    <input type="hidden" value="******" name="form[_token]" id="form__token">
    <section class="">
        <label class=" required" for="form_username">Username</label>
        <div><input type="text" value="" name="form[username]" id="form_username" class="text"></div>
    </section>
    <section class="">
        <label class=" required" for="form_password">Password</label>
        <div><input type="password" value="" name="form[password]" id="form_password" class="password"></div>
    </section>
    <section>
        <div><button class="fr submit">Login</button></div>
    </section>
</fieldset>

name 属性と id 属性を次のようにします。

<div><input type="text" value="" name="username" id="username" class="text"></div>
...
<div><input type="password" value="" name="password" id="password" class="password"></div>

私はウェブを精査し、「property_path」オプションに関するアドバイスを発見しましたが、これは実際の Symfony2 フレームワーク自体で使用されたときにデータを処理するために使用されるクラスに関係していると思います。

私はフォームコンポーネントファイルを調べてきましたが、これが設定されているポイントは次のとおりです。

Symfony/Component/Form/Extension/Core/Type/FieldType.php - 71行目

public function buildView(FormView $view, FormInterface $form)
{
    $name = $form->getName();

    if ($view->hasParent()) {
        $parentId = $view->getParent()->get('id');
        $parentFullName = $view->getParent()->get('full_name');
        $id = sprintf('%s_%s', $parentId, $name);
        $fullName = sprintf('%s[%s]', $parentFullName, $name);
    } else {
        $id = $name;
        $fullName = $name;
    }
    ...

残念ながら、FormFactory は FormBuilder を利用して Form クラスと連携するため、コンポーネントの内部動作全体を分析するのに十分な時間がありませんでした。

フィールドが FormBuilder 内の「子」配列に追加され、対応するオプションのリストがあることは知っています。getForm 関数が呼び出されると、新しい Form がインスタンス化され、add() メソッドを使用して各子 FieldType が Form に入力されます。この Form->add() メソッドは、フォームを各子の親として自動的に設定します。

public function add(FormInterface $child)
{
    $this->children[$child->getName()] = $child;

    $child->setParent($this);

    if ($this->dataMapper) {
        $this->dataMapper->mapDataToForm($this->getClientData(), $child);
    }

    return $this;
}

これを削除するためだけにこれらのクラスをオーバーライドし始めることなく、他の誰かがフィールド名を表示するための最良の方法を知っていますか?

form_div_layout.html.twig widget_attributes ブロックで 'full_name' の代わりに 'name' をプルすることは可能ですが、これが理想的であったか (id は変更されていないため)、それとも別のメソッドまたは注入可能なものがあったかどうかについては確信が持てませんでした。トリックを行うオプション。

4

3 に答える 3

28

Symfony3 では、子クラスで AbstractType::getBlockPrefix をオーバーライドして null を返します。

于 2016-03-29T14:26:03.200 に答える
25

createBuilder 関数の代わりに以下を使用します。

$builder = $app['form.factory']->createNamedBuilder(null, 'form', $data, array('validation_constraint' => $constraint));

最初のパラメータはフォーム名です。

https://stackoverflow.com/a/13474522/520114の Bernhard Schussek 自身による例

于 2011-12-07T16:19:30.500 に答える
9

子フォームを使用していない場合はgetName、フォームのメソッドを空の文字列として設定できます。

class FormType extend AbstractType {
    // ...

    public function getName() {
        return '';
    }
}
于 2013-01-18T09:03:52.443 に答える