You are here

node_class.module in Node Class 7

Same filename and directory in other branches
  1. 8 node_class.module
  2. 6.2 node_class.module
  3. 6 node_class.module

File

node_class.module
View source
<?php

/*
 * Extends the node's classes with any user defined classes.
 */
function node_class_preprocess_node(&$vars) {
  $node = $vars['node'];
  $classes = node_class($node);
  $vars['classes_array'] = array_merge($vars['classes_array'], explode(' ', $classes));
}

/*
 * Accessor for css_class information
 */
function node_class($node) {
  $attributes = node_class_attributes($node);
  return $attributes;
}

/*
 * Gets CSS class information for a given node.
 */
function node_class_attributes($node) {

  // dev note:
  // Get css attribute information ONLY if node already existed.
  // if we're here the $form[#node] object will have already been
  // created but it won't have an nid because it hasn't been saved
  if (!isset($node->nid)) {
    return "";
  }
  return db_query('SELECT css_class FROM {node_class} WHERE nid = :nid', array(
    ':nid' => $node->nid,
  ))
    ->fetchField();
}

/*
 * Implementation of hook_form_alter().
 */
function node_class_form_alter(&$form, &$form_state, $form_id) {

  // Check form type && if user_access is ok
  if (isset($form['#node']) && $form_id == $form['#node']->type . '_node_form' && user_access('administer nodes')) {
    $form['node_class'] = array(
      '#type' => 'fieldset',
      '#title' => t('Node Class settings'),
      '#collapsible' => TRUE,
      '#weight' => -1,
      '#tree' => TRUE,
    );

    // Get css attribute information
    $attributes = node_class_attributes($form['#node']);

    // Check CSS exists in DB to prepare SQL update
    if ($attributes) {
      $form['node_class']['existing_css'] = array(
        '#type' => 'hidden',
        '#value' => '1',
      );
    }
    $form['node_class']['css_class'] = array(
      '#type' => 'textfield',
      '#title' => t('CSS class(es)'),
      '#default_value' => $attributes,
      '#description' => t('Separate classes with a space.'),
    );

    // Add submit handler for node_class module
    $form['#submit'][] = 'node_class_form_submit';
  }
}

/**
 * Form submission handler for node form.
 */
function node_class_form_submit($form, &$form_state) {
  if ($form_state['values']['form_id'] == $form['#node']->type . '_node_form') {
    if (isset($form_state['values']['node_class']['css_class']) && user_access('administer nodes')) {
      $nid = $form_state['values']['nid'];
      $class = check_plain($form_state['values']['node_class']['css_class']);

      // update existing nodes that already have nid AND a class
      if (isset($form_state['values']['node_class']['existing_css']) && !is_null($nid)) {
        db_update('node_class')
          ->fields(array(
          'css_class' => $class,
        ))
          ->condition('nid', $nid)
          ->execute();
      }

      // update existing nodes that are getting classes for the first time
      // quickest fix without a refactoring.
      if (!isset($form_state['values']['node_class']['existing_css']) && !is_null($nid) && !is_null($form_state['values']['node_class']['css_class'])) {

        // technically this could replace the above, but merges are expensive.
        db_merge('node_class')
          ->key(array(
          'nid' => $nid,
        ))
          ->fields(array(
          'css_class' => $class,
        ))
          ->execute();
      }
    }
  }
}

/**
 * Implements hook_node_delete().
 */
function node_class_node_delete($node) {

  // Delete class information for the node
  db_delete('node_class')
    ->condition('nid', $node->nid)
    ->execute();
}

/**
 * Implements hook_node_insert().
 */
function node_class_node_insert($node) {
  if (isset($node->node_class['css_class']) && $node->node_class['css_class'] != '') {
    $id = db_insert('node_class')
      ->fields(array(
      'nid' => $node->nid,
      'css_class' => $node->node_class['css_class'],
    ))
      ->execute();
  }
}