annotate sites/all/modules/views/handlers/views_handler_argument_string.inc @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Definition of views_handler_argument_string.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Basic argument handler to implement string arguments that may have length
danielebarchiesi@0 10 * limits.
danielebarchiesi@0 11 *
danielebarchiesi@0 12 * @ingroup views_argument_handlers
danielebarchiesi@0 13 */
danielebarchiesi@0 14 class views_handler_argument_string extends views_handler_argument {
danielebarchiesi@0 15 function init(&$view, &$options) {
danielebarchiesi@0 16 parent::init($view, $options);
danielebarchiesi@0 17 if (!empty($this->definition['many to one'])) {
danielebarchiesi@0 18 $this->helper = new views_many_to_one_helper($this);
danielebarchiesi@0 19
danielebarchiesi@0 20 // Ensure defaults for these, during summaries and stuff:
danielebarchiesi@0 21 $this->operator = 'or';
danielebarchiesi@0 22 $this->value = array();
danielebarchiesi@0 23 }
danielebarchiesi@0 24 }
danielebarchiesi@0 25
danielebarchiesi@0 26 function option_definition() {
danielebarchiesi@0 27 $options = parent::option_definition();
danielebarchiesi@0 28
danielebarchiesi@0 29 $options['glossary'] = array('default' => FALSE, 'bool' => TRUE);
danielebarchiesi@0 30 $options['limit'] = array('default' => 0);
danielebarchiesi@0 31 $options['case'] = array('default' => 'none');
danielebarchiesi@0 32 $options['path_case'] = array('default' => 'none');
danielebarchiesi@0 33 $options['transform_dash'] = array('default' => FALSE, 'bool' => TRUE);
danielebarchiesi@0 34 $options['break_phrase'] = array('default' => FALSE, 'bool' => TRUE);
danielebarchiesi@0 35
danielebarchiesi@0 36 if (!empty($this->definition['many to one'])) {
danielebarchiesi@0 37 $options['add_table'] = array('default' => FALSE, 'bool' => TRUE);
danielebarchiesi@0 38 $options['require_value'] = array('default' => FALSE, 'bool' => TRUE);
danielebarchiesi@0 39 }
danielebarchiesi@0 40
danielebarchiesi@0 41 return $options;
danielebarchiesi@0 42 }
danielebarchiesi@0 43
danielebarchiesi@0 44 function options_form(&$form, &$form_state) {
danielebarchiesi@0 45 parent::options_form($form, $form_state);
danielebarchiesi@0 46
danielebarchiesi@0 47 $form['glossary'] = array(
danielebarchiesi@0 48 '#type' => 'checkbox',
danielebarchiesi@0 49 '#title' => t('Glossary mode'),
danielebarchiesi@0 50 '#description' => t('Glossary mode applies a limit to the number of characters used in the filter value, which allows the summary view to act as a glossary.'),
danielebarchiesi@0 51 '#default_value' => $this->options['glossary'],
danielebarchiesi@0 52 '#fieldset' => 'more',
danielebarchiesi@0 53 );
danielebarchiesi@0 54
danielebarchiesi@0 55 $form['limit'] = array(
danielebarchiesi@0 56 '#type' => 'textfield',
danielebarchiesi@0 57 '#title' => t('Character limit'),
danielebarchiesi@0 58 '#description' => t('How many characters of the filter value to filter against. If set to 1, all fields starting with the first letter in the filter value would be matched.'),
danielebarchiesi@0 59 '#default_value' => $this->options['limit'],
danielebarchiesi@0 60 '#dependency' => array('edit-options-glossary' => array(TRUE)),
danielebarchiesi@0 61 '#fieldset' => 'more',
danielebarchiesi@0 62 );
danielebarchiesi@0 63
danielebarchiesi@0 64 $form['case'] = array(
danielebarchiesi@0 65 '#type' => 'select',
danielebarchiesi@0 66 '#title' => t('Case'),
danielebarchiesi@0 67 '#description' => t('When printing the title and summary, how to transform the case of the filter value.'),
danielebarchiesi@0 68 '#options' => array(
danielebarchiesi@0 69 'none' => t('No transform'),
danielebarchiesi@0 70 'upper' => t('Upper case'),
danielebarchiesi@0 71 'lower' => t('Lower case'),
danielebarchiesi@0 72 'ucfirst' => t('Capitalize first letter'),
danielebarchiesi@0 73 'ucwords' => t('Capitalize each word'),
danielebarchiesi@0 74 ),
danielebarchiesi@0 75 '#default_value' => $this->options['case'],
danielebarchiesi@0 76 '#fieldset' => 'more',
danielebarchiesi@0 77 );
danielebarchiesi@0 78
danielebarchiesi@0 79 $form['path_case'] = array(
danielebarchiesi@0 80 '#type' => 'select',
danielebarchiesi@0 81 '#title' => t('Case in path'),
danielebarchiesi@0 82 '#description' => t('When printing url paths, how to transform the case of the filter value. Do not use this unless with Postgres as it uses case sensitive comparisons.'),
danielebarchiesi@0 83 '#options' => array(
danielebarchiesi@0 84 'none' => t('No transform'),
danielebarchiesi@0 85 'upper' => t('Upper case'),
danielebarchiesi@0 86 'lower' => t('Lower case'),
danielebarchiesi@0 87 'ucfirst' => t('Capitalize first letter'),
danielebarchiesi@0 88 'ucwords' => t('Capitalize each word'),
danielebarchiesi@0 89 ),
danielebarchiesi@0 90 '#default_value' => $this->options['path_case'],
danielebarchiesi@0 91 '#fieldset' => 'more',
danielebarchiesi@0 92 );
danielebarchiesi@0 93
danielebarchiesi@0 94 $form['transform_dash'] = array(
danielebarchiesi@0 95 '#type' => 'checkbox',
danielebarchiesi@0 96 '#title' => t('Transform spaces to dashes in URL'),
danielebarchiesi@0 97 '#default_value' => $this->options['transform_dash'],
danielebarchiesi@0 98 '#fieldset' => 'more',
danielebarchiesi@0 99 );
danielebarchiesi@0 100
danielebarchiesi@0 101 if (!empty($this->definition['many to one'])) {
danielebarchiesi@0 102 $form['add_table'] = array(
danielebarchiesi@0 103 '#type' => 'checkbox',
danielebarchiesi@0 104 '#title' => t('Allow multiple filter values to work together'),
danielebarchiesi@0 105 '#description' => t('If selected, multiple instances of this filter can work together, as though multiple values were supplied to the same filter. This setting is not compatible with the "Reduce duplicates" setting.'),
danielebarchiesi@0 106 '#default_value' => !empty($this->options['add_table']),
danielebarchiesi@0 107 '#fieldset' => 'more',
danielebarchiesi@0 108 );
danielebarchiesi@0 109
danielebarchiesi@0 110 $form['require_value'] = array(
danielebarchiesi@0 111 '#type' => 'checkbox',
danielebarchiesi@0 112 '#title' => t('Do not display items with no value in summary'),
danielebarchiesi@0 113 '#default_value' => !empty($this->options['require_value']),
danielebarchiesi@0 114 '#fieldset' => 'more',
danielebarchiesi@0 115 );
danielebarchiesi@0 116 }
danielebarchiesi@0 117
danielebarchiesi@0 118 // allow + for or, , for and
danielebarchiesi@0 119 $form['break_phrase'] = array(
danielebarchiesi@0 120 '#type' => 'checkbox',
danielebarchiesi@0 121 '#title' => t('Allow multiple values'),
danielebarchiesi@0 122 '#description' => t('If selected, users can enter multiple values in the form of 1+2+3 (for OR) or 1,2,3 (for AND).'),
danielebarchiesi@0 123 '#default_value' => !empty($this->options['break_phrase']),
danielebarchiesi@0 124 '#fieldset' => 'more',
danielebarchiesi@0 125 );
danielebarchiesi@0 126 }
danielebarchiesi@0 127
danielebarchiesi@0 128 /**
danielebarchiesi@0 129 * Build the summary query based on a string
danielebarchiesi@0 130 */
danielebarchiesi@0 131 function summary_query() {
danielebarchiesi@0 132 if (empty($this->definition['many to one'])) {
danielebarchiesi@0 133 $this->ensure_my_table();
danielebarchiesi@0 134 }
danielebarchiesi@0 135 else {
danielebarchiesi@0 136 $this->table_alias = $this->helper->summary_join();
danielebarchiesi@0 137 }
danielebarchiesi@0 138
danielebarchiesi@0 139 if (empty($this->options['glossary'])) {
danielebarchiesi@0 140 // Add the field.
danielebarchiesi@0 141 $this->base_alias = $this->query->add_field($this->table_alias, $this->real_field);
danielebarchiesi@0 142 $this->query->set_count_field($this->table_alias, $this->real_field);
danielebarchiesi@0 143 }
danielebarchiesi@0 144 else {
danielebarchiesi@0 145 // Add the field.
danielebarchiesi@0 146 $formula = $this->get_formula();
danielebarchiesi@0 147 $this->base_alias = $this->query->add_field(NULL, $formula, $this->field . '_truncated');
danielebarchiesi@0 148 $this->query->set_count_field(NULL, $formula, $this->field, $this->field . '_truncated');
danielebarchiesi@0 149 }
danielebarchiesi@0 150
danielebarchiesi@0 151 $this->summary_name_field();
danielebarchiesi@0 152 return $this->summary_basics(FALSE);
danielebarchiesi@0 153 }
danielebarchiesi@0 154
danielebarchiesi@0 155 /**
danielebarchiesi@0 156 * Get the formula for this argument.
danielebarchiesi@0 157 *
danielebarchiesi@0 158 * $this->ensure_my_table() MUST have been called prior to this.
danielebarchiesi@0 159 */
danielebarchiesi@0 160 function get_formula() {
danielebarchiesi@0 161 return "SUBSTRING($this->table_alias.$this->real_field, 1, " . intval($this->options['limit']) . ")";
danielebarchiesi@0 162 }
danielebarchiesi@0 163
danielebarchiesi@0 164 /**
danielebarchiesi@0 165 * Build the query based upon the formula
danielebarchiesi@0 166 */
danielebarchiesi@0 167 function query($group_by = FALSE) {
danielebarchiesi@0 168 $argument = $this->argument;
danielebarchiesi@0 169 if (!empty($this->options['transform_dash'])) {
danielebarchiesi@0 170 $argument = strtr($argument, '-', ' ');
danielebarchiesi@0 171 }
danielebarchiesi@0 172
danielebarchiesi@0 173 if (!empty($this->options['break_phrase'])) {
danielebarchiesi@0 174 views_break_phrase_string($argument, $this);
danielebarchiesi@0 175 }
danielebarchiesi@0 176 else {
danielebarchiesi@0 177 $this->value = array($argument);
danielebarchiesi@0 178 $this->operator = 'or';
danielebarchiesi@0 179 }
danielebarchiesi@0 180
danielebarchiesi@0 181 if (!empty($this->definition['many to one'])) {
danielebarchiesi@0 182 if (!empty($this->options['glossary'])) {
danielebarchiesi@0 183 $this->helper->formula = TRUE;
danielebarchiesi@0 184 }
danielebarchiesi@0 185 $this->helper->ensure_my_table();
danielebarchiesi@0 186 $this->helper->add_filter();
danielebarchiesi@0 187 return;
danielebarchiesi@0 188 }
danielebarchiesi@0 189
danielebarchiesi@0 190 $this->ensure_my_table();
danielebarchiesi@0 191 $formula = FALSE;
danielebarchiesi@0 192 if (empty($this->options['glossary'])) {
danielebarchiesi@0 193 $field = "$this->table_alias.$this->real_field";
danielebarchiesi@0 194 }
danielebarchiesi@0 195 else {
danielebarchiesi@0 196 $formula = TRUE;
danielebarchiesi@0 197 $field = $this->get_formula();
danielebarchiesi@0 198 }
danielebarchiesi@0 199
danielebarchiesi@0 200 if (count($this->value) > 1) {
danielebarchiesi@0 201 $operator = 'IN';
danielebarchiesi@0 202 $argument = $this->value;
danielebarchiesi@0 203 }
danielebarchiesi@0 204 else {
danielebarchiesi@0 205 $operator = '=';
danielebarchiesi@0 206 }
danielebarchiesi@0 207
danielebarchiesi@0 208 if ($formula) {
danielebarchiesi@0 209 $placeholder = $this->placeholder();
danielebarchiesi@0 210 if ($operator == 'IN') {
danielebarchiesi@0 211 $field .= " IN($placeholder)";
danielebarchiesi@0 212 }
danielebarchiesi@0 213 else {
danielebarchiesi@0 214 $field .= ' = ' . $placeholder;
danielebarchiesi@0 215 }
danielebarchiesi@0 216 $placeholders = array(
danielebarchiesi@0 217 $placeholder => $argument,
danielebarchiesi@0 218 );
danielebarchiesi@0 219 $this->query->add_where_expression(0, $field, $placeholders);
danielebarchiesi@0 220 }
danielebarchiesi@0 221 else {
danielebarchiesi@0 222 $this->query->add_where(0, $field, $argument, $operator);
danielebarchiesi@0 223 }
danielebarchiesi@0 224 }
danielebarchiesi@0 225
danielebarchiesi@0 226 function summary_argument($data) {
danielebarchiesi@0 227 $value = $this->case_transform($data->{$this->base_alias}, $this->options['path_case']);
danielebarchiesi@0 228 if (!empty($this->options['transform_dash'])) {
danielebarchiesi@0 229 $value = strtr($value, ' ', '-');
danielebarchiesi@0 230 }
danielebarchiesi@0 231 return $value;
danielebarchiesi@0 232 }
danielebarchiesi@0 233
danielebarchiesi@0 234 function get_sort_name() {
danielebarchiesi@0 235 return t('Alphabetical', array(), array('context' => 'Sort order'));
danielebarchiesi@0 236 }
danielebarchiesi@0 237
danielebarchiesi@0 238 function title() {
danielebarchiesi@0 239 $this->argument = $this->case_transform($this->argument, $this->options['case']);
danielebarchiesi@0 240 if (!empty($this->options['transform_dash'])) {
danielebarchiesi@0 241 $this->argument = strtr($this->argument, '-', ' ');
danielebarchiesi@0 242 }
danielebarchiesi@0 243
danielebarchiesi@0 244 if (!empty($this->options['break_phrase'])) {
danielebarchiesi@0 245 views_break_phrase_string($this->argument, $this);
danielebarchiesi@0 246 }
danielebarchiesi@0 247 else {
danielebarchiesi@0 248 $this->value = array($this->argument);
danielebarchiesi@0 249 $this->operator = 'or';
danielebarchiesi@0 250 }
danielebarchiesi@0 251
danielebarchiesi@0 252 if (empty($this->value)) {
danielebarchiesi@0 253 return !empty($this->definition['empty field name']) ? $this->definition['empty field name'] : t('Uncategorized');
danielebarchiesi@0 254 }
danielebarchiesi@0 255
danielebarchiesi@0 256 if ($this->value === array(-1)) {
danielebarchiesi@0 257 return !empty($this->definition['invalid input']) ? $this->definition['invalid input'] : t('Invalid input');
danielebarchiesi@0 258 }
danielebarchiesi@0 259
danielebarchiesi@0 260 return implode($this->operator == 'or' ? ' + ' : ', ', $this->title_query());
danielebarchiesi@0 261 }
danielebarchiesi@0 262
danielebarchiesi@0 263 /**
danielebarchiesi@0 264 * Override for specific title lookups.
danielebarchiesi@0 265 */
danielebarchiesi@0 266 function title_query() {
danielebarchiesi@0 267 return drupal_map_assoc($this->value, 'check_plain');
danielebarchiesi@0 268 }
danielebarchiesi@0 269
danielebarchiesi@0 270 function summary_name($data) {
danielebarchiesi@0 271 return $this->case_transform(parent::summary_name($data), $this->options['case']);
danielebarchiesi@0 272 }
danielebarchiesi@0 273
danielebarchiesi@0 274 }