Для потребностей проекта мне нужно изменить данные полей формы до их рендеринга. Для этого я повторяю элементы формы и динамически меняю нужные значения.
Проблема в том, что я не могу изменить значение. Я получил эту ошибку:
Unexpected token "punctuation" of value "." ("end of statement block" expected).
Я использовал этот кусок кода для изменения значения, но я получил ошибку выше:
{% set arr = arr|merge({'element': 'value'}) %}
Кто-нибудь знает, где проблема?
Это код, который я использовал.
Код шаблона Twig (пример кода, который я использовал)
<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>
Объект формы:
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 }
Чтобы изменить определенный индекс массива, который лучше всего подходит для расширения 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" #}