web-dev-qa-db-fra.com

Comment créer un nœud à partir d'un formulaire Web à l'aide de règles?

Je veux créer un nœud basé sur des données de formulaire Web en utilisant le module Rules . Cela est dû à une complication entourant les relations au sein du système CRM associé.

Je suis déjà au point où j'ai créé le formulaire Web et je suis arrivé au point suivant (et fonctionnel) dans Rules:

{ "rules_member_news_import_" : {
"LABEL" : "Member News (cloned)",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "webform_rules", "rules" ],
"ON" : { "webform_rules_submit" : [] },
"IF" : [
  { "webform_has_id" : {
      "form_id" : [ "form_id" ],
      "selected_webform" : { "value" : { "webform-client-form-730" : "webform-client-form-730" } }
    }
  }
],
"DO" : [
  { "entity_create" : {
      "USING" : {
        "type" : "node",
        "param_type" : "newsfrommembers",
        "param_title" : "[data:title_member_news-value-raw]",
        "param_author" : [ "user" ]
      },
      "PROVIDE" : { "entity_created" : { "entity_created" : "Created entity" } }
    }
  }
]

Ce que je dois faire, c'est utiliser le reste des champs du formulaire Web pour transposer les informations, par exemple le corps du texte et une image.

Ce que j'essaie d'apprendre, c'est comment incorporer également le corps et d'autres informations. J'ai utilisé l'exportation pour ajouter ce que je pensais fonctionner, par exemple:

"param_body" : "[data:body]"

dans l'action entity_create, cependant lorsque j'ai importé le texte modifié, il a simplement disparu, donc je suppose que je dois ajouter une action distincte pour ajouter des variables d'entité.

J'ai recommencé à utiliser les menus et je n'ai pas encore réussi à le faire fonctionner. Je dois faire quelque chose de fondamentalement mauvais.

1ère tentative

Avant d'utiliser une action de règles comme "Définir une valeur de données" pour votre champ a, vous devez vous assurer d'ajouter une condition de règles Entity has field (lié au champ pour lequel vous souhaitez définir une valeur). Et assurez-vous d'ajouter que Entity has field condition AVANT d'autres règles Conditions dans lesquelles vous souhaiterez peut-être faire référence à ce champ.

C'est également ce qui est mentionné dans l'interface utilisateur des règles, par exemple lorsque vous ajoutez une condition de "comparaison de données": quelque part, il indique " Le sélecteur de données vous aide à explorer les données disponibles pour Rules. Pour faire apparaître les champs d'entité dans le sélecteur de données, vous devrez peut-être utiliser le condition 'l'entité a un champ' (ou 'le contenu est de type') ".

Ce qui précède s'applique à n'importe lequel de vos "... autres champs du formulaire Web" (comme dans votre question).

Pour un didacticiel vidéo qui illustre l'importance de cette Entity has field condition, reportez-vous à Types de données et sélection des données , en particulier ce qui y est affiché entre 13h30 et 17h30 environ.

2e tentative

La tentative précédente ressemble plus ou moins à un Getting-started-with-Rules qui résout diverses situations où certaines variables semblent ne pas être disponibles dans les actions de règles, etc. Cependant, pour cette question spécifique, qui consiste à utiliser Rules en combinaison avec Webform , les choses sont un peu plus compliquées, comme expliqué ci-dessous.

Supposons que j'ai un formulaire Web créé avec certains de ses champs avec des noms de machines comme ceci:

  • contact_us_first_name.
  • contact_us_last_name.
  • contact_us_subject.

Après avoir ajouté ces champs (avec des noms de machines identiques) à l'un de vos propres formulaires, vous devriez pouvoir importer la règle prototype - ci-dessous (à l'aide de l'interface utilisateur de règles) dans votre propre environnement (sans rencontrant une contrainte d'intégrité):

{ "rules_create_a_node_from_a_submitted_webform" : {
    "LABEL" : "Create a node from a submitted webform",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "webform_rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "user_has_role" : { "account" : [ "user" ], "roles" : { "value" : { "2" : "2" } } } }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "The webform component submitted by [data:contact_us_first_name-value] (= [data:contact_us_first_name-title]) [data:contact_us_last_name-value] (= [data:contact_us_last_name-title]) contains a field labeled \u0022[data:contact_us_subject-title]\u0022 which has value \u0022[data:contact_us_subject-value]\u0022." } }
    ]
  }
}

