[ Index ]

PHP Cross Reference of Drupal 6 (yi-drupal)

title

Body

[close]

/sites/all/modules/cck/includes/views/ -> content.views.inc (source)

   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  }


Generated: Mon Jul 9 18:01:44 2012 Cross-referenced by PHPXref 0.7