finder_node.module

  1. finder
    1. 6.x-1.x
    2. 7.x-1.x

Version 1.1.2.57 (checked in on 2011/02/12 at 06:55:19 by danielb)

The finder node module.

Functions & methods

NameDescription
finder_node_finder_base_handlersImplements hook_finder_base_handlers().
finder_node_finder_fieldsImplements hook_finder_fields().
finder_node_finder_findImplements hook_finder_find().
finder_node_finder_gotoImplements hook_finder_goto().
finder_node_finder_resultImplements hook_finder_result().
finder_node_form_finder_admin_element_edit_alterImplements hook_form_alter().
finder_node_get_typesGet an array of content types for use in select forms.
finder_node_themeImplements hook_theme().
theme_finder_node_resultTheme a node finder result.
View source
<?php
// $Id: finder_node.module,v 1.1.2.57 2011/02/12 06:55:19 danielb Exp $

/**
 * @file
 * The finder node module.
 */

/**
 * Implements hook_theme().
 *
 * @see hook_theme()
 */
function finder_node_theme() {
  return array(
    'finder_node_result' => array(
      'variables' => array(
        'key' => NULL,
        'result' => NULL,
        'finder' => NULL,
        'form_state' => NULL,
      ),
    ),
  );
}

/**
 * Implements hook_finder_base_handlers().
 *
 * @see hook_finder_base_handlers()
 */
function finder_node_finder_base_handlers() {
  return array(
    'node' => array(
      '#title' => t('Node finder'),
      '#module' => 'finder_node',
    ),
  );
}

/**
 * Implements hook_form_alter().
 *
 * @see hook_form_alter()
 */
function finder_node_form_finder_admin_element_edit_alter(&$form, $form_state) {

  $finder = &$form_state['storage']['finder'];

  if ($finder->base == 'node') {

    $element = &$form_state['storage']['finder_element_defaults'];
    $types = finder_node_get_types();

    if ($types) {
      $form['settings']['choices']['node_types'] = array(
        '#type' => 'select',
        '#title' => t('Restrict nodes that can be found to only these content types'),
        '#default_value' => $element->settings['choices']['node_types'],
        '#options' => $types,
        '#description' => t('If no content type is selected, nodes of all types will be displayed.'),
        '#multiple' => TRUE,
        '#size' => min(6, count($types) + 1),
        '#weight' => 10,
      );
    }
    else {
      $form['settings']['choices']['no_types'] = array(
        '#value' => t("<em>There are currently no content types to choose from.</em>"),
        '#weight' => 10,
      );
    }

    $form['settings']['choices']['published'] = array(
      '#type' => 'checkbox',
      '#title' => t('Published'),
      '#default_value' => $element->settings['choices']['published'],
      '#weight' => 90,
      '#description' => t('Only show nodes that are published.'),
    );

    $form['settings']['choices']['per_result'] = array(
      '#type' => 'checkbox',
      '#title' => t('Choices per result'),
      '#default_value' => $element->settings['choices']['per_result'],
      '#weight' => 110,
      '#description' => t('Forces finder to internally process a choice for each potential result node.'),
    );

  }

}

/**
 * Implements hook_finder_fields().
 *
 * @see hook_finder_fields()
 */
function finder_node_finder_fields($finder, $finder_element_id) {
  // specify fields like: 'table.field-name' => t('display title')
  $prefix = t('Node') . ': ';
  $field_array = array(
    'node.nid' => $prefix . t('Nid'),
    'node.vid' => $prefix . t('Vid'),
    'node_type.name' => $prefix . t('Type'),
    'node.language' => $prefix . t('Language'),
    'node.title' => $prefix . t('Title'),
    'users.name' => $prefix . t('Author'),
    'node.status' => $prefix . t('Status'),
    'node.created' => $prefix . t('Created'),
    'node.changed' => $prefix . t('Changed'),
    'node.comment' => $prefix . t('Comment'),
    'node.promote' => $prefix . t('Promote'),
    //'node.moderate' => $prefix . t('Moderate'),
    'node.sticky' => $prefix . t('Sticky'),
    'node.tnid' => $prefix . t('Tnid'),
    'node.translate' => $prefix . t('Translate'),
    //'node_revision.body' => $prefix . t('Body'),
    //'node_revision.teaser' => $prefix . t('Teaser'),
    'node_revision.log' => $prefix . t('Revision log'),
    //'node_revision.format' => $prefix . t('Format'),
  );
  return $field_array;
}

