You are here

nodeconnect.form.inc in Node Connect 7

handles all form alters and submit functions for nodeconnect

File

nodeconnect.form.inc
View source
<?php

/**
 * @file
 * handles all form alters and submit functions for nodeconnect
 */

/**
 * Implements of hook_field_attach_form().
 *
 * here we attach a submit button for each node ref field
 */
function _nodeconnect_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode = LANGUAGE_NONE, $field_name, $field) {
  $language = $form[$field_name]['#language'];
  foreach ($form[$field_name][$language] as $key => $field) {
    if (is_numeric($key)) {

      // we have to add some extra js for single value fields so we add a class to let the
      // js know
      $extra = $form[$field_name][$language]['#cardinality'] == 1 ? 'single-value' : '';
      $form[$field_name][$language][$key]["add_nodeconnect__{$field_name}_{$key}"] = array(
        '#type' => 'submit',
        '#limit_validation_errors' => array(
          array(
            $field_name,
          ),
        ),
        '#value' => t('Add New @field_title content', array(
          '@field_title' => $form[$field_name][$language]['#title'],
        )),
        '#name' => "add_nodeconnect__{$field_name}_{$key}",
        '#prefix' => "<div class = 'nodeconnect-add {$extra}'>",
        '#suffix' => '</div>',
        '#key' => $key,
        '#field' => $field_name,
        '#add_child' => TRUE,
        '#language' => $language,
        '#submit' => array(
          'nodeconnect_include_form',
          'nodeconnect_add_edit_button_submit',
        ),
        '#weight' => -2,
        '#attached' => array(
          'js' => array(
            drupal_get_path('module', 'nodeconnect') . "/nodeconnect.js",
          ),
          'css' => array(
            drupal_get_path('module', 'nodeconnect') . "/nodeconnect.css",
          ),
        ),
      );
      $form[$field_name][$language][$key]["edit_nodeconnect__{$field_name}_{$key}"] = array(
        '#type' => 'submit',
        '#limit_validation_errors' => array(
          array(
            $field_name,
          ),
        ),
        '#value' => t('Edit referenced @field_title', array(
          '@field_title' => $form[$field_name][$language]['#title'],
        )),
        '#name' => "edit_nodeconnect__{$field_name}_{$key}",
        '#prefix' => "<div class = 'nodeconnect-edit {$extra}'>",
        '#suffix' => '</div>',
        '#key' => $key,
        '#field' => $field_name,
        '#add_child' => FALSE,
        '#language' => 'und',
        '#submit' => array(
          'nodeconnect_include_form',
          'nodeconnect_add_edit_button_submit',
        ),
        '#weight' => -2,
      );
    }
  }
}

/**
 * Called when a new node is to be added.
 *
 * we cache the current state and form and redirect to the nodeconnect_add page
 * with an append build_cached_id
 *
 * TODO: we should capture the current destination so that we can add that back
 * when we return
 */
function nodeconnect_add_edit_button_submit(&$form, &$form_state) {
  $cache_id = "nodeconnect-" . $form['#build_id'];
  $field = $form_state['clicked_button']['#field'];
  $key = $form_state['clicked_button']['#key'];
  $language = $form[$field]['#language'];
  $data = array(
    'form' => $form,
    'form_state' => $form_state,
    'dest' => $_GET['q'],
    'field' => $field,
    'key' => $key,
    'add_child' => $form_state['clicked_button']['#add_child'],
    'nid' => $form_state['values'][$field][$language][$key]['nid'],
  );
  nodeconnect_cache_set($cache_id, $data);
  unset($_GET['destination']);
  if ($data['add_child']) {
    $form_state['redirect'] = "admin/nodeconnect/add/{$cache_id}";
  }
  else {
    if ($data['nid']) {
      $form_state['redirect'] = "admin/nodeconnect/edit/{$cache_id}";
    }
  }
}

/**
 * Alters are child create form.
 *
 * We add a value field to hold the parent build_cache_id
 * and then we add a cancel button that run nodeconnect_child_form_cancel
 * and we add a new submit nodeconect_child_form_submit
 */
