| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |