[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/filefield_sources/sources/ -> reference.inc (source)

   1  <?php
   2  // $Id: reference.inc,v 1.6 2010/08/09 04:11:49 quicksketch Exp $
   3  
   4  /**
   5   * @file
   6   * A FileField extension to allow referencing of existing files.
   7   *
   8   * The "hooks" in this file are not true hooks, they're called individually
   9   * from the main filefield_sources.module in the corresponding hook by the
  10   * same name. Any of these hooks could be broken out into a separate module.
  11   */
  12  
  13  define('FILEFIELD_SOURCE_REFERENCE_HINT_TEXT', 'example.png [fid:123]');
  14  
  15  /**
  16   * Implementation of hook_filefield_source_info().
  17   */
  18  function filefield_source_reference_info() {
  19    $source = array();
  20    $source['reference'] = array(
  21      'name' => t('Autocomplete reference textfield'),
  22      'label' => t('Reference existing'),
  23      'description' => t('Reuse an existing file by entering its file name.'),
  24      'process' => 'filefield_source_reference_process',
  25      'value' => 'filefield_source_reference_value',
  26      'weight' => 1,
  27    );
  28    return $source;
  29  }
  30  
  31  /**
  32   * Implementation of hook_menu().
  33   */
  34  function filefield_source_reference_menu() {
  35    $items = array();
  36  
  37    $items['filefield/reference/%/%'] = array(
  38      'page callback' => 'filefield_source_reference_autocomplete',
  39      'page arguments' => array(2, 3),
  40      'access callback' => 'filefield_edit_access',
  41      'access arguments' => array(2, 3),
  42      'file' => 'sources/reference.inc',
  43      'type' => MENU_CALLBACK,
  44    );
  45    return $items;
  46  }
  47  
  48  /**
  49   * Implementation of hook_theme().
  50   */
  51  function filefield_source_reference_theme() {
  52    return array(
  53      'filefield_source_reference_element' => array(
  54        'arguments' => array('element' => NULL),
  55        'file' => 'sources/reference.inc',
  56      ),
  57      'filefield_source_reference_autocomplete_item' => array(
  58        'arguments' => array('file' => NULL),
  59        'file' => 'sources/reference.inc',
  60      ),
  61   );
  62  }
  63  
  64  /**
  65   * Implementation of hook_filefield_source_settings().
  66   */
  67  function filefield_source_reference_settings($op, $field) {
  68    $return = array();
  69  
  70    if ($op == 'form') {
  71      $return['sources_reference'] = array(
  72        '#title' => t('Autocomplete reference options'),
  73        '#type' => 'fieldset',
  74        '#collapsible' => TRUE,
  75        '#collapsed' => TRUE,
  76      );
  77  
  78      $return['sources_reference']['filefield_source_autocomplete'] = array(
  79        '#title' => t('Match file name'),
  80        '#options' => array(
  81          '0' => t('Starts with string'),
  82          '1' => t('Contains string'),
  83        ),
  84        '#type' => 'radios',
  85        '#default_value' => empty($field['filefield_source_autocomplete']) ? '0' : '1', 
  86      );
  87    }
  88    elseif ($op == 'save') {
  89      $return[] = 'filefield_source_autocomplete';
  90    }
  91  
  92    return $return;
  93  }
  94  
  95  /**
  96   * A #process callback to extend the filefield_widget element type.
  97   */
  98  function filefield_source_reference_process($element, $edit, &$form_state, $form) {
  99  
 100    $element['filefield_reference'] = array(
 101      '#theme' => 'filefield_source_reference_element',
 102      '#weight' => 100.5,
 103      '#access' => empty($element['fid']['#value']),
 104      '#filefield_sources_hint_text' => FILEFIELD_SOURCE_REFERENCE_HINT_TEXT,
 105    );
 106  
 107    $element['filefield_reference']['autocomplete'] = array(
 108      '#type' => 'textfield',
 109      '#autocomplete_path' => 'filefield/reference/' . $element['#type_name'] . '/' . $element['#field_name'],
 110      '#description' => filefield_sources_element_validation_help($element['#upload_validators']),
 111    );
 112  
 113    $element['filefield_reference']['select'] = array(
 114      '#type' => 'submit',
 115      '#value' => t('Select'),
 116      '#submit' => array('node_form_submit_build_node'),
 117      '#name' => $element['#name'] . '[filefield_reference][button]',
 118      '#ahah' => array(
 119         'path' => 'filefield/ahah/'. $element['#type_name'] .'/'. $element['#field_name'] .'/'. $element['#delta'],
 120         'wrapper' => $element['#id'] .'-ahah-wrapper',
 121         'method' => 'replace',
 122         'effect' => 'fade',
 123      ),
 124    );
 125  
 126    return $element;
 127  }
 128  
 129  /**
 130   * A #filefield_value_callback function.
 131   */
 132  function filefield_source_reference_value($element, &$item) {
 133    if (isset($item['filefield_reference']['autocomplete']) && strlen($item['filefield_reference']['autocomplete']) > 0 && $item['filefield_reference']['autocomplete'] != FILEFIELD_SOURCE_REFERENCE_HINT_TEXT) {
 134      $matches = array();
 135      if (preg_match('/\[fid:(\d+)\]/', $item['filefield_reference']['autocomplete'], $matches)) {
 136        $fid = $matches[1];
 137        if ($file = field_file_load($fid)) {
 138          if (filefield_sources_element_validate($element, (object) $file)) {
 139            $item = array_merge($item, $file);
 140          }
 141        }
 142        else {
 143          form_error($element, t('The referenced file could not be used because the file does not exist in the database.'));
 144        }
 145      }
 146      // No matter what happens, clear the value from the autocomplete.
 147      $item['filefield_reference']['autocomplete'] = '';
 148    }
 149  }
 150  
 151  /**
 152   * Menu callback; autocomplete.js callback to return a list of files.
 153   */
 154  function filefield_source_reference_autocomplete($type_name, $field_name, $filename) {
 155    $field = content_fields($field_name, $type_name);
 156  
 157    $items = array();
 158    if (!empty($field)) {
 159      $files = filefield_source_reference_get_files($filename, $field);
 160      foreach ($files as $fid => $file) {
 161        $items[$file->filename ." [fid:$fid]"] = theme('filefield_source_reference_autocomplete_item', $file);
 162      }
 163    }
 164  
 165    drupal_json($items);
 166  }
 167  
 168  /**
 169   * Theme the output of a single item in the autocomplete list.
 170   */
 171  function theme_filefield_source_reference_autocomplete_item($file) {
 172    $output = '';
 173    $output .= '<div class="filefield-source-reference-item">';
 174    $output .= '<span class="filename">' . $file->filename . '</span> <span class="filesize">(' . format_size($file->filesize) . ')</span>';
 175    $output .= '</div>';
 176    return $output;
 177  }
 178  
 179  /**
 180   * Theme the output of the autocomplete field.
 181   */
 182  function theme_filefield_source_reference_element($element) {
 183    $element['autocomplete']['#field_suffix'] = theme('submit', $element['select']);
 184    return '<div class="filefield-source filefield-source-reference clear-block">' . theme('textfield', $element['autocomplete']) . '</div>';
 185  }
 186  
 187  /**
 188   * Get all the files used within a particular field (or all fields).
 189   *
 190   * @param $file_name
 191   *   The partial name of the file to retrieve.
 192   * @param $field
 193   *   Optional. A CCK field array for which to filter returned files.
 194   */
 195  function filefield_source_reference_get_files($filename, $field = NULL) {
 196    if (!isset($field)) {
 197      foreach (content_fields() as $field) {
 198        if ($field['type'] == 'filefield') {
 199          $fields[] = $field;
 200        }
 201      }
 202    }
 203    else {
 204      $fields = array($field);
 205    }
 206  
 207    $files = array();
 208    foreach ($fields as $field) {
 209      $db_info = content_database_info($field);
 210  
 211      // 1 == contains, 0 == starts with.
 212      $like = empty($field['widget']['filefield_source_autocomplete']) ? '%s%%' : '%%%s%%';
 213      $result = db_query_range("SELECT f.* FROM {" . $db_info['table'] . "} c INNER JOIN {files} f ON c." . $db_info['columns']['fid']['column'] . " = f.fid WHERE f.filename LIKE '" . $like . "' AND f.status = 1 ORDER BY f.timestamp DESC", $filename, 0, 30);
 214  
 215      while ($file = db_fetch_object($result)) {
 216        $files[$file->fid] = $file;
 217      }
 218    }
 219  
 220    return $files;
 221  }


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7