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:
This is probably because your files are classified as octet-stream, since the mimetype for APK files is unknown to Backdrop. When this happens, Backdrop doesn't assign a file type to the managed file...
Posted2 hours 59 min ago by Alejandro Cremaschi (argiepiano) on:
For the record I cut and pasted the missing blogs. This was so long ago and the experience that I've gained made me realize the difference between content and configuration. It is likely that...
This may not be news, but I had some success with Node Export on D7 and Feeds on Backdrop. (Couldn't get Feeds -> Feeds import to work correctly.) The way I got it working was to set Node...
This module allows an administrator to define additional (billing and
shipping) address fields (i.e. VAT) in Ubercart e-commerce suite.
Backdrop CMS port: https://drive.google.com/file/...
I'd like to discuss options for moving #2231 forward. It concerns having a simplified array syntax for database details that will support complex passwords better than the current db url and simpler...
Posted2 days 9 hours ago by Martin Price | System Horizons Ltd (yorkshirepudding) on:
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 thewebform
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 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: