web-dev-qa-db-fra.com

Comment concaténer toutes les valeurs de jeton d'une liste dans un seul champ dans une boucle de règles?

Je tente d'envoyer une liste de fichiers téléchargés sur un nœud nouvellement créé par courrier électronique.

Dans un type de contenu, j'ai un champ de fichier qui permet des valeurs illimitées.

Dans - Règles , j'ai créé une boucle appelant l'élément actuel "actuel_file".

enter image description here

J'essaie de concaténer toutes les valeurs dans un champ à longtext appelé "File_List".

J'ai l'intention d'utiliser le jeton pour la valeur de "File_List" dans le corps d'un courrier électronique.

Malheureusement, je suis incapable de le faire.

En mode de sélection de données, je peux accéder aux jetons créés par la boucle:

enter image description here

Cependant, en mode d'entrée direct, les jetons ne sont pas disponibles pour moi. Ils ne sont pas répertoriés dans la section "Modèles de remplacement".

Lorsque j'essaie de remplir la valeur avec ce qui suit, je n'ai aucun succès:

[node:field-file-list]
[current-file:file:url]

Que peut-on faire pour rendre les jetons disponibles pour moi en mode d'entrée direct?

Si je le fais mal, y a-t-il un moyen différent pour moi de concaténer toutes les URL de chaque fichier afin de pouvoir le mettre dans le corps d'une action électronique?

1
AndrewMRiv

Cette réponse suppose que vous avez des connaissances de base en utilisant le module règles et comprendre comment utiliser une boucle pour renvoyer toutes les valeurs d'un champ avec des entrées autorisées illimitées.

(En outre, cela ne couvrira que réagir sur un nœud nouvellement créé.)


La principale question était donc que les variables en boucle dans les règles n'étaient pas disponibles pour moi tout en mode "Entrée directe", mais étaient disponibles en mode "Sélection des données".

J'avais besoin de concaténer tous les noms de fichiers et des URL de fichier pour un champ de fichier de valeur illimitée et de les envoyer dans une liste HTML non commandée dans un champ de texte long (HTML filtré).

Il peut y avoir une meilleure façon de le faire, mais c'était actuellement le seul moyen de faire ce travail.


1.) Créer des champs supplémentaires

Étant donné que les jetons variables de boucle ne sont pas disponibles en mode d'entrée direct, mais les jetons de champs réguliers sont, nous allons mettre les informations variables en boucle dans les nouveaux champs, puis les concaténer.

Vous créerez des champs pour les éléments suivants:

  • Téléchargement des fichiers (champ de fichier défini pour accepter des valeurs illimitées)
  • Champ de nom de fichier (champ de texte long. Il est important que cela soit défini sur le texte brut. J'ai subi des problèmes quand ce n'était pas un texte brut)
  • Chemin de fichier/champ d'URL (texte long, texte simple pour la même raison)
  • Champ de liste de fichiers en texte brut (champ de texte long en texte brut. C'est le champ qui prendra toutes les valeurs concaténées. Cela aura un sens plus tard. Cela doit également être un texte clair ou des règles ne concaténera pas les valeurs pour une raison quelconque ).
  • Champ de liste de fichiers dans HTML filtré (champ de texte long avec HTML filtré. Ceci est le champ qui sera affiché aux utilisateurs.)

enter image description here

Dans les champs ci-dessus, seuls les tout premiers et très derniers champs seront visibles pour les utilisateurs. Le reste doit être masqué avec le module d'autorisations de terrain.

Les champs supplémentaires vont simplement être utilisés par le module de règles.


2.) Créer une boucle

Étant donné que ce champ de fichier a des entrées illimitées, vous créerez une boucle et sélectionnez le champ Fichier.

J'ai nommé le fichier actuel dans la boucle "Current_File".

enter image description here


3.) saisissez le nom du fichier

Dans la boucle nouvellement créée, nous créerons une action pour "définir une valeur de données". Il saisira le champ Nom de fichier nouvellement créé et saisira la valeur du nom du fichier du fichier actuel.

Assurez-vous que vous n'êtes pas en mode d'entrée direct ou que les jetons ne seront pas disponibles pour vous.

enter image description here

4.) Saisissez l'URL du fichier

Cette étape est similaire à celle du dernier.

Ajoutez une autre action à "Définir la valeur de données" pour le champ URL de fichier/chemin de fichier nouvellement créé. Définissez-le pour saisir des données de l'URL du fichier du fichier actuel.

