How to create a webform with code (programmatically)
I was hoping to add a webform to a recipe, but can not do this with config files - since webforms are nodes and are not currently stored in config files.
I went ahead and created a recipe for a Contact Us form that uses the Webform module instead of the core Contact module. Because, I was not able to use config files, I used PHP in the .install file of the module to create the form. Here is the code I used:
You posted this as I was typing my answer. Have you actually tried what you posted? I don't think creating a node and passing the components to it will work... but maybe I'm wrong.
@argiepiano - You are so very fast. I figured out the answer before posting the question, but wanted to add it to the forum for future reference (next time I need to do this and forgot I did it before). I really thought I would get my answer up before anyone else did.
It's still interesting, because you provide a different way of doing it that may or may not be better.
Yes, my way works. I've already tested and released a recipe that creates a webform in the manner I proposed. That doesn't mean it's the best way to do it.
If my works, do you still think that might be a reason that your way is better?
Take a look at webform_node_insert(), which is a hook implementation that's triggered when a node is saved. If the node is of the webform type, then the rest of the code there is executed. To create a webform programmatically, you could simply create a node of that type programmatically. When you save the node, all of the code in webform_node_insert() will run, resulting on a ready-to-use webform node.
Of course, that will not add fields to the webform. In order to do that, you have to call webform_component_insert() and pass it a component. My guess is that the component will be an array with specific keys. To figure those keys out, you can manually create a webform, add components, and then use devel's dpm() to inspect the node. For example, this is a textfield component:
Start with basics: install modules for meta tags and XML sitemaps, set proper alt text on images, and keep URLs clean. Backdrop SEO is mostly about structure and content quality, not tricks.
Yes, this was solved in MIME mail: https://github.com/backdrop-contrib/mimemail/issues/52
The issue was that starting in php 8.1, you need \r\n to separate the header lines. Mimemail did...
Posted1 day 9 hours ago by Alejandro Cremaschi (argiepiano) on:
Was this problem ever resolved @argiepiano?
I am experiencing something similar with smtp, mailsystem, mime_mail and views_send.
If I try to attach a pdf document, it gets sent but...
Posted1 day 15 hours ago by Martin Jones (nattyweb) on:
If you’re planning on building this from scratch, you might look at how the seven module handles SMS/external APIs as a reference for the connection side. Integrating Dialogflow via a custom...
Comments
I found an open issue to allow the storage of webform components in config files: https://github.com/backdrop-contrib/webform/issues/192
Until that happens, creating a webform programmatically (in code) is pretty much the same as creating any other type of node in code. https://forum.backdropcms.org/forum/how-does-one-create-node-programmati...
I went ahead and created a recipe for a Contact Us form that uses the Webform module instead of the core Contact module. Because, I was not able to use config files, I used PHP in the .install file of the module to create the form. Here is the code I used:
https://github.com/backdrop-contrib/contact_us_webform_recipe/blob/1.x-1...
(Use link to recipe. I tried to paste code here, but it's a mess. Will open an issue.)
You posted this as I was typing my answer. Have you actually tried what you posted? I don't think creating a node and passing the components to it will work... but maybe I'm wrong.
@argiepiano - You are so very fast. I figured out the answer before posting the question, but wanted to add it to the forum for future reference (next time I need to do this and forgot I did it before). I really thought I would get my answer up before anyone else did.
It's still interesting, because you provide a different way of doing it that may or may not be better.
Yes, my way works. I've already tested and released a recipe that creates a webform in the manner I proposed. That doesn't mean it's the best way to do it.
If my works, do you still think that might be a reason that your way is better?
Take a look at
webform_node_insert(), which is a hook implementation that's triggered when a node is saved. If the node is of thewebformtype, then the rest of the code there is executed. To create a webform programmatically, you could simply create a node of that type programmatically. When you save the node, all of the code inwebform_node_insert()will run, resulting on a ready-to-use webform node.Of course, that will not add fields to the webform. In order to do that, you have to call
webform_component_insert()and pass it a component. My guess is that the component will be an array with specific keys. To figure those keys out, you can manually create a webform, add components, and then use devel's dpm() to inspect the node. For example, this is a textfield component: