2017-05-15 13 views
2

プロジェクトのニーズに応じて、いくつかのフォームフィールドデータをレンダリングする前に変更する必要があります。これを行うには、フォーム要素を繰り返し処理し、必要な値を動的に変更します。多次元配列の単一オブジェクトの値を小枝テンプレートで設定する

問題は、値を変更できないということです。私はこのエラーを得た:

Unexpected token "punctuation" of value "." ("end of statement block" expected). 

私は値を変更するには、コードのこの部分を使用しますが、私は上記のエラーました:

{% set arr = arr|merge({'element': 'value'}) %} 

は問題がどこにあるか誰かが知っていますか?

これは私が使用したコードです。

小枝のテンプレートコード(私が使用したコード例)

<ul> 
     {% dump (edit_form) %} 
     {% for element in edit_form.children %} 
      {% dump (element.vars) %} 
      {% set element.vars = element.vars|merge({'name': 'My title (just for testing purpose)'}) %} 

      <li>{{ element.vars.name }}</li> 
     {% endfor %} 
    </ul> 

Formオブジェクト:

FormView {#637 ▼ 
    +vars: array:24 [▶] 
    +parent: null 
    +children: array:4 [▼ 
    "title" => FormView {#699 ▼ 
     +vars: array:24 [▼ 
     "value" => "le title" 
     "attr" => [] 
     "form" => FormView {#699} 
     "id" => "adminbundle_intro_title" 
     "name" => "title" 
     "full_name" => "adminbundle_intro[title]" 
     "disabled" => false 
     "label" => null 
     "label_format" => "admin.intro.form.%name%" 
     "multipart" => false 
     "block_prefixes" => array:3 [▶] 
     "unique_block_prefix" => "_adminbundle_intro_title" 
     "translation_domain" => null 
     "cache_key" => "_adminbundle_intro_title_text" 
     "errors" => FormErrorIterator {#696 ▶} 
     "valid" => true 
     "data" => "le title" 
     "required" => true 
     "size" => null 
     "label_attr" => [] 
     "compound" => false 
     "method" => "POST" 
     "action" => "" 
     "submitted" => false 
     ] 
     +parent: FormView {#637} 
     +children: [] 
     -rendered: false 
    } 
    "content" => FormView {#698 ▶} 
    "isEnabled" => FormView {#702 ▶} 
    "_token" => FormView {#711 ▶} 
    ] 
    -rendered: false 
} 
+0

を小枝する拡張機能を追加あなたは小枝の内部配列のオブジェクト/インデックスのプロパティを割り当てることはできません。オブジェクト/配列全体をすべてのプロパティ/インデックスとマージする必要があります – DarkBee

+0

@DarkBee再生していただきありがとうございます。私は配列全体を変更する必要があることを認識しています。問題は、この配列の1つまたは2つの要素だけを変更する必要があることです。それらのすべてではありません。そして、私はそれを達成する方法がわかりません。 – user2496520

答えて

2

Twigを拡張して、あなたが最高だ配列の特定のインデックスを変更するには、解決策は可能性これは、

ProjectTwigExtension.php

namespace Your\Namespace; 

class ProjectTwigExtension extends Twig_Extension { 

    public function getFunctions() { 
     return array(
      new Twig_SimpleFunction('set_array_value', array($this, 'setArrayValue'), ['needs_context' => true,]), 
      new Twig_SimpleFunction('set_object_property', array($this, 'setArrayValue'), ['needs_context' => true,]),  
     );  
    } 

    public function setArrayValue(&$context, $array_name, $index, $value) { 
     if (!isset($context[$array_name])) return; 
     if (is_array($context[$array_name])) $context[$array_name][$index] = $value;     
     elseif(is_object($context[$array_name])) { 
      if (method_exists($context[$array_name], $index)) $context[$array_name]->{$index}($value); 
      elseif(method_exists($context[$array_name], 'set'.$index)) $context[$array_name]->{'set'.$index}($value); 
     } 
    } 

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

$twig->addExtension(new \Your\Namespace\ProjectTwigExtension()); 
/** ... code ... **/ 
$user = new User(); 
$user->setUserName('admin'); 

$twig->render('template.twig', [ 'somearray' => ['foo' => 'bar',], 'user' => $user, ]); 

template.twig

{{ dump(somearray) }} {# output: array(1) { ["foo"]=> string(3) "bar" } #} 

{{ set_array_value('somearray', 'foo', 'foobar') }} 

{{ dump(array) }} {# output: array(1) { ["foo"]=> string(6) "foobar" } #} 

{{ dump(user.getUserName()) }} {# output: string(5) "admin" #} 

{{ set_object_property('user', 'UserName', 'StackOverflow') }} 

{{ dump(user.getUserName()) }} {# output: string(13) "StackOverflow" #} 
+0

あなたの答えに感謝します。私はあなたのコードを試して、私は値を変更していません – user2496520

+0

あなたはどのPHPバージョンを使用していますか? – DarkBee

+0

PHP 7を使用しています – user2496520

関連する問題