Newer
Older
Earl Miles
committed
<?php
// $Id$
/**
* @defgroup views_field_handlers Views' field handlers
* @{
* Handlers to tell Views how to build and display fields.
*
*/
/**
* Base field handler that has no options and renders an unformatted field.
*
* Definition terms:
* - additional fields: An array of fields that should be added to the query
* for some purpose. The array is in the form of:
* array('identifier' => array('table' => tablename,
* 'field' => fieldname); as many fields as are necessary
* may be in this array.
* - click sortable: If TRUE, this field may be click sorted.
*/
class views_handler_field extends views_handler {
var $field_alias = 'unknown';
Earl Miles
committed
/**
* Construct a new field handler.
*/
function construct() {
parent::construct();
$this->additional_fields = array();
if (!empty($this->definition['additional fields'])) {
$this->additional_fields = $this->definition['additional fields'];
}
if (!isset($this->options['exclude'])) {
$this->options['exclude'] = '';
}
}
Earl Miles
committed
/**
* Determine if this field can allow advanced rendering.
*
* Fields can set this to FALSE if they do not wish to allow
* token based rewriting or link-making.
*/
function allow_advanced_render() {
return TRUE;
}
Earl Miles
committed
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
function init(&$view, $options) {
parent::init($view, $options);
$this->options += array(
'exclude' => FALSE,
);
}
/**
* Called to add the field to a query.
*/
function query() {
$this->ensure_my_table();
// Add the field.
$this->field_alias = $this->query->add_field($this->table_alias, $this->real_field);
$this->add_additional_fields();
}
/**
* Add 'additional' fields to the query.
*
* @param $fields
* An array of fields. The key is an identifier used to later find the
* field alias used. The value is either a string in which case it's
* assumed to be a field on this handler's table; or it's an array in the
* form of
* @code array('table' => $tablename, 'field' => $fieldname) @endcode
*/
function add_additional_fields($fields = NULL) {
if (!isset($fields)) {
// notice check
if (empty($this->additional_fields)) {
return;
}
$fields = $this->additional_fields;
}
if (!empty($fields) && is_array($fields)) {
foreach ($fields as $identifier => $info) {
if (is_array($info)) {
if (isset($info['table'])) {
$table_alias = $this->query->ensure_table($info['table'], $this->relationship);
}
else {
$table_alias = $this->table_alias;
}
$this->aliases[$identifier] = $this->query->add_field($table_alias, $info['field']);
}
else {
$this->aliases[$info] = $this->query->add_field($this->table_alias, $info);
}
}
}
}
/**
* Called to determine what to tell the clicksorter.
*/
function click_sort($order) {
$this->query->add_orderby($this->table, $this->field, $order, $this->field_alias);
}
/**
* Determine if this field is click sortable.
*/
function click_sortable() {
return !empty($this->definition['click sortable']);
}
/**
* Get this field's label.
*/
function label() {
if (!isset($this->options['label'])) {
return '';
}
return $this->options['label'];
}
/**
* Return DIV or SPAN based upon the field's element type.
*/
function element_type() {
if (isset($this->definition['element type'])) {
return $this->definition['element type'];
}
return 'span';
}
Earl Miles
committed
function option_definition() {
$options = parent::option_definition();
$options['label'] = array('default' => $this->definition['title'], 'translatable' => TRUE);
Earl Miles
committed
$options['alter'] = array(
'contains' => array(
'alter_text' => array('default' => FALSE),
'text' => array('default' => '', 'translatable' => TRUE),
'make_link' => array('default' => FALSE),
'path' => array('default' => '', 'translatable' => TRUE),
'alt' => array('default' => '', 'translatable' => TRUE),
'link_class' => array('default' => ''),
Earl Miles
committed
'prefix' => array('default' => '', 'translatable' => TRUE),
'suffix' => array('default' => '', 'translatable' => TRUE),
'target' => array('default' => '', 'translatable' => TRUE),
Earl Miles
committed
'trim' => array('default' => FALSE),
'max_length' => array('default' => ''),
'word_boundary' => array('default' => TRUE),
'ellipsis' => array('default' => TRUE),
'strip_tags' => array('default' => FALSE),
Earl Miles
committed
'html' => array('default' => FALSE),
),
);
Earl Miles
committed
$options['empty'] = array('default' => '', 'translatable' => TRUE);
$options['hide_empty'] = array('default' => FALSE);
$options['empty_zero'] = array('default' => FALSE);
Earl Miles
committed
return $options;
}
/**
* Default options form that provides the label widget that all fields
* should have.
*/
function options_form(&$form, &$form_state) {
$form['label'] = array(
'#type' => 'textfield',
'#title' => t('Label'),
'#default_value' => isset($this->options['label']) ? $this->options['label'] : '',
'#description' => t('The label for this field that will be displayed to end users if the style requires it.'),
);
$form['exclude'] = array(
'#type' => 'checkbox',
'#title' => t('Exclude from display'),
'#default_value' => $this->options['exclude'],
'#description' => t('Check this box to not display this field, but still load it in the view. Use this option to not show a grouping field in each record, or when doing advanced theming.'),
);
Earl Miles
committed
if ($this->allow_advanced_render()) {
$form['alter']['#tree'] = TRUE;
$form['alter']['alter_text'] = array(
'#type' => 'checkbox',
'#title' => t('Rewrite the output of this field'),
'#description' => t('If checked, you can alter the output of this field by specifying a string of text with replacement tokens that can use any existing field output.'),
'#default_value' => $this->options['alter']['alter_text'],
);
$form['alter']['text'] = array(
'#title' => t('Text'),
Earl Miles
committed
'#type' => 'textarea',
Earl Miles
committed
'#default_value' => $this->options['alter']['text'],
'#description' => t('The text to display for this field. You may include HTML. You may enter data from this view as per the "Replacement patterns" below.'),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-alter-text' => array(1)
),
);
$form['alter']['make_link'] = array(
'#type' => 'checkbox',
'#title' => t('Output this field as a link'),
'#description' => t('If checked, this field will be made into a link. The destination must be given below.'),
'#default_value' => $this->options['alter']['make_link'],
);
$form['alter']['path'] = array(
'#title' => t('Link path'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['path'],
'#description' => t('The Drupal path or absolute URL for this link. You may enter data from this view as per the "Replacement patterns" below.'),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1)
),
);
$form['alter']['link_class'] = array(
'#title' => t('Link class'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['link_class'],
'#description' => t('The CSS class to apply to the link.'),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1)
),
);
Earl Miles
committed
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
$form['alter']['alt'] = array(
'#title' => t('Alt text'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['alt'],
'#description' => t('Text to place as "alt" text which most browsers display as a tooltip when hovering over the link.'),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1)
),
);
$form['alter']['prefix'] = array(
'#title' => t('Prefix text'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['prefix'],
'#description' => t('Any text to display before this link. You may include HTML.'),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1)
),
);
$form['alter']['suffix'] = array(
'#title' => t('Suffix text'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['suffix'],
'#description' => t('Any text to display after this link. You may include HTML.'),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1)
),
);
$form['alter']['target'] = array(
'#title' => t('Target'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['target'],
'#description' => t("Target of the link, such as _blank, _parent or an iframe's name. This field is rarely used."),
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1)
),
);
Earl Miles
committed
// Get a list of the available fields and arguments for token replacement.
$options = array();
foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) {
$options[t('Fields')]["[$field]"] = $handler->ui_name();
// We only use fields up to (and including) this one.
if ($field == $this->options['id']) {
break;
}
}
$count = 0; // This lets us prepare the key as we want it printed.
foreach ($this->view->display_handler->get_handlers('argument') as $arg => $handler) {
$options[t('Arguments')]['%' . ++$count] = t('@argument title', array('@argument' => $handler->ui_name()));
$options[t('Arguments')]['!' . $count] = t('@argument input', array('@argument' => $handler->ui_name()));
Earl Miles
committed
}
$this->document_self_tokens($options[t('Fields')]);
Earl Miles
committed
// Default text.
$output = t('<p>You must add some additional fields to this display before using this field. These fields may be marked as <em>Exclude from display</em> if you prefer. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.</p>');
// We have some options, so make a list.
if (!empty($options)) {
$output = t('<p>The following substitution patterns are available for this display. Use the pattern shown on the left to display the value indicated on the right. Note that due to rendering order, you cannot use fields that come after this field; if you need a field not listed here, rearrange your fields.</p>');
foreach (array_keys($options) as $type) {
if (!empty($options[$type])) {
$items = array();
foreach ($options[$type] as $key => $value) {
$items[] = $key . ' == ' . $value;
Earl Miles
committed
}
$output .= theme('item_list', $items, $type);
Earl Miles
committed
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
}
}
}
// This construct uses 'hidden' and not markup because process doesn't
// run. It also has an extra div because the dependency wants to hide
// the parent in situations like this, so we need a second div to
// make this work.
$form['alter']['help'] = array(
'#type' => 'hidden',
'#id' => 'views-tokens-help',
'#prefix' => '<div><fieldset id="views-tokens-help"><legend>' . t('Replacement patterns') . '</legend>' . $output . '</fieldset></div>',
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-make-link' => array(1),
'edit-options-alter-alter-text' => array(1),
),
);
$form['alter']['trim'] = array(
'#type' => 'checkbox',
'#title' => t('Trim this field to a maximum length'),
'#description' => t('If checked, this field be trimmed to a maximum length in characters.'),
'#default_value' => $this->options['alter']['trim'],
);
$form['alter']['max_length'] = array(
'#title' => t('Maximum length'),
'#type' => 'textfield',
'#default_value' => $this->options['alter']['max_length'],
'#description' => t('The maximum number of characters this field can be.'),
Earl Miles
committed
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-trim' => array(1)
),
);
$form['alter']['word_boundary'] = array(
'#type' => 'checkbox',
'#title' => t('Trim only on a word boundary'),
'#description' => t('If checked, this field be trimmed only on a word boundary. This is guaranteed to be the maximum characters stated or less. If there are no word boundaries this could trim a field to nothing.'),
'#default_value' => $this->options['alter']['word_boundary'],
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-trim' => array(1)
),
);
$form['alter']['ellipsis'] = array(
'#type' => 'checkbox',
'#title' => t('Add an ellipsis'),
'#description' => t('If checked, a "..." will be added if a field was trimmed.'),
'#default_value' => $this->options['alter']['ellipsis'],
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-trim' => array(1)
),
);
$form['alter']['strip_tags'] = array(
'#type' => 'checkbox',
'#title' => t('Strip HTML tags'),
'#description' => t('If checked, all HTML tags will be stripped.'),
'#default_value' => $this->options['alter']['strip_tags'],
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-trim' => array(1)
),
);
Earl Miles
committed
$form['alter']['html'] = array(
'#type' => 'checkbox',
'#title' => t('Field can contain HTML'),
'#description' => t('If checked, HTML corrector will be run to ensure tags are properly closed after trimming.'),
'#default_value' => $this->options['alter']['html'],
'#process' => array('views_process_dependency'),
'#dependency' => array(
'edit-options-alter-trim' => array(1)
),
);
}
Earl Miles
committed
$form['empty'] = array(
'#type' => 'textfield',
'#title' => t('Empty text'),
'#default_value' => $this->options['empty'],
'#description' => t('If the field is empty, display this text instead.'),
);
$form['empty_zero'] = array(
'#type' => 'checkbox',
'#title' => t('Count the number 0 as empty'),
'#default_value' => $this->options['empty_zero'],
'#description' => t('If the field contains the number zero, display the empty text instead'),
);
$form['hide_empty'] = array(
'#type' => 'checkbox',
'#title' => t('Hide if empty'),
'#default_value' => $this->options['hide_empty'],
'#description' => t('Do not display anything for this field if it is empty. Note that the field label may still be displayed. Check style or row style settings to hide labels for empty fields.'),
);
Earl Miles
committed
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
}
/**
* Provide extra data to the administration form
*/
function admin_summary() {
return $this->label();
}
/**
* Run before any fields are rendered.
*
* This gives the handlers some time to set up before any handler has
* been rendered.
*
* @param $values
* An array of all objects returned from the query.
*/
function pre_render($values) { }
/**
* Render the field.
*
* @param $values
* The values retrieved from the database.
*/
function render($values) {
$value = $values->{$this->field_alias};
return check_plain($value);
}
Earl Miles
committed
/**
* Render a field using advanced settings.
*
* This renders a field normally, then decides if render-as-link and
* text-replacement rendering is necessary.
*/
function advanced_render($values) {
if ($this->allow_advanced_render() && method_exists($this, 'render_item')) {
$raw_items = $this->get_items($values);
}
else {
$this->last_render = $value = $this->render($values);
$this->original_value = $value;
}
Earl Miles
committed
if ($this->allow_advanced_render()) {
$tokens = NULL;
if (method_exists($this, 'render_item')) {
$items = array();
foreach ($raw_items as $count => $item) {
$this->last_render = $this->render_item($count, $item);
$this->original_value = $this->last_render;
$alter = $item + $this->options['alter'];
$items[] = $this->render_text($alter);
}
Earl Miles
committed
$value = $this->render_items($items);
}
else {
$value = $this->render_text($this->options['alter']);
Earl Miles
committed
}
// This happens here so that render_as_link can get the unaltered value of
// this field as a token rather than the altered value.
$this->last_render = $value;
}
Earl Miles
committed
Derek Wright
committed
if (empty($this->last_render)) {
if ($this->last_render !== 0 || !empty($this->options['empty_zero'])) {
Earl Miles
committed
$this->last_render = $this->options['empty'];
}
}
Earl Miles
committed
return $this->last_render;
}
/**
* Perform an advanced text render for the item.
*
* This is separated out as some fields may render lists, and this allows
* each item to be handled individually.
*/
function render_text($alter) {
$value = $this->last_render;
Earl Miles
committed
if ($this->options['hide_empty'] && empty($value) && ($value !== 0 || $this->options['empty_zero'])) {
return '';
}
Earl Miles
committed
if (!empty($alter['alter_text']) && $alter['text'] !== '') {
$tokens = $this->get_render_tokens($alter);
$value = $this->render_altered($alter, $tokens);
}
if (!empty($alter['trim']) && !empty($alter['max_length'])) {
$value = $this->render_trim_text($alter, $value);
}
if (!empty($alter['make_link']) && !empty($alter['path'])) {
if (!isset($tokens)) {
$tokens = $this->get_render_tokens($alter);
}
$value = $this->render_as_link($alter, $value, $tokens);
}
return $value;
}
Earl Miles
committed
/**
* Render this field as altered text, from a fieldset set by the user.
*/
function render_altered($alter, $tokens) {
Earl Miles
committed
// Filter this right away as our substitutions are already sanitized.
$value = filter_xss_admin($alter['text']);
Earl Miles
committed
$value = strtr($value, $tokens);
return $value;
}
/**
* Trim the field down to the specified length.
*/
function render_trim_text($alter, $value) {
if (!empty($alter['strip_tags'])) {
$value = strip_tags($value);
// NOTE: It's possible that some external fields might override the
// element type so if someone from, say, CCK runs into a bug here,
// this may be why =)
$this->definition['element type'] = 'span';
}
if (drupal_strlen($value) <= $alter['max_length']) {
Earl Miles
committed
return $value;
}
$value = drupal_substr($value, 0, $alter['max_length']);
Earl Miles
committed
if (!empty($alter['word_boundary'])) {
if (preg_match("/(.*)\b.+/us", $value, $matches)) {
$value = $matches[1];
Earl Miles
committed
}
}
// Remove scraps of HTML entities from the end of a strings
$value = rtrim(preg_replace('/(?:<(?!.+>)|&(?!.+;)).*$/us', '', $value));
Earl Miles
committed
if (!empty($alter['ellipsis'])) {
Earl Miles
committed
$value .= '...';
}
if (!empty($alter['html'])) {
Earl Miles
committed
$value = _filter_htmlcorrector($value);
}
return $value;
}
/**
* Render this field as a link, with the info from a fieldset set by
* the user.
*/
function render_as_link($alter, $text, $tokens) {
Earl Miles
committed
$value = '';
if (!empty($alter['prefix'])) {
$value .= filter_xss_admin(strtr($alter['prefix'], $tokens));
Earl Miles
committed
}
$options = array(
'html' => 'true',
);
// $path will be run through check_url() by l() so we do not need to
// sanitize it ourselves.
$path = $alter['path'];
// Use strip tags as there should never be HTML in the path.
// However, we need to preserve special characters like " that
// were removed by check_plain().
$path = strip_tags(html_entity_decode(strtr($path, $tokens)));
// Parse the URL and move any query and fragment parameters out of the path.
$url = parse_url($path);
if (isset($url['query'])) {
$path = strtr($path, array('?' . $url['query'] => ''));
$options['query'] = $url['query'];
}
if (isset($url['fragment'])) {
$path = strtr($path, array('#' . $url['fragment'] => ''));
$options['fragment'] = $url['fragment'];
}
$alt = strtr($alter['alt'], $tokens);
// Set the title attribute of the link only if it improves accessibility
if ($alt && $alt != $text) {
Earl Miles
committed
$options['attributes']['title'] = $alt;
}
$class = strtr($alter['link_class'], $tokens);
if ($class) {
$options['attributes']['class'] = $class;
}
$target = check_plain(trim($alter['target']));
if (!empty($target)) {
$options['attributes']['target'] = $target;
}
// If the query and fragment were programatically assigned overwrite any
// parsed values.
if (isset($alter['query'])) {
$options['query'] = strtr($alter['query'], $tokens);
Earl Miles
committed
}
if (isset($alter['fragment'])) {
$options['fragment'] = strtr($alter['fragment'], $tokens);
Earl Miles
committed
}
if (isset($this->options['alter']['language'])) {
$options['language'] = $this->options['alter']['language'];
}
Earl Miles
committed
$value .= l($text, $path, $options);
if (!empty($alter['suffix'])) {
$value .= filter_xss_admin(strtr($alter['suffix'], $tokens));
Earl Miles
committed
}
return $value;
}
/**
* Get the 'render' tokens to use for advanced rendering.
*
* This runs through all of the fields and arguments that
* are available and gets their values. This will then be
* used in one giant str_replace().
*/
function get_render_tokens($item) {
Earl Miles
committed
$tokens = array();
if (!empty($this->view->build_info['substitutions'])) {
$tokens = $this->view->build_info['substitutions'];
}
$count = 0;
foreach ($this->view->display_handler->get_handlers('argument') as $arg => $handler) {
$token = '%' . ++$count;
if (!isset($tokens[$token])) {
$tokens[$token] = '';
}
$tokens['!' . $count] = isset($this->view->args[$count - 1]) ? check_plain($this->view->args[$count - 1]) : '';
Earl Miles
committed
}
// Now add replacements for our fields.
foreach ($this->view->display_handler->get_handlers('field') as $field => $handler) {
if (isset($handler->last_render)) {
$tokens["[$field]"] = $handler->last_render;
}
else {
$tokens["[$field]"] = '';
}
// We only use fields up to (and including) this one.
if ($field == $this->options['id']) {
break;
}
$this->add_self_tokens($tokens, $item);
Earl Miles
committed
}
return $tokens;
}
/**
* Add any special tokens this field might use for itself.
*
* This method is intended to be overridden by items that generate
* fields as a list. For example, the field that displays all terms
* on a node might have tokens for the tid and the term.
*
* By convention, tokens should follow the format of [token-subtoken]
* where token is the field ID and subtoken is the field. If the
* field ID is terms, then the tokens might be [terms-tid] and [terms-name].
*/
function add_self_tokens(&$tokens, $item) { }
/**
* Document any special tokens this field might use for itself.
*
* @see add_self_tokens() for details.
*/
function document_self_tokens(&$tokens) { }
Earl Miles
committed
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
/**
* Call out to the theme() function, which probably just calls render() but
* allows sites to override output fairly easily.
*/
function theme($values) {
return theme($this->theme_functions(), $this->view, $this, $values);
}
function theme_functions() {
$themes = array();
$hook = 'views_view_field';
$display = $this->view->display[$this->view->current_display];
if (!empty($display)) {
$themes[] = $hook . '__' . $this->view->name . '__' . $display->id . '__' . $this->options['id'];
$themes[] = $hook . '__' . $this->view->name . '__' . $display->id;
$themes[] = $hook . '__' . $display->id . '__' . $this->options['id'];
$themes[] = $hook . '__' . $display->id;
if ($display->id != $display->display_plugin) {
$themes[] = $hook . '__' . $this->view->name . '__' . $display->display_plugin . '__' . $this->options['id'];
$themes[] = $hook . '__' . $this->view->name . '__' . $display->display_plugin;
$themes[] = $hook . '__' . $display->display_plugin . '__' . $this->options['id'];
$themes[] = $hook . '__' . $display->display_plugin;
}
}
$themes[] = $hook . '__' . $this->view->name . '__' . $this->options['id'];
$themes[] = $hook . '__' . $this->view->name;
Earl Miles
committed
$themes[] = $hook . '__' . $this->options['id'];
Earl Miles
committed
$themes[] = $hook;
return $themes;
}
}
/**
* A special handler to take the place of missing or broken handlers.
*/
class views_handler_field_broken extends views_handler_field {
Earl Miles
committed
return t('Broken/missing handler');
}
function ensure_my_table() { /* No table to ensure! */ }
function query() { /* No query to run */ }
function options_form(&$form, &$form_state) {
$form['markup'] = array(
'#prefix' => '<div class="form-item description">',
'#value' => t('The handler for this item is broken or missing and cannot be used. If a module provided the handler and was disabled, re-enabling the module may restore it. Otherwise, you should probably delete this item.'),
);
}
/**
* Determine if the handler is considered 'broken'
*/
function broken() { return TRUE; }
}
/**
* Render a numeric value as a size.
*/
class views_handler_field_file_size extends views_handler_field {
function option_definition() {
$options = parent::option_definition();
$options['file_size_display'] = array('default' => 'formatted');
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$form['file_size_display'] = array(
'#title' => t('File size display'),
'#type' => 'select',
'#options' => array(
'formatted' => t('Formatted (in KB or MB)'),
'bytes' => t('Raw bytes'),
),
);
}
Earl Miles
committed
function render($values) {
Earl Miles
committed
if ($values->{$this->field_alias}) {
switch ($this->options['file_size_display']) {
case 'bytes':
return $values->{$this->field_alias};
case 'formatted':
default:
return format_size($values->{$this->field_alias});
}
Earl Miles
committed
}
else {
return '';
}
Earl Miles
committed
}
}
/**
* A handler to run a field through simple XSS filtering
*/
class views_handler_field_xss extends views_handler_field {
function render($values) {
$value = $values->{$this->field_alias};
return filter_xss($value);
}
}
/**
* @}
*/