background image
HomeRecent PostsDrupalSearchTagsRSSContactAboutAccount
Eric.London's picture

drupal_execute() is great for processing a form and drupal_get_form() is great for generating the html for a form, but what if you'd like to load the $form object to modify or embed it?

<?php
// include drupal's node include file
require("modules/node/node.pages.inc");

// create an empty $form_state array
$form_state = array();

// define the content type of the form you'd like to load
$nodeType = 'MYCCKNODETYPE';

// create a string of the $form_id
$form_id = $nodeType . '_node_form';

// create a basic $node array
$node = array('type' => $nodeType, 'uid' => $GLOBALS['user']->uid, 'name' => $GLOBALS['user']->uid);

// load the $form
$form = drupal_retrieve_form($form_id, $form_state, $node);

// prepare the $form
drupal_prepare_form($form_id, $form, $form_state);

// show the form structure, debug
echo "<PRE>";
print_r($form);
echo
"</PRE>";
?>

Here are some tips on how to create a node programmatically in a Drupal module. The safest way to create a node is to use the drupal_execute() function which simulates the submission of a form [see API documentation]. This function accepts a variable number of arguments: 1) $form_id; 2) $form_state; and 3) any additional arguments. When creating a new node, the 3rd argument should be a $node object.

The $form_id should be formatted: NODETYPE_node_form. To confirm this, you could use hook_form_alter to show the form IDs for the current page (NOTE: you'll have to be on node/add/NODETYPE to display the node form ID).

<?php
function MYMODULE_form_alter(&$form, $form_state, $form_id) {
  echo
$form_id . "<BR>";
}
?>

For the second argument, you'll have to create an array that contains $form_state values (the data submitted from the node/add/NODETYPE form). Here is a basic $form_state array:

<?php
$form_state
= array();
$form_state['values'] = array(
 
'title' => t('MYTITLE'),
 
'body' => t('MYBODY'),
 
'name' => $GLOBALS['user']->name,
 
'op' => t('Save'),
);
?>

If you are creating a more complex node type, you'll want to include more information in in the $form_state['values'] array. I find it helpful to view the submitted node form data using the following code:

<?php
function MYMODULE_form_alter(&$form, $form_state, $form_id) {
 
// ensure we are modifying the right node type
 
if ($form_id == 'NODETYPE_node_form') {
   
// add an additional validation handler
   
$form['#validate'][] = '_MYMODULE_node_form_validate';
  }
}

function
_MYMODULE_node_form_validate($form, &$form_state) {
 
// display the submitted data and then die
 
echo "<pre>";
 
print_r($form_state['values']);
  echo
"</pre>";
  die;
}
?>

Now, if you create a test node (node/add/NODETYPE), you'll see the data that's being submitted from the form. NOTE: be sure to remove these two functions when you are familiar with the structure of the $form_state variable.

The 3rd argument will be a (mostly) empty $node object containing the node type:

<?php
$node
= new StdClass();
$node->type = 'NODETYPE';
?>

Here's a code snippet that shows all the pieces together:

<?php
// create $form_state
$form_state = array();
$form_state['values'] = array(
 
'title' => t('MYTITLE'),
 
'body' => t('MYBODY'),
 
'name' => $GLOBALS['user']->name,
 
'op' => t('Save'),
);

// create $node
$node = (object) NULL;
$node->type = 'NODETYPE';

// include node file, necessary for node generation
module_load_include('inc', 'node', 'node.pages');

// create node using drupal_execute
drupal_execute('NODETYPE_node_form', $form_state, $node);
?>

Syndicate content