Encore une fois, assurez-vous que vous n'êtes pas en mode d'entrée direct ou que les jetons ne seront pas disponibles pour vous.

enter image description here

5.) concaténer les valeurs

Enfin, dans le champ Liste des fichiers texte brut, nous allons concaténer les valeurs.

Nous entrons d'abord dans le jeton qui représente le champ actuel et en dessous, nous ajouterons sur le nom du fichier et le chemin actuel.

Cette fois, assurez-vous d'être en mode d'entrée direct pour que vous puissiez taper ce que vous voulez:

enter image description here

6.) Ajouter des balises UL

Assurez-vous que cela est en dehors de la boucle.

Ajoutez une action pour définir une valeur de données qui ajoute des balises UL autour de la valeur.

enter image description here

7.) Placez les valeurs concaténées dans le champ HTML filtré

Nous allons ajouter une autre action pour définir une valeur de données. Il mettra la valeur de la liste de fichiers texte brut dans le champ Liste des fichiers HTML filtré.

La raison pour laquelle deux champs de liste de fichiers différents ont été créés sont car la concaténation dans un champ HTML filtré ne fonctionne pas pour une raison quelconque.

enter image description here

8.) Voir les résultats

Si toutes les étapes sont suivies, vous devriez recevoir une liste HTML non commandée de chaque fichier téléchargé qui est lié à son URL de fichier:

enter image description here

J'ai l'impression que cela "devrait" être capable d'être accompli de loin moins de pas, mais c'était la seule façon de résoudre le problème.

0
AndrewMRiv

Si ce que vous cherchez n'est pas disponible, il suffit de le rendre disponible, qui est "ne autre façon de concaténer toutes les URL de chaque fichier" (comme dans votre question). Lire la suite pour plus de détails ...

Regardez cet exemple d'une règle (dans le format d'exportation de règles), ce qui est une variante de ce que vous demandez:

{ "rules_show_list_of_fields" : {
    "LABEL" : "Show list of fields",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_insert" : [], "node_update" : [] },
    "IF" : [
      { "node_is_of_type" : { "node" : [ "node" ], "type" : { "value" : { "article" : "article" } } } }
    ],
    "DO" : [
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "StartOfList-" },
          "PROVIDE" : { "variable_added" : { "email_list" : "List of eMail IDs" } }
        }
      },
      { "LOOP" : {
          "USING" : { "list" : [ "node:field-email-addresses" ] },
          "ITEM" : { "current_email" : "Current eMail" },
          "DO" : [
            { "data_set" : {
                "data" : [ "email-list" ],
                "value" : "[email-list:value][current-email:value]-"
              }
            }
          ]
        }
      },
      { "data_set" : { "data" : [ "email-list" ], "value" : "[email-list:value]EndOfList" } },
      { "drupal_message" : { "message" : "The value of the email_list variable is: [email-list:value]." } }
    ]
  }
}

Voici un résumé de ce que cette règle fait:

  • Ajouter une nouvelle variable email_list.
  • Init le email_list valeur avec un préfixe.
  • Pour chaque élément de la boucle, appendez la valeur de cet élément, suivie d'un caractère de séparateur.
  • Ajouter un suffixe au email_list valeur.

Dans mon cas, j'utilise un champ de texte multi-valeurs avec le nom de la machine field_email_addresses, qui contient des identifiants de messagerie, et je veux simplement envoyer un message d'état avec une concaténation de ces identifiants de messagerie, séparés par un "- ", et avec un préfixe (= StartOfList)/suffixe (= EndOfList). et j'utilise également les règles" Mettre à jour le nœud existant ".

Remplacez le nom de la machine de mon champ de liste dans votre champ de liste et remplacez tous les "e-mail" par "Fichier" et vous devriez pouvoir importer cette règle dans votre propre site (si vous avez activé les règles activées).

Pas sûr si vous voulez le préfixe ou le suffixe, et/ou le caractère du séparateur (= "- "). Adapter ou supprimer l'un de ces besoins pour répondre à vos besoins.

voilà ...

Démo

Voici comment fonctionne le message d'état après avoir créé un nouveau nœud ou mettre à jour un nœud existant (de type article):

La valeur de la variable e-mail_list est la suivante: startoflist-user2 @ exemple.com-user4 @ example.com-endoflist.

1
Pierre.Vriens