You are here

function _node_reference_potential_references_standard in References 7.2

Helper function for node_reference_potential_references().

List of referenceable nodes defined by content types.

1 call to _node_reference_potential_references_standard()
node_reference_potential_references in node_reference/node_reference.module
Retrieves an array of candidate referenceable nodes.

File

node_reference/node_reference.module, line 895
Defines a field type for referencing one node from another.

Code

function _node_reference_potential_references_standard($field, $options) {

  // Avoid useless work.
  if (!count($field['settings']['referenceable_types'])) {
    return array();
  }
  $query = db_select('node', 'n');
  if (!user_access('bypass node access')) {

    // If the user is able to view their own unpublished nodes, allow them to
    // see these in addition to published nodes. Check that they actually have
    // some unpublished nodes to view before adding the condition.
    if (user_access('view own unpublished content') && ($own_unpublished = db_query('SELECT nid FROM {node} WHERE uid = :uid AND status = :status', array(
      ':uid' => $GLOBALS['user']->uid,
      ':status' => NODE_NOT_PUBLISHED,
    ))
      ->fetchCol())) {
      $query
        ->condition(db_or()
        ->condition('n.status', NODE_PUBLISHED)
        ->condition('n.nid', $own_unpublished, 'IN'));
    }
    else {

      // If not, restrict the query to published nodes.
      $query
        ->condition('n.status', NODE_PUBLISHED);
    }
    $query
      ->addTag('node_access');
  }
  $query
    ->addField('n', 'nid');
  $node_title_alias = $query
    ->addField('n', 'title', 'node_title');
  $node_type_alias = $query
    ->addField('n', 'type', 'node_type');
  $query
    ->addMetaData('id', ' _node_reference_potential_references_standard')
    ->addMetaData('field', $field)
    ->addMetaData('options', $options);
  if (is_array($field['settings']['referenceable_types'])) {
    $query
      ->condition('n.type', $field['settings']['referenceable_types'], 'IN');
  }
  if ($options['string'] !== '') {
    switch ($options['match']) {
      case 'contains':
        $query
          ->condition('n.title', '%' . $options['string'] . '%', 'LIKE');
        break;
      case 'starts_with':
        $query
          ->condition('n.title', $options['string'] . '%', 'LIKE');
        break;
      case 'fuzzy':
        $words = explode(' ', $options['string']);
        foreach ($words as $word) {
          $query
            ->condition('n.title', '%' . $word . '%', 'LIKE');
        }
        break;
      case 'equals':

      // No match type or incorrect match type: use "=".
      default:
        $query
          ->condition('n.title', $options['string']);
        break;
    }
  }
  if ($options['ids']) {
    $query
      ->condition('n.nid', $options['ids'], 'IN');
  }
  if ($options['limit']) {
    $query
      ->range(0, $options['limit']);
  }
  $query
    ->orderBy($node_title_alias)
    ->orderBy($node_type_alias);
  $result = $query
    ->execute()
    ->fetchAll();
  $references = array();
  foreach ($result as $node) {
    $references[$node->nid] = array(
      'title' => $node->node_title,
      'rendered' => check_plain($node->node_title),
    );
  }
  return $references;
}