Dans la règle ci-dessus, j'ai inclus une condition de règles supplémentaire pour empêcher l'exécution de l'action de règles pour les utilisateurs anonymes (n'hésitez pas à en adapter l'ID de rôle, ou simplement à supprimer cette condition de règles. Et la règle est déclenchée via l'événement de règles "Après le formulaire Web a été soumis ".

L'action Rules affiche uniquement un message (informatif) sur le site (ma façon recommandée d'écrire et de déboguer les règles ...) après l'envoi d'un formulaire Web. Voici ce que j'ai spécifié (dans l'interface utilisateur des règles) comme message à afficher:

Le composant de formulaire Web soumis par [data: contact_us_first_name-value] (data: contact_us_first_name-title]) [data: contact_us_last_name-value] (= [data: contact_us_last_name-title]) contient un champ intitulé "[data: contact_us_subject-title") ] "qui a la valeur" [data: contact_us_subject-value] ".

Voici un exemple du message affiché dans ma propre configuration:

== [- Le composant de formulaire Web soumis par Dries (= Prénom :) Buytaert (= Nom :) contient un champ intitulé "Objet:" qui a une valeur "La rumeur court que le module de règles peut même remplacer le module node_convert! ".

Ce que la règle de prototype ci-dessus montre, c'est que "l'indice" pour répondre à votre question est que vous avez accès à toutes les étiquettes et à toutes les valeurs de n'importe quel champ d'un formulaire Web disponible, c'est-à-dire:

  • [data:MachineFieldName-title] contient le Label d'un champ avec le nom de la machine MachineFieldName.
  • [data:MachineFieldName-value] contient la valeur d'un champ avec le nom de la machine MachineFieldName

3e tentative

Ce qui précède est un bon début, mais n'est pas encore suffisant pour atteindre votre objectif (= "... utilisez le reste des champs du formulaire Web pour transposer les informations, par exemple le corps du texte ...", comme dans votre question ). Cependant, vous pouvez utiliser une technique similaire à celle décrite dans ma réponse à " Comment faire une comparaison de données avec des données de formulaire Web soumises lors de l'utilisation du module Rules? ". Pour faire court:

  • Ajoutez une action de règles supplémentaire à Add a variable (pour chacun des composants Webform pour transposer les informations, avec une valeur qui lui est attribuée égale à votre [data:ComponentName-value-raw] (et avec un type de données égal au type de données de votre composant Webform).
  • Dans vos actions de règles suivantes, vous pouvez vous référer à la valeur de ces variables que vous venez d'ajouter (c'est l'indice!).

Démo

Composants Webform

Supposons un formulaire Web avec form_id=191 et avec ces composants Webform:

  • Étiquette = titre, nom de la machine = demoform_title, Type de données = Champ de texte.
  • Étiquette = texte, nom de la machine = demoform_text, Type de données = Zone de texte.
  • Étiquette = numéro, nom de la machine = demoform_number, Type de données = Nombre.
  • Label = Option, Nom de la machine = demoform_option, Type de données = Sélectionnez les options (valeur unique).

Type de contenu de l'article

Supposons un type de contenu d'article avec ces champs:

  • Label = Title, Machine name = title, Field type = Node element module.
  • Label = Body, Machine name = body, Type de champ = Texte long et résumé.
  • Label = Free Format Nr, nom de la machine = field_free_format_nr, Type de champ = Entier.
  • Label = OptionList, nom de la machine = field_optionlist, Type de champ = Liste (texte).

Règle personnalisée

Voici une règle personnalisée (au format d'exportation des règles), qui est une version étendue (améliorée) de la règle incluse dans la question. Cette règle créera un nouveau nœud (de type Article), et qui utilisera les données incluses dans les composants Webform mentionnés ci-dessus:

{ "rules_create_a_node_from_webform_data" : {
    "LABEL" : "Create a node from webform data",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "webform_rules", "rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "webform_has_id" : {
          "form_id" : [ "form_id" ],
          "selected_webform" : { "value" : { "webform-client-form-191" : "webform-client-form-191" } }
        }
      }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "The webform submitted contains these fields:\r\n\u003C\/ul\u003E\r\n\u003Cli\u003Ethe field labeled \u0022[data:demoform_title-title]\u0022 which has value \u0022[data:demoform_title-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_text-title]\u0022 which has value \u0022[data:demoform_text-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_number-title]\u0022 which has value \u0022[data:demoform_number-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_option-title]\u0022 which has value \u0022[data:demoform_option-value-raw]\u0022.\u003C\/li\u003E\r\n\u003C\/ul\u003E" } },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_text-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_text" : "Form variable text" } }
        }
      },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_number-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_number_text" : "Form variable number text" } }
        }
      },
      { "data_convert" : {
          "USING" : { "type" : "integer", "value" : [ "var-demoform-number-text" ] },
          "PROVIDE" : { "conversion_result" : { "var_demoformvar_number" : "Form variable number" } }
        }
      },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_option-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_option" : " Form variable option" } }
        }
      },
      { "entity_create" : {
          "USING" : {
            "type" : "node",
            "param_type" : "article",
            "param_title" : "[data:demoform_title-value-raw]",
            "param_author" : [ "user" ]
          },
          "PROVIDE" : { "entity_created" : { "article_created" : "Created article" } }
        }
      },
      { "data_set" : {
          "data" : [ "article-created:body:value" ],
          "value" : [ "var-demoform-text" ]
        }
      },
      { "data_set" : {
          "data" : [ "article-created:field-free-format-nr" ],
          "value" : [ "var-demoformvar-number" ]
        }
      },
      { "data_set" : {
          "data" : [ "article-created:field-optionlist" ],
          "value" : [ "var-demoform-option" ]
        }
      },
      { "data_set" : { "data" : [ "article-created:comment" ], "value" : "0" } },
      { "entity_save" : { "data" : [ "article-created" ], "immediate" : "1" } },
      { "drupal_message" : { "message" : "A new article got created, with nid=[article-created:nid] and url=[article-created:url]" } }
    ]
  }
}