function nodeconnect_child_node_form_alter(&$form, &$form_state, $form_id, $cache_id, $cache) {
  $form['parent_build_cache_id'] = array(
    '#type' => 'value',
    '#value' => $cache_id,
  );
  $form['actions']['cancel'] = array(
    '#type' => 'submit',
    '#value' => t('Cancel'),
    '#submit' => array(
      'nodeconnect_include_form',
      'nodeconnect_child_form_cancel',
    ),
    '#parent_build_cache_id' => $cache_id,
    '#limit_validation_errors' => array(),
    '#weight' => 20,
  );
  $form['actions']['submit']['#submit'][] = 'nodeconnect_include_form';
  $form['actions']['submit']['#submit'][] = 'nodeconnect_child_form_submit';
}

/**
 * Submiting of are child create form.
 *
 * On submiting of a child form we set set the nid in the cache entry the
 * rediect to our redirect page
 */
function nodeconnect_child_form_submit(&$form, &$form_state) {
  $cache_id = $form_state['values']['parent_build_cache_id'];
  if ($cache_id && ($cache = cache_get($cache_id))) {
    $data = $cache->data;
    $data['nid'] = $form_state['values']['nid'];
    nodeconnect_cache_set($cache_id, $data);
    $form_state['redirect'] = "admin/nodeconnect/return/{$cache_id}";
  }
}

/**
 * Ssets the redirect to a admin/nodeconnect/redirect page
 */
function nodeconnect_child_form_cancel(&$form, &$form_state) {
  $cache_id = $form_state['clicked_button']['#parent_build_cache_id'];
  if ($cache_id && ($cache = cache_get($cache_id))) {
    $form_state['redirect'] = "admin/nodeconnect/return/{$cache_id}";
  }
}

/**
 * Logic for when we return to the parent page
 *
 * we find the cached form and form_state clean up the form_state a bit
 * and mark it to be rebuilt.
 * If the cache as an nid we set that in the input
 */
function nodeconnect_return_node_form_alter(&$form, &$form_state, $form_id, $cache_id, $cache) {
  if (!isset($form_state['#nodeconnect_processed'])) {
    $form_state = $cache->data['form_state'];
    $form = $cache->data['form'];
    $form_state['submitted'] = FALSE;
    $form_state['rebuild'] = TRUE;
    unset($form_state['clicked_button']);
    unset($form_state['submit_handlers']);
    $data = $cache->data;
    $language = $form[$data['field']]['#language'];

    //if ($data['add_child']  && isset($data['nid']) && $form_state['rebuild']=== TRUE && ($node = node_load($data['nid'])) ) {
    if (isset($data['nid']) && $form_state['rebuild'] === TRUE && ($node = node_load($data['nid']))) {
      $element['#default_value'] = $node->nid;

      //use the autocompleate value so we are sure we validate
      $value = node_reference_autocomplete_value($element, FALSE, $form_state);
      $form_state['input'][$data['field']][$language][$data['key']]['nid'] = $value;
    }
    $form_state['#nodeconnect_processed'] = TRUE;
    $form = drupal_rebuild_form($form_id, $form_state, $form);
  }
}

/**
 * Wraps cache set so we can set the expire easily.
 */
function nodeconnect_cache_set($cid, $data) {
  return cache_set($cid, $data, 'cache', CACHE_PERMANENT);
}

Functions

Namesort descending Description
nodeconnect_add_edit_button_submit Called when a new node is to be added.
nodeconnect_cache_set Wraps cache set so we can set the expire easily.
nodeconnect_child_form_cancel Ssets the redirect to a admin/nodeconnect/redirect page
nodeconnect_child_form_submit Submiting of are child create form.
nodeconnect_child_node_form_alter Alters are child create form.
nodeconnect_return_node_form_alter Logic for when we return to the parent page
_nodeconnect_field_attach_form Implements of hook_field_attach_form().