You are here

asset_views.inc in Asset 6

File

inc/asset_views.inc
View source
<?php

function asset_views_tables() {
  $tables['asset_node'] = array(
    'name' => 'asset_node',
    'join' => array(
      'type' => 'inner',
      'left' => array(
        'table' => 'node',
        'field' => 'nid',
      ),
      'right' => array(
        'field' => 'nid',
      ),
    ),
  );
  $tables['asset'] = array(
    'name' => 'asset',
    'join' => array(
      'type' => 'inner',
      'left' => array(
        'table' => 'asset_node',
        'field' => 'aid',
      ),
      'right' => array(
        'field' => 'aid',
      ),
    ),
    'fields' => array(
      'aid' => array(
        'name' => t('Asset'),
        'help' => t('Display the formatted asset. NOTE: If using one of the formatters under <em><strong>Only Available for Specific Extensions</strong></em>, be sure to apply the Asset:Extension filter for the specific extensions that apply to that formatter.'),
        'option' => array(
          '#type' => 'select',
          '#options' => 'asset_views_options_formatters',
        ),
        'handler' => array(
          'asset_views_handler_field_asset' => t('No Link'),
          'asset_views_handler_field_asset_link' => t('Link to asset'),
          'asset_views_handler_field_asset_node_link' => t('Link to node'),
        ),
      ),
      'filename' => array(
        'name' => t('Asset: Filename'),
        'help' => t('Display the filename of the asset.'),
      ),
      'extension' => array(
        'name' => t('Asset: Extension'),
        'help' => t('Display the extension of the asset.'),
      ),
      'dirname' => array(
        'name' => t('Asset: Directory'),
        'help' => t('Display the directory of the asset.'),
      ),
      'filesize' => array(
        'name' => t('Asset: File Size'),
        'help' => t('Display the file size of the asset.'),
      ),
    ),
    'filters' => array(
      'extension' => array(
        'name' => t('Asset: File Extension'),
        'help' => t('Filter by file extension.'),
        'operator' => views_handler_operator_andor(),
        'value' => array(
          '#type' => 'select',
          '#options' => 'asset_views_options_file_extensions',
          '#multiple' => true,
          '#size' => 4,
        ),
      ),
      'type' => array(
        'name' => t('Asset: File Type'),
        'help' => t('Filter by file type.'),
        'operator' => views_handler_operator_andor(),
        'value' => array(
          '#type' => 'select',
          '#options' => 'asset_views_options_file_types',
          '#multiple' => true,
          '#size' => 4,
        ),
      ),
      'dirname' => array(
        'name' => t('Asset: Directory'),
        'help' => t('Filter by an assets parent directory.'),
        'operator' => views_handler_operator_eqneq(),
      ),
      'distinct' => array(
        'name' => t('Asset: Distinct'),
        'operator' => array(
          '=' => 'is',
        ),
        'list' => array(
          'distinct' => 'distinct',
        ),
        'handler' => 'asset_views_handler_filter_distinct',
        'value-type' => 'array',
        'help' => t('This filter ensures that each asset may only be listed once, even if it matches multiple criteria.'),
      ),
    ),
  );
  return $tables;
}
function asset_views_handler_field_asset_node_link($fieldinfo, $fielddata, $value, $data) {
  $link = 'node/' . $data->nid;
  return asset_views_handler_field_asset($fieldinfo, $fielddata, $value, $data, $link);
}
function asset_views_handler_field_asset_link($fieldinfo, $fielddata, $value, $data) {
  $asset = asset_load($value);
  $link = $asset->url;
  return asset_views_handler_field_asset($fieldinfo, $fielddata, $value, $data, $link);
}
function asset_views_handler_field_asset($fieldinfo, $fielddata, $value, $data, $link = false) {
  static $formatters;
  if (!$formatters) {
    $formatters = asset_get_formatters();
  }
  $asset = asset_load($value);
  switch ($fielddata['options']) {
    case 'full':
      list($module, $format) = explode(':', asset_get_default_formatter($asset->type, $asset->extension, false));
      break;
    case 'teaser':
      list($module, $format) = explode(':', asset_get_default_formatter($asset->type, $asset->extension, true));
      break;
    default:
      list($module, $format) = explode(':', $fielddata['options']);
      $found = false;
      foreach ((array) $formatters[$asset->type][$asset->extension] as $formatter) {
        if ($formatter['module'] == $module && $formatter['format'] == $format) {
          $found = true;
          break;
        }
      }
      foreach ((array) $formatters[$asset->type]['*'] as $formatter) {
        if ($formatter['module'] == $module && $formatter['format'] == $format) {
          $found = true;
          break;
        }
      }
      foreach ((array) $formatters['*']['*'] as $formatter) {
        if ($formatter['module'] == $module && $formatter['format'] == $format) {
          $found = true;
          break;
        }
      }
      if (!$found) {
        $module = 'asset';
        $format = 'link';
      }
      break;
  }
  if ($link) {
    if ($format == 'link') {
      $html = $asset->title ? $asset->title : $asset->filename;
    }
    else {
      $html = module_invoke($module, 'asset_formatter', 'render', $asset, array(
        'format' => $format,
      ));
    }
    return l($html, $link, array(
      'html' => true,
    ));
  }
  else {
    return module_invoke($module, 'asset_formatter', 'render', $asset, array(
      'format' => $format,
    ));
  }
}
function asset_views_options_formatters() {
  $all = t('Available for all Extensions');
  $specific = t('Only available for specific Extensions');
  $options[$all]['full'] = t('Default Full-Text');
  $options[$all]['teaser'] = t('Default Teaser');
  foreach (module_implements('asset_formatter') as $module) {
    $list = module_invoke($module, 'asset_formatter', 'info');
    foreach ($list as $key => $data) {
      foreach ($data['types'] as $type => $exts) {
        if ($exts == array(
          '*',
        )) {
          $options[$all][$module . ':' . $key] = $data['name'] . ' (' . join($exts, ',') . ')';
        }
        else {
          $options[$specific][$module . ':' . $key] = $data['name'] . ' (' . join($exts, ',') . ')';
        }
      }
    }
  }
  return $options;
}
function asset_views_options_file_extensions() {
  $result = db_query('SELECT DISTINCT(extension) FROM {asset} ORDER BY extension');
  $options = array();
  while ($row = db_fetch_object($result)) {
    $options[] = $row->extension;
  }
  return drupal_map_assoc($options);
}
function asset_views_options_file_types() {
  $result = db_query('SELECT DISTINCT(type) FROM {asset} ORDER BY type');
  $options = array();
  while ($row = db_fetch_object($result)) {
    $options[] = $row->type;
  }
  return drupal_map_assoc($options);
}
function asset_views_handler_filter_distinct($op, $filter, $filterinfo, &$query) {
  if (!$query->no_distinct) {
    $query
      ->set_distinct();
    $query
      ->add_groupby('asset_node.aid');
  }
}