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