web-dev-qa-db-fra.com

Elément de configuration du tableau de Twig

Comment définir le membre d'un tableau existant de Twig?

J'ai essayé de le faire de la manière suivante:

{% set arr['element'] = 'value' %}

mais j'ai eu l'erreur suivante:

"Ponctuation" inattendue de la valeur "[" ("fin du bloc d'instruction" Attendu.) Dans ...

117
falinsky

Il n'y a pas de bonne façon de faire cela dans Twig. Il est toutefois possible d’utiliser le filtre de fusion:

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

J'ai rencontré ce problème, mais je tentais de créer des index entiers au lieu d'indices associatifs comme 'element'.

Vous devez protéger votre clé d'index avec () en utilisant également le filtre de fusion:

{% set arr = arr|merge({ (loop.index0): 'value'}) %} 

Vous pouvez maintenant ajouter une clé d'index personnalisée comme ('element'~loop.index0)

71
LivaX

Si l'initialisation n'a besoin que de:

{% set items = { 'Apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
15
pleerock

Utilisez simplement ceci comme {% set arr={'key':'value'} %} (sans espace après le ':'), cela fonctionne bien. Mais quand j'ai utilisé 'pour' pour faire un tableau, cela ne peut pas fonctionner hors de la zone for.

          {% for group in user.groups %}
            {% set foo={'loop.index0':'group.id'} %}
            {% set title={'loop.index0':'group.title'} %}
            {{ title }} //it work 
          {% else %}
            {% set foo={'0':'-1'} %}
            {% set title={'0':'未分组'} %}
          {% endfor %}
            {{ title }}  //it not work, say title is not defined

Merci pour vos attentions. (anglais médiocre, je suis désolé!)

2
user1321109
{% set links = {} %}

{# Use our array to wrap up our links. #}
{% for item in items %}
  {% set links = links|merge({ (loop.index0) : {'url': item.content['#url'].getUri(), 'text': item.content['#title']} }) %}
{% endfor %}

{%
set linkList = {
  'title': label,
  'links': links
}
%}

{% include '<to twig file>/link-list.twig'%}

Merci pour ce fil - j'ai également pu créer un tableau avec (loop.index0) et l'envoyer à twig.

2
n8tron

J'ai trouvé ce problème très pénible et ma solution est peut-être orthodoxe et ne correspond pas à la philosophie de Twig, mais j'ai développé ce qui suit:

$function = new Twig_Function('set_element', function ($data, $key, $value) {
    // Assign value to $data[$key]
    if (!is_array($data)) {
        return $data;
    }
    $data[$key] = $value;
    return $data;
});
$twig->addFunction($function);

qui peut être utilisé comme suit:

{% set arr = set_element (arr, 'element', 'value')%}

1
savedario

J'ai essayé la réponse de @LivaX mais cela ne fonctionne pas, la fusion d'un tableau dans lequel les clés sont numériques ne fonctionnera pas ( https://github.com/twigphp/Twig/issues/789 ). 

Cela ne fonctionnera que lorsque les clés sont des chaînes 

Ce que j'ai fait est de recréer une autre table (temp) à partir de la table initiale (t) et de transformer les clés en chaîne, par exemple: 

{% for key , value in t%}
{% set temp= temp|merge({(key~'_'):value}) %}
{% endfor %}

t clés: 0, 1, 2 .. 

temp clés: 0_, 1_, 2_ .... 

1
zizoujab

J'ai eu ce problème il y a quelque temps. Imaginez que vous ayez un tableau comme celui-ci:

data = {
    'user': 'admin',
    'password': 'admin1234',
    'role': 'admin',
    'group': 'root',
    'profile': 'admin',
    'control': 'all',
    'level': 1,
    'session': '#DFSFASADASD02',
    'pre_oa': 'PRE-OA',
    'hepa_oa': 'HEPA-OA',
    'pre_ra': 'HEPA-RA',
    'hepa_ra': 'HEPA-RA',
    'deodor_ra': 'DEODOR-RA'
}

Vous souhaitez donc afficher ces données sur deux lignes, mais enlevez le mot de passe de cette liste. À cette fin, il sera facile de fractionner en deux tableaux avec le filtre slice. Cependant, nous devons supprimer le mot de passe. Pour cette raison, j'utilise cet extrait. L'idée est de mettre tous les éléments inférieurs à la taille des éléments data divisée par 2. Pour le calculer, nous utilisons le filtre length. Maintenant, pour obtenir l’index de l’élément en cours, nous utilisons loop.index. Et enfin nous * Poussez un élément associatif dans le tableau gauche ou droit. Un tableau associatif a deux composants key et value. Pour référencer une clé de tableau dans twit, nous exploitons () et nous utilisons le filtre merge pour envoyer dans le tableau, comme indiqué ici {% set left_list = left_list|merge({ (key): value }) %}.

C'est la solution complète.

{% set left_list = {} %}
{% set right_list = {} %}
{% set limit = data|length // 2 %}
{% for key, value in data|cast_to_array %}
{% if key != 'password' %}
{% if loop.index <= limit %}
{% set left_list = left_list|merge({ (key): value }) %}
{% else %}
{% set right_list = right_list|merge({ (key): value }) %}
{% endif %}
{% endif %}
{% endfor %}
{% for key, value in left_list %}
<p>
<label for="{{key}}">{{key}}</label>
<input type="text" name="{{key}}" id="{{key}}" value="{{value}}"
       class="text ui-widget-content ui-corner-all">
</p>
{% endfor %}
0
Teocci

J'ai eu un tableau multi dimension. La seule solution que j'ai pu trouver est de créer un nouveau tableau temporaire et update/add les informations, qui ont ensuite été transmises à une autre fonction twig.

0
shobekhan