2017-01-26 8 views
0

私は選択メニューを再利用したいが、それは毎回そのIDとその名前をTwigで変更する。どのようにそれを行うことができますか?枝に異なるidsと名前のメニューを再利用

私は選択メニューについてのラッパーブロックを考えて、それを再利用するたびに延長しました。しかし、{{ parent() }}を使用してIDと名前の値を設定するにはどうすればよいですか?

+0

[macros](http://twig.sensiolabs.org/doc/2.x/tags/macro.html)おそらく? – Yoshi

答えて

1

カスタムTwig_Extensionクラスのキーを保存して作成することでこれを行いますが、ここでは小さな設定です。グローバルそれを維持することで、私はすべてのビュー/マクロ/ includeにユニークなIDを確保することができます...

example.twig

{% for i in 1..5 %} 
<ul id="{{ get_unique_key('my_menu') }}"> 
    <li>Foo</li> 
</ul> 
{% endfor %} 

ProjectTwigExtension

class ProjectTwigExtension extends Twig_Extension { 
    private $keys = array(); 

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

    /** 
    * Create an unique HTML identifier 
    * 
    * @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'; 
    }   
} 

登録拡張子

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

これは逆の方法ですので、+1します。私は小枝を持っていたいと思います。私がそれを呼び出すたびに、私はIDと名前の固定文字列を渡します。それで、スニペットの内側のブロックを定義したと想像してください。テンプレート内でブロックを呼び出すと、そのブロックが埋められます。 – alpham8

+0

imhoこれは純粋な小枝ではできません。私は2つの例を試しましたが、失敗しました。 [twigfiddle](https://twigfiddle.com/sh8pi2) – DarkBee

関連する問題