annotate views_calc_field_handler.inc @ 3:5635080385bd tip

Merge patch with 1.x-dev
author Franck Deroche <franck@defr.org>
date Fri, 07 Aug 2009 15:20:12 +0200
parents 0651c02e6ed7
children
rev   line source
franck@0 1 <?php
franck@0 2 // $Id: views_calc_field_handler.inc,v 1.3 2009/04/21 12:15:28 karens Exp $
franck@0 3 /**
franck@0 4 * @file
franck@0 5 * Copied from the basic 'node' field handler.
franck@0 6 */
franck@0 7
franck@0 8 /**
franck@0 9 * Field handler to provide simple renderer that allows linking to a node.
franck@0 10 */
franck@0 11 class views_calc_field_handler extends views_handler_field {
franck@0 12 /**
franck@0 13 * Constructor to provide additional field to add.
franck@0 14 */
franck@0 15 function construct() {
franck@0 16 parent::construct();
franck@0 17 $this->additional_fields['nid'] = 'nid';
franck@0 18 }
franck@0 19
franck@0 20 function option_definition() {
franck@0 21 $options = parent::option_definition();
franck@0 22 $options['link_to_node'] = array('default' => FALSE);
franck@0 23 return $options;
franck@0 24 }
franck@0 25
franck@0 26 /**
franck@0 27 * Provide link to node option
franck@0 28 */
franck@0 29 function options_form(&$form, &$form_state) {
franck@0 30 parent::options_form($form, $form_state);
franck@0 31 $form['link_to_node'] = array(
franck@0 32 '#title' => t('Link this field to its node'),
franck@0 33 '#type' => 'checkbox',
franck@0 34 '#default_value' => !empty($this->options['link_to_node']),
franck@0 35 );
franck@0 36 }
franck@0 37
franck@0 38 /**
franck@0 39 * Render whatever the data is as a link to the node.
franck@0 40 *
franck@0 41 * Data should be made XSS safe prior to calling this function.
franck@0 42 */
franck@0 43 function render_link($data, $values) {
franck@0 44 if (!empty($this->options['link_to_node'])) {
franck@0 45 return l($data, "node/" . $values->{$this->aliases['nid']}, array('html' => TRUE));
franck@0 46 }
franck@0 47 else {
franck@0 48 return $data;
franck@0 49 }
franck@0 50 }
franck@0 51
franck@0 52 /**
franck@0 53 * Find the right calculation and add it to the query as
franck@0 54 * an aliased field.
franck@0 55 */
franck@0 56 function query() {
franck@0 57 $results = _views_calc_fields();
franck@0 58 while ($calc_field = db_fetch_array($results)) {
franck@0 59 if ($this->definition['cid'] == $calc_field['cid']) {
franck@0 60 foreach (explode(',', $calc_field['tablelist']) as $table) {
franck@0 61 $this->view->query->add_table($table);
franck@0 62 }
franck@0 63 $this->view->query->add_field(NULL, "({$calc_field['calc']})", "cid". $calc_field['cid']);
franck@0 64 return;
franck@0 65 }
franck@0 66 }
franck@0 67 }
franck@0 68
franck@0 69 function pre_query() {
franck@0 70 $this->field_alias = "cid{$this->definition['cid']}";
franck@0 71 parent::pre_query();
franck@0 72 }
franck@0 73
franck@0 74 /**
franck@0 75 * Use the requested format function to render the raw alias value.
franck@0 76 */
franck@0 77 function render($values) {
franck@0 78 $field_alias = "cid{$this->definition['cid']}";
franck@0 79
franck@0 80 $value = $values->$field_alias;
franck@0 81 $formats = _views_calc_format_options();
franck@0 82 $format = $formats[$this->definition['format']];
franck@0 83 $tmp = explode(':', $format);
franck@0 84 $function = trim($tmp[0]);
franck@0 85 $vars = count($tmp) == 2 ? $tmp[1] : '';
franck@0 86 if ($function == 'custom') {
franck@0 87 $tmp = explode(':', $this->definition['custom']);
franck@0 88 $function = trim($tmp[0]);
franck@0 89 $vars = count($tmp) == 2 ? $tmp[1] : '';
franck@0 90 }
franck@0 91 if (empty($function) || $function == 'none') {
franck@0 92 $function = 'check_plain';
franck@0 93 }
franck@0 94 $raw = $function($value, $vars);
franck@0 95
franck@0 96 // This needs to be set for the $this->render_link() to work. It would
franck@0 97 // have been set in the query, if we hadn't bypassed the normal query.
franck@0 98 // TODO there may be a better way to do this.
franck@0 99 $this->aliases['nid'] = 'nid';
franck@0 100
franck@0 101 return $this->render_link($raw, $values);
franck@0 102 }
franck@0 103 }