Quelques détails supplémentaires sur les actions de règles qui ont été ajoutées:

  • Show a message on the site: Ceci est juste à des fins de débogage/démo (supprimez-le, vous n'en voulez plus/n'en avez plus besoin) Voici un exemple de message qui s'affiche après l'envoi d'un formulaire Web:

    Le formulaire Web soumis contient les champs suivants:

    • le champ intitulé "Titre" qui a pour valeur "Un titre intéressant de mon formulaire web".
    • le champ intitulé "Texte" qui a la valeur "Juste du texte, avec du texte supplémentaire et encore une autre ligne et une autre".
    • le champ intitulé "Numéro" qui a la valeur "842316".
    • le champ intitulé "Option" qui a la valeur "A".
  • Add a variable (deux fois): pour faire la valeur des composants Webform demoform_number et demoform_option disponible dans les actions de règles suivantes. Notez que pour demoform_number une action de règles supplémentaire Convert data type est nécessaire pour le faire fonctionner.

  • Set a data value (3 fois): pour remplir le corps du nœud et les 2 champs de nœud, en utilisant les variables créées dans une action de règles précédente.

  • Set a data value: pour définir "Commentaires fermés" pour le nœud en cours de création (il s'agit d'une action de règles facultative, juste une illustration d'autres choses que vous pouvez faire avec ce nœud en cours de création).

  • Save entity: pour enregistrer réellement le nœud.

  • Show a message on the site: Ceci est juste à des fins de débogage/démo (supprimez-le, vous n'en voulez plus/n'en avez plus besoin) Voici un exemple de message qui s'affiche après l'envoi d'un formulaire Web:

    Un nouvel article a été créé, avec nid = 123 et url = http://www.example.com/node/12

Résultat final

Après avoir soumis le formulaire Web avec des données comme dans l'exemple ci-dessus, un nouvel article (avec noeud id = 123) a été créé, et avec ces détails sur ce nœud:

  • Titre : Un titre intéressant de mon formulaire Web
  • Corps :

    Juste du texte,

    avec du texte supplémentaire

    et encore une autre ligne

    et un autre

  • Format libre Nr : 842316

  • OptionList : Advanced (le libellé correspondant à la valeur-clé "A")

Possibilités supplémentaires

Avec quelques améliorations supplémentaires, la règle-prototype ci-dessus peut également être utilisée pour créer une alternative basée sur des règles pour le module Node Convert ... et semble également avoir le potentiel de créer comme un Entity Convert équivalent également.

5
Pierre.Vriens