signalpoint / DrupalGap

An application development kit for Drupal websites.
https://www.drupalgap.org
GNU General Public License v2.0
232 stars 185 forks source link

Custom Node Creation Forms with Fields #940

Open mkinnan opened 7 years ago

mkinnan commented 7 years ago

Is the approach I have taken below the correct method to handle form fields for node creation? Or am I missing something?

In attempting to create my own custom node add pages, I have reviewed the example: http://docs.drupalgap.org/7/Entities/Editing_Entities

The example works great for creating/editing a node with only a title. When adding in additional fields such as body, one might think to do the following:

function my_module_form(form, form_state, node) {
  try {

    form.elements['title'] = {
      type: 'textfield',
      title: t('Title'),
      required: true,
      default_value: node.title
    };

    form.elements['body'] = {
      type: 'textarea',
      title: t('Description'),
      required: true,
      default_value: node.body
    };

    form.elements['submit'] = {
      type: 'submit',
      value: t('Save')
    };

    return form;

  }
  catch (error) { console.log('my_module_form - ' + error); }
}

The issue with that for the body form element is that when hook_form_submit is called, Drupal is expecting the format of form.values to be:

{
   "title":"A Test",
   "body":{
      "und":[
         {
            "value":"a bunch of text"
         }
      ]
   }
}

but what is returned from my custom form is:

{
   "title":"A Test",
   "body":{
      "und":{
         "0":"a bunch of text"
      }
   }
}

which causes the node creation to fail. So, instead I create a different identity for my body:

form.elements['my_custom_body'] = {
  type: 'textarea',
  title: t('Description'),
  required: true,
  default_value: node.body
};

and rebuild the form.values object before passing to node_save:

function my_module_form_submit(form, form_state) {
  try {

    var data_to_save = {
      language: form_state.values.language,
      type: form_state.values.type,
      title: form_state.values.title,
      body: { und: [ { value: form_state.values.my_module_body } ] }
    };

    node_save(data_to_save, {
      success: function(result) {
        drupalgap_goto('node/' + result.nid, { reloadPage: true });
      }
    });

  }
  catch (error) { console.log('my_module_form_submit - ' + error); }
}
signalpoint commented 7 years ago

@mkinnan I often use the same technique that you use with the data_to_save example. Essentially build a simple form, with simple inputs, then in the submit handler build the complex JSON that Drupal is expecting.