| [ Index ] |
PHP Cross Reference of Drupal 6 (yi-drupal) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: content.views.inc,v 1.1.2.28 2009/08/11 20:05:18 markuspetrux Exp $ 3 4 /** 5 * @file 6 * Interface between content.module and views.module. 7 */ 8 9 // Include the files defining the classes we extend. 10 // This is needed in case the /cck folder lives in the main 11 // /modules folder (views_module_include() will then load 12 // content.views.inc before node.views.inc) 13 module_load_include('inc', 'views', 'modules/node.views'); 14 15 /** 16 * Implementation of hook_views_handlers(). 17 */ 18 function content_views_handlers() { 19 return array( 20 'info' => array( 21 'path' => drupal_get_path('module', 'content') . '/includes/views/handlers', 22 ), 23 'handlers' => array( 24 25 // argument handlers 26 'content_handler_argument' => array( 27 'parent' => 'views_handler_argument', 28 ), 29 'content_handler_argument_string' => array( 30 'parent' => 'views_handler_argument_string', 31 ), 32 'content_handler_argument_numeric' => array( 33 'parent' => 'views_handler_argument_numeric', 34 ), 35 'content_handler_argument_reference' => array( 36 'parent' => 'content_handler_argument_numeric', 37 ), 38 'content_handler_argument_many_to_one' => array( 39 'parent' => 'views_handler_argument_many_to_one', 40 ), 41 42 // field handlers 43 'content_handler_field' => array( 44 'parent' => 'views_handler_field_node', 45 ), 46 'content_handler_field_multiple' => array( 47 'parent' => 'content_handler_field', 48 ), 49 50 // filter handlers 51 'content_handler_filter_string' => array( 52 'parent' => 'views_handler_filter_string', 53 ), 54 'content_handler_filter_numeric' => array( 55 'parent' => 'views_handler_filter_numeric', 56 ), 57 'content_handler_filter_float' => array( 58 'parent' => 'views_handler_filter_float', 59 ), 60 'content_handler_filter_many_to_one' => array( 61 'parent' => 'views_handler_filter_many_to_one', 62 ), 63 64 // relationship handlers 65 'content_handler_relationship' => array( 66 'parent' => 'views_handler_relationship', 67 ), 68 69 // sort handlers 70 'content_handler_sort' => array( 71 'parent' => 'views_handler_sort', 72 ), 73 ), 74 ); 75 } 76 77 /** 78 * Implementation of hook_views_plugins. 79 * 80 * Defines some plugins used by the Views modes for 81 * nodereference and userreference. 82 */ 83 function content_views_plugins() { 84 $plugins = array( 85 'module' => 'content', // This just tells our themes are elsewhere. 86 'display' => array( 87 'content_simple' => array( 88 'path' => drupal_get_path('module', 'content') . '/includes/views/handlers', 89 // Those strings are not translated for now. 90 // We'll need to change that if / when we remove 'no ui' 91 'title' => 'Simple', // TODO: better name ? (currently not displayed anyway) 92 'help' => 'Destination-agnostic display. Mostly useful for programmatic views.', 93 'handler' => 'content_plugin_display_simple', 94 'no ui' => TRUE, // Programmatic use only. 95 'uses hook menu' => FALSE, 96 'use ajax' => FALSE, 97 'use pager' => FALSE, 98 'accept attachments' => FALSE, 99 ), 100 'content_references' => array( 101 'path' => drupal_get_path('module', 'content') . '/includes/views/handlers', 102 // Those strings are not translated for now. 103 // We'll need to change that if / when we remove 'no ui' 104 'title' => 'Simple - for reference fields', // TODO: better name ? (currently not displayed anyway) 105 'help' => 'Destination-agnostic display. Mostly useful for programmatic views.', 106 'parent' => 'content_simple', 107 'handler' => 'content_plugin_display_references', 108 'no ui' => TRUE, // Programmatic use only. 109 'uses hook menu' => FALSE, 110 'use ajax' => FALSE, 111 'use pager' => FALSE, 112 'accept attachments' => FALSE, 113 ), 114 ), 115 'style' => array( 116 'content_php_array_autocomplete' => array( 117 'path' => drupal_get_path('module', 'content') . '/includes/views/handlers', 118 // Those strings are not translated for now. 119 // We'll need to change that if / when we remove 'no ui' 120 'title' => 'Results array (with title)', 121 'help' => 'Returns the view as a PHP array of names + rendered rows.', 122 'handler' => 'content_plugin_style_php_array_ac', 123 'no ui' => TRUE, // Programmatic use only. 124 'uses row plugin' => TRUE, 125 'uses fields' => TRUE, 126 'type' => 'content_simple', 127 'even empty' => TRUE, 128 ), 129 ), 130 ); 131 return $plugins; 132 } 133 134 /** 135 * Implementation of hook_views_data(). 136 * 137 * Exposes all fields to the views system. 138 */ 139 function content_views_data() { 140 $data = array(); 141 foreach (content_fields() as $field) { 142 $module = $field['module']; 143 $result = (array) module_invoke($module, 'field_settings', 'views data', $field); 144 drupal_alter('field_settings', $result, 'views data', $field); 145 if (empty($result)) { 146 $result = content_views_field_views_data($field); 147 } 148 if (is_array($result)) { 149 $data = array_merge($data, $result); 150 } 151 } 152 return $data; 153 } 154 155 156 function content_views_field_views_data($field) { 157 $field_types = _content_field_types(); 158 159 // Check the field module is available. 160 // TODO: is this really how we should do it ? 161 if (isset($field_types[$field['type']])) { 162 $db_info = content_database_info($field); 163 164 // Field modules that do not store data in the database 165 // should not create views data tables. 166 if (empty($db_info['columns'])) { 167 return; 168 } 169 170 $table_alias = content_views_tablename($field); 171 172 $types = array(); 173 foreach (content_types() as $type) { 174 if (isset($type['fields'][$field['field_name']])) { 175 // TODO : run check_plain here instead of on the imploded string below ? 176 $types[] = $type['name']; 177 } 178 } 179 180 $data = array(); 181 $data['table']['group'] = t('Content'); 182 $data['table']['join']['node'] = array( 183 'table' => $db_info['table'], 184 'left_field' => 'vid', 185 'field' => 'vid', 186 ); 187 $data['table']['join']['node_revisions'] = array( 188 'table' => $db_info['table'], 189 'left_field' => 'vid', 190 'field' => 'vid', 191 ); 192 193 // Build the list of columns enabled for default views integration. 194 $db_columns = array(); 195 $additional_fields = array(); 196 foreach ($db_info['columns'] as $column => $attributes) { 197 // Select explicitly enabled field columns. 198 if (!empty($attributes['views'])) { 199 $db_columns[$column] = $attributes; 200 } 201 // Ensure all columns are retrieved. 202 $additional_fields[$attributes['column']] = $attributes['column']; 203 } 204 // Pick up the first column when none has been explicitly enabled 205 // (pre CCK 2.2 backwards compatibility). 206 if (empty($db_columns)) { 207 // Can't use array_slice(), it won't work in PHP4 for assoc array. 208 foreach ($db_info['columns'] as $column => $attributes) { 209 $db_columns[$column] = $attributes; 210 break; 211 } 212 } 213 $columns = array(); 214 $db_fields = array(); 215 $arguments = array(); 216 $filters = array(); 217 foreach ($db_columns as $column => $attributes) { 218 $columns[] = $column; 219 $db_fields[] = $attributes['column']; 220 $sorts[] = !empty($attributes['sortable']) ? TRUE : FALSE; 221 222 // Identify likely filters and arguments for each column based on field type. 223 switch ($attributes['type']) { 224 case 'int': 225 case 'mediumint': 226 case 'tinyint': 227 case 'bigint': 228 case 'serial': 229 $filters[] = 'content_handler_filter_numeric'; 230 $arguments[] = 'content_handler_argument_numeric'; 231 break; 232 case 'numeric': 233 case 'float': 234 $filters[] = 'content_handler_filter_float'; 235 $arguments[] = 'content_handler_argument_numeric'; 236 break; 237 238 case 'text': 239 case 'blob': 240 // TODO add markup handlers for these types 241 default: 242 $filters[] = 'content_handler_filter_string'; 243 $arguments[] = 'content_handler_argument_string'; 244 break; 245 } 246 } 247 248 // Provide automatic filters, sorts, and arguments for each column, not just the first. 249 $db_fields_count = count($db_fields); 250 foreach ($db_fields as $i => $db_field) { 251 $label_truncated = truncate_utf8(t($field['widget']['label']), 10, TRUE); 252 if ($db_fields_count == 1) { 253 $title = t('@label (!name)', array('@label' => t($field['widget']['label']), '!name' => $field['field_name'])); 254 $title_short = check_plain($label_truncated); 255 } 256 else { 257 $title = t('@label (!name) - !column', array('@label' => t($field['widget']['label']), '!name' => $field['field_name'], '!column' => $columns[$i])); 258 $title_short = t('@label-truncated - !column', array('@label-truncated' => $label_truncated, '!column' => $columns[$i])); 259 } 260 261 $data[$db_field] = array( 262 'group' => t('Content'), 263 'title' => $title, 264 'title short' => $title_short, 265 'help' => t($field_types[$field['type']]['label']) .' - '. t('Appears in: @types', array('@types' => implode(', ', $types))), 266 ); 267 if ($i == 0) { 268 $data[$db_field]['field'] = array( 269 'title' => t('@label (!name)', array('@label' => t($field['widget']['label']), '!name' => $field['field_name'])), 270 'title short' => check_plain($label_truncated), 271 'field' => $db_field, 272 'table' => $db_info['table'], 273 'handler' => 'content_handler_field_multiple', 274 'click sortable' => $sorts[$i], 275 'additional fields' => $additional_fields, 276 'content_field_name' => $field['field_name'], 277 'access callback' => 'content_access', 278 'access arguments' => array('view', $field), 279 ); 280 } 281 $data[$db_field]['argument'] = array( 282 'field' => $db_field, 283 'table' => $db_info['table'], 284 'handler' => $arguments[$i], 285 'additional fields' => $additional_fields, 286 'content_field_name' => $field['field_name'], 287 'empty field name' => t('<No value>'), 288 ); 289 $data[$db_field]['filter'] = array( 290 'field' => $db_field, 291 'table' => $db_info['table'], 292 'handler' => $filters[$i], 293 'additional fields' => $additional_fields, 294 'content_field_name' => $field['field_name'], 295 'allow empty' => TRUE, 296 ); 297 if (!empty($sorts[$i])) { 298 $data[$db_field]['sort'] = array( 299 'field' => $db_field, 300 'table' => $db_info['table'], 301 'handler' => 'content_handler_sort', 302 'additional fields' => $additional_fields, 303 'content_field_name' => $field['field_name'], 304 ); 305 } 306 } 307 308 // Expose additional delta column for multiple value fields. 309 if ($field['multiple']) { 310 $title = t('@label (!name) - delta', array('@label' => t($field['widget']['label']), '!name' => $field['field_name'])); 311 $title_short = t('@label-truncated - delta', array('@label-truncated' => $label_truncated)); 312 313 $db_field = 'delta'; 314 $data[$db_field] = array( 315 'group' => t('Content'), 316 'title' => $title, 317 'title short' => $title_short, 318 'help' => t('Delta - Appears in: @types', array('@types' => implode(', ', $types))), 319 ); 320 $data[$db_field]['field'] = array( 321 'title' => $title, 322 'title short' => $title_short, 323 'field' => $db_field, 324 'table' => $db_info['table'], 325 'handler' => 'views_handler_field_numeric', 326 'click sortable' => TRUE, 327 'additional fields' => $additional_fields, 328 'access callback' => 'content_access', 329 'access arguments' => array('view', $field), 330 ); 331 $data[$db_field]['argument'] = array( 332 'field' => $db_field, 333 'table' => $db_info['table'], 334 'handler' => 'views_handler_argument_numeric', 335 'additional fields' => $additional_fields, 336 'empty field name' => t('<No value>'), 337 ); 338 $data[$db_field]['filter'] = array( 339 'field' => $db_field, 340 'table' => $db_info['table'], 341 'handler' => 'views_handler_filter_numeric', 342 'additional fields' => $additional_fields, 343 'allow empty' => TRUE, 344 ); 345 $data[$db_field]['sort'] = array( 346 'field' => $db_field, 347 'table' => $db_info['table'], 348 'handler' => 'views_handler_sort', 349 'additional fields' => $additional_fields, 350 ); 351 } 352 353 return array($table_alias => $data); 354 } 355 } 356 357 /** 358 * Helper function so it is possible to change the Views tablename 359 * in the future without re-writing code. 360 */ 361 function content_views_tablename($field) { 362 return 'node_data_'. $field['field_name']; 363 } 364 365 function theme_content_view_multiple_field($items, $field, $values) { 366 $output = ''; 367 $i = 0; 368 foreach ($items as $item) { 369 if (!empty($item) || $item == '0') { 370 $output .= '<div class="field-item field-item-'. $i .'">'. $item .'</div>'; 371 $i++; 372 } 373 } 374 return $output; 375 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Mon Jul 9 18:01:44 2012 | Cross-referenced by PHPXref 0.7 |