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.
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.
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 MachineFieldNameCe 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:
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).Supposons un formulaire Web avec form_id=191
et avec ces composants Webform:
demoform_title
, Type de données = Champ de texte.demoform_text
, Type de données = Zone de texte.demoform_number
, Type de données = Nombre.demoform_option
, Type de données = Sélectionnez les options (valeur unique).Supposons un type de contenu d'article avec ces champs:
title
, Field type = Node element module.body
, Type de champ = Texte long et résumé.field_free_format_nr
, Type de champ = Entier.field_optionlist
, Type de champ = Liste (texte).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
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:
Corps :
Juste du texte,
avec du texte supplémentaire
et encore une autre ligne
et un autre
Format libre Nr : 842316
A
")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.