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 } |