2016-09-21 2 views
2

私はradio_widgetを修正しましたし、ペアごとにユニークでなければならない<label><input>同じIDを与えたいと思います。Symfony/Twig:フォームウィジェットの内部ID?

現在、私はrandom()を使用していますが、競合を避けるために(Twig: for)のような内部カウンタを使用したいと考えています。

{% block radio_widget -%} 
    {% set id = random() %} 
    <div class="radio"> 
     <label for="radio_{{ id }}">Label for {{ id }}</label> 
     <input type="radio" id="radio_{{ id }}" {# ...#}/> 
    </div> 
{%- endblock radio_widget %} 

もっと良い解決法を知っている人はいますか?

ありがとうございます!

+1

あなたは、フォームレンダリングに使用されるメインのラジオウィジェットについて話していますか?もしそうなら、すでに 'form.vars.id'にウィジェット依存のunqiue IDがあります。 – Yoshi

+0

@ Yoshi私が必要としていたもの。それを回答として投稿し、私はそれを受け入れます。ありがとうございました! –

答えて

1

事前に計算された一意のIDが存在する:使用の

{% block radio_widget -%} 
    {% if counter is defined %} {# set desired id #} 
    {% set id = counter %} 
    {% else %} 
    {% set id = random() %} {# default value #} 
    {% endif %} 
    <div class="radio"> 
     <label for="radio_{{ id }}">Label for {{ id }}</label> 
     <input type="radio" id="radio_{{ id }}" {# ...#}/> 
    </div> 
{%- endblock radio_widget %} 

例:あなたはこのような何かを試すことができます。

参照:小枝で\Symfony\Component\Form\Extension\Core\Type\BaseType::buildView

このIDは、{{ form.vars.id }}を介してアクセス可能です。

本質的にidは、ネストされたフォームタイプ名の連結に過ぎません。


一般的にform.varsはあなたがフォームのカスタマイズを行う必要があると思いますすべての有用なものを含まれていることに注意してください。また、FormTypeInterface::buildViewまたはFormTypeInterface::finishViewを使用してデータをフォームレンダリングに転送するときにカスタム値を配置する場所です。

1

ProjectTwigExtension.php

class ProjectTwigExtension extends Twig_Extension { 

    public function getFunctions() { 
     return array(
      new Twig_SimpleFunction('get_unique_key', array($this, 'getUniqueKey')),    
     ); 
    } 

    private $keys = array(); 
    /** 
    * Create an unique HTML identifier for a form element 
    * 
    * @param $name String to make unique 
    * 
    * @returns String 
    */ 
    public function getUniqueKey($name) { 
     if (!in_array($name, $this->keys)) { 
      $this->keys[] = $name; 
      return $name; 
     } 
     $i = 0; 
     while(in_array($name.++$i,$this->keys)) {} 
     $this->keys[] = $name.$i; 
     return $name.$i; 
    } 


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

config.phpの

$twig = new Twig_Environment($loader); 
$twig->addExtension(new ProjectTwigExtension()); 

template.twig

{% block radio_widget -%} 
    {% set id = get_unique_key('radio_') %} 
    <div class="radio"> 
     <label for="{{ id }}">Label for {{ id }}</label> 
     <input type="radio" id="{{ id }}" {# ...#}/> 
    </div> 
{%- endblock radio_widget %} 
+0

良い解決策ですが、今回は 'form.vars.id'だけ必要です。お返事をありがとうございます! –

1

であってもよいですすでにそこにすべてのフォームウィジェットについて

{% for i in 0..10 %} 
    {% set counter = loop.index %} 
    {{- block('radio_widget') }} 
{% endfor %} 
関連する問題