/**
 * Get an array of content types for use in select forms.
 */
function finder_node_get_types() {
  //node_type_clear();
  $types = node_type_get_types();
  $type_array = array();
  $type_array[''] = t('- all -');  // this is the 'select none' option in the form
  foreach ((array)$types as $type) {
    $type_array[$type->type] = $type->name;
  }
  if (count($type_array) === 1) {
    return FALSE;
  }
  return $type_array;
}

/**
 * Implements hook_finder_find().
 *
 * @see hook_finder_find()
 */
function finder_node_finder_find($finder, $finder_element_id, $keywords, $mode, $match, $pager) {

  $prequery = array();

  foreach ($keywords as $feid => $keyword_array) {

    $element = &finder_element($finder, $feid);

    $types[$feid] = &$element->settings['choices']['node_types'];
    $published[$feid] = &$element->settings['choices']['published'];

    // restrict by types
    unset($types[$feid]['']);
    if (!empty($types[$feid])) {
      if ($feid == $finder_element_id) {
        $prequery['conditions'][] = array('node.type', array_keys($types[$feid]), 'IN');
      }
      else {
        $prequery['conditions']['restrictions'][$feid][] = array('node.type', array_keys($types[$feid]), 'IN');
      }
    }

  }

  // restrict to published nodes if required
  if (in_array(1, $published)) {
    $prequery['conditions'][] = array('node.status', 1);
  }

  $join_ons = array(
    'node_revision' => array(
      'node_revision' => 'node_revision.vid = node.vid',
    ),
    'node_type' => array(
      'node_type' => 'node_type.type = node.type',
    ),
    'users' => array(
      'users' => 'users.uid = node.uid',
    ),
  );

  $base_table = 'node';
  $base_field = 'nid';

  $result = finder_find_query($prequery, $finder, $finder_element_id, $keywords, $mode, $match, $pager, $join_ons, $base_table, $base_field);
  return $result;

}

/**
 * Implements hook_finder_goto().
 *
 * @see hook_finder_goto()
 */
function finder_node_finder_goto($finder, $result) {
  drupal_goto('node/' . $result->nid);
}

/**
 * Implements hook_finder_result().
 *
 * @see hook_finder_result()
 */
function finder_node_finder_result($finder, $keywords, $result_array, $form_state) {
  $output = '';
  foreach ($result_array as $key => $result) {
    $output .= theme('finder_node_result', array('key' => $key, 'result' => $result, 'finder' => $finder, 'form_state' => $form_state));
  }
  return $output;
}

/**
 * Theme a node finder result.
 *
 * @param $key
 *   The result key.
 * @param $result
 *   A result object.
 * @param $finder
 *   The finder object.
 * @param $form_state
 *   The Forms API form state.
 */
function theme_finder_node_result($variables) {
  extract($variables);
  $output = '';
  $result_node = node_load($result->nid);

  // Open the results wrapper
  $output .= '<div class="finder-node-result-' . $key . '" class="finder-node-result">';

  // Output a teaser of the node
  $output .= drupal_render(node_view($result_node, 'teaser'));

  // Close the results wrapper
  $output .= '</div>';

  return $output;
}

Post new comment

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

More information about formatting options

Type the characters you see in this picture. (verify using audio)
Type the characters you see in the picture above; if you can't read them, submit the form and a new image will be generated. Not case sensitive.