Same name and namespace in other branches
  1. 4.7.x modules/node.module \node_form()
  2. 5.x modules/node/node.module \node_form()
  3. 6.x modules/node/node.pages.inc \node_form()
  4. 7.x modules/node/node.pages.inc \node_form()

Generate the node editing form.

3 calls to node_form()
node_add in modules/node.module
Present a node submission form or a set of links to such forms.
node_edit in modules/node.module
Present a node editing form.
node_preview in modules/node.module
Generate a node preview, including a form for further edits.

File

modules/node.module, line 1308
The core that allows content to be submitted to the site.

Code

function node_form($edit) {

  // Validate the node if we don't already know the errors.
  if (!$edit->validated) {
    $edit = node_validate($edit);
  }

  // Prepend extra node form elements.
  $form = implode('', node_invoke_nodeapi($edit, 'form pre'));

  // Get the node-specific bits.
  // We can't use node_invoke() because $param must be passed by reference.
  $function = node_get_module_name($edit) . '_form';
  $param = array();
  if (function_exists($function)) {
    $form .= $function($edit, $param);
  }

  // Append extra node form elements.
  $form .= implode('', node_invoke_nodeapi($edit, 'form post'));
  $output .= '<div class="node-form">';

  // Add hidden 'op' variable, which specifies the default operation (Preview).
  $output .= '<input type="hidden" name="op" value="' . check_plain(t('Preview')) . "\" />\n";

  // Add the admin-specific parts.
  if (user_access('administer nodes')) {
    $output .= '<div class="admin">';
    $author = form_textfield(t('Authored by'), 'name', $edit->name, 20, 60);
    $author .= form_textfield(t('Authored on'), 'date', $edit->date, 20, 25, NULL, NULL, TRUE);
    $output .= '<div class="authored">';
    $output .= form_group(t('Authoring information'), $author);
    $output .= "</div>\n";
    $node_options = variable_get('node_options_' . $edit->type, array(
      'status',
      'promote',
    ));
    $options .= form_checkbox(t('Published'), 'status', 1, isset($edit->status) ? $edit->status : in_array('status', $node_options));
    $options .= form_checkbox(t('In moderation queue'), 'moderate', 1, isset($edit->moderate) ? $edit->moderate : in_array('moderate', $node_options));
    $options .= form_checkbox(t('Promoted to front page'), 'promote', 1, isset($edit->promote) ? $edit->promote : in_array('promote', $node_options));
    $options .= form_checkbox(t('Sticky at top of lists'), 'sticky', 1, isset($edit->sticky) ? $edit->sticky : in_array('sticky', $node_options));
    $options .= form_checkbox(t('Create new revision'), 'revision', 1, isset($edit->revision) ? $edit->revision : in_array('revision', $node_options));
    $output .= '<div class="options">';
    $output .= form_group(t('Options'), $options);
    $output .= "</div>\n";
    $extras .= implode('</div><div class="extra">', node_invoke_nodeapi($edit, 'form admin'));
    $output .= $extras ? '<div class="extra">' . $extras . '</div></div>' : '</div>';
  }

  // Add the default fields.
  $output .= '<div class="standard">';
  $output .= form_textfield(t('Title'), 'title', $edit->title, 60, 128, NULL, NULL, TRUE);

  // Add the node-type-specific fields.
  $output .= $form;

  // Add the hidden fields.
  if ($edit->nid) {
    $output .= form_hidden('nid', $edit->nid);
  }
  if (isset($edit->uid)) {

    // The use of isset() is mandatory in the context of user IDs, because
    // user ID 0 denotes the anonymous user.
    $output .= form_hidden('uid', $edit->uid);
  }
  if ($edit->created) {
    $output .= form_hidden('created', $edit->created);
  }
  if ($edit->changed) {
    $output .= form_hidden('changed', $edit->changed);
  }
  $output .= form_hidden('type', $edit->type);

  // Add the buttons.
  $output .= form_submit(t('Preview'));
  if ($edit->type && ($_POST['op'] == t('Preview') && !form_get_errors() || !variable_get('node_preview', 0))) {
    $output .= form_submit(t('Submit'));
  }
  if ($edit->nid && node_access('delete', $edit)) {
    $output .= form_submit(t('Delete'));
  }
  $output .= '</div></div>';
  $extra = node_invoke_nodeapi($edit, 'form param');
  foreach ($extra as $key => $value) {
    if (is_array($value)) {
      if (isset($param[$key])) {
        $param[$key] = array_merge($param[$key], $value);
      }
      else {
        $param[$key] = $value;
      }
    }
    else {
      $param[$key] = $value;
    }
  }
  $attributes = array(
    'id' => 'node-form',
  );
  if (is_array($param['options'])) {
    $attributes = array_merge($param['options'], $attributes);
  }
  return form($output, $param['method'] ? $param['method'] : 'post', $param['action'], $attributes);
}