Bonjour,

J'ai un tableau (droits) qui se présente comme ceci:

0 -> droit = 'ecriture'
nom = 'Les droits pour écrire'
1 -> droit = 'lecture'
nom = 'Les droits pour lire'

Je cherche avec Twig comment savoir si dans mon tableau j'ai bien la valeur "ecriture" quelque part (valeur qui n'est pas pour tous les utilisateurs).
J'essaie avec {% if "ecriture" in droit %} mais ça ne fonctionne pas, j'ai dans l'idée que ça marche uniquement pour les tableaux à 1 dimension.

Bref, si vous avez une idée je suis preneur...

Merci!

5 réponses


thugg
Réponse acceptée

Si tu es amené à le faire souvent , que penses tu de te créer une fonction pour Twig en passant par une TwigExtension?

Piste : Quelquechose comme ça ...

La Fonction twig où needle = la valeur que tu recherches dans ton tableau multidimensionnel , et haystack = ton tableau multidimensionnel qui pour toi contient les droits

class ArrayExtension extends \Twig_Extension
{

    /**
     * @return \Twig_SimpleFunction[]
     */
    public function getFunctions()
    {

        return [
            new \Twig_SimpleFunction('inArrayMulti', [$this, 'inArrayMulti'])
        ];
    }
      /**
      * A special function for search in a multidimensional array a needle
      * https://www.php.net/manual/fr/function.in-array.php#118744
      * @param mixed needle The searched variable
      * @param array haystack The array where search
      * @param bool strict It is or it isn't a strict search?
      *
      * @return bool
      **/
    public function inArrayMulti($needle, $haystack, $strict = false){

      foreach($haystack as $item){
          if(is_array($item)){
            if($this->inArrayMulti($needle, $item, $strict)){
              return true;
            }
          }else{
            if(($strict ? $needle === $item : $needle == $item)){
              return true;
            }
          }
        }
        return false;
        }

}

Dans tes vues twig il suffirait en suite de faire à chaque fois que l'on souhaite rechercher si une valeur est dans un tableau

{% if inArrayMulti(needle, haystack)%} 
//le code blablabla...
{% endif %}

ps : j'ai mis ça dans une classe car ça correspond à l'organisation de mon code de test :) Pour utiliser la fonction , il faut l'adapter à son code /implémentation de twig => doc twig

Bonjour,

si j'en crois ce que tu as écris, la solution serait plutôt de faire :

{% if droit == "ecriture" %}

En espérant que ça te débloquera

ces vieux mais bon ..

{% if value in array %}

{% if key in array|keys %}

jouvrard
Auteur

Bonjour,

Ca ne fonctionne malheureusement pas.
J'ai trouvé une solution en faisant ceci:

{% set flag = '' %}
{% for userRight in userRights if userRight.droit == 'param.versions.manage' and flag != 1 %}
    blabla
    {% set flag = 1 %}
 {% endfor %}

"userRights" est un tableau qui contient tous les droits de l'utilisateurs.
Il doit y avoir certainement carrément mieux qu'une boucle je pense... :)

jouvrard
Auteur

Et comme je serai amené à la faire plusieurs fois c'est une excellente idée. :)
Je me suis déjà fait deux petites extensions pour Twig, je vais donc ajouter celle-ci.

Merci beaucoup!