Newer
Older
The Great Git Migration
committed
<?php
// $Id$
/**
* Filter by term id
*/
class views_handler_filter_term_node_tid extends views_handler_filter_many_to_one {
function init(&$view, &$options) {
parent::init($view, $options);
// Convert legacy vid option to machine name vocabulary.
Daniel Wehner
committed
if (!empty($this->options['vid']) & empty($this->options['vocabulary'])) {
$vocabularies = taxonomy_get_vocabularies();
$vid = $this->options['vid'];
if (isset($vocabularies[$vid], $vocabularies[$vid]->machine_name)) {
$this->options['vocabulary'] = $vocabularies[$vid]->machine_name;
}
}
}
The Great Git Migration
committed
function has_extra_options() { return TRUE; }
function get_value_options() { /* don't overwrite the value options */ }
function option_definition() {
$options = parent::option_definition();
$options['type'] = array('default' => 'textfield');
$options['limit'] = array('default' => TRUE);
$options['vocabulary'] = array('default' => 0);
Daniel Wehner
committed
$options['hierarchy'] = array('default' => 0);
Earl Miles
committed
$options['error_message'] = array('default' => TRUE);
The Great Git Migration
committed
return $options;
}
function extra_options_form(&$form, &$form_state) {
$vocabularies = taxonomy_get_vocabularies();
foreach ($vocabularies as $voc) {
$options[$voc->machine_name] = check_plain($voc->name);
The Great Git Migration
committed
}
if ($this->options['limit']) {
// We only do this when the form is displayed.
The Great Git Migration
committed
if ($this->options['vid'] == 0) {
$first_vocabulary = reset($vocabularies);
$this->options['vid'] = $first_vocabulary->vid;
The Great Git Migration
committed
}
$form['vocabulary'] = array(
The Great Git Migration
committed
'#prefix' => '<div class="views-left-40">',
'#suffix' => '</div>',
'#type' => 'radios',
'#title' => t('Vocabulary'),
'#options' => $options,
'#description' => t('Select which vocabulary to show terms for in the regular options.'),
'#default_value' => $this->options['vocabulary'],
The Great Git Migration
committed
);
}
$form['markup_start'] = array(
'#markup' => '<div class="views-left-40">',
The Great Git Migration
committed
);
$form['type'] = array(
'#type' => 'radios',
'#title' => t('Selection type'),
'#options' => array('select' => t('Dropdown'), 'textfield' => t('Autocomplete')),
'#default_value' => $this->options['type'],
);
$form['hierarchy'] = array(
'#type' => 'checkbox',
'#title' => t('Show hierarchy in dropdown'),
'#default_value' => !empty($this->options['hierarchy']),
Daniel Wehner
committed
'#process' => array('form_process_checkbox', 'ctools_dependent_process'),
Daniel Wehner
committed
'#dependency' => array('radio:options[type]' => array('select')),
The Great Git Migration
committed
);
$form['markup_end'] = array(
'#markup' => '</div>',
The Great Git Migration
committed
);
}
function value_form(&$form, &$form_state) {
$vocabulary = taxonomy_vocabulary_machine_name_load($this->options['vocabulary']);
The Great Git Migration
committed
if (empty($vocabulary) && $this->options['limit']) {
$form['markup'] = array(
'#markup' => '<div class="form-item">' . t('An invalid vocabulary is selected. Please change it in the options.') . '</div>',
The Great Git Migration
committed
);
return;
}
if ($this->options['type'] == 'textfield') {
$default = '';
if ($this->value) {
$result = db_select('taxonomy_term_data', 'td')
->fields('td')
->condition('td.tid', $this->value)
->execute();
foreach ($result as $term) {
The Great Git Migration
committed
if ($default) {
$default .= ', ';
}
$default .= $term->name;
}
}
$form['value'] = array(
'#title' => $this->options['limit'] ? t('Select terms from vocabulary @voc', array('@voc' => $vocabulary->name)) : t('Select terms'),
'#type' => 'textfield',
'#default_value' => $default,
);
if ($this->options['limit']) {
$form['value']['#autocomplete_path'] = 'admin/views/ajax/autocomplete/taxonomy/' . $vocabulary->vid;
The Great Git Migration
committed
}
}
else {
if (!empty($this->options['hierarchy']) && $this->options['limit']) {
$tree = taxonomy_get_tree($vocabulary->vid);
$options = array();
if ($tree) {
foreach ($tree as $term) {
$choice = new stdClass();
$choice->option = array($term->tid => str_repeat('-', $term->depth) . $term->name);
$options[] = $choice;
}
}
}
else {
$options = array();
$query = db_select('taxonomy_term_data', 'td');
$query->innerJoin('taxonomy_vocabulary', 'tv', 'td.vid = tv.vid');
$query->fields('td');
$query->orderby('tv.weight');
$query->orderby('tv.name');
$query->orderby('td.weight');
$query->orderby('td.name');
$query->addTag('term_access');
The Great Git Migration
committed
if ($this->options['limit']) {
$query->condition('tv.machine_name', $vocabulary->machine_name);
The Great Git Migration
committed
}
$result = $query->execute();
foreach ($result as $term) {
The Great Git Migration
committed
$options[$term->tid] = $term->name;
}
}
$default_value = (array) $this->value;
if (!empty($form_state['exposed'])) {
$identifier = $this->options['expose']['identifier'];
if (!empty($this->options['expose']['reduce'])) {
$options = $this->reduce_value_options($options);
if (empty($this->options['expose']['single']) && !empty($this->options['expose']['optional'])) {
$default_value = array();
}
}
if (!empty($this->options['expose']['single'])) {
if (!empty($this->options['expose']['optional']) && (empty($default_value) || !empty($this->options['expose']['reduce']))) {
$default_value = 'All';
}
elseif (empty($default_value)) {
The Great Git Migration
committed
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
$keys = array_keys($options);
$default_value = array_shift($keys);
}
else {
$copy = $default_value;
$default_value = array_shift($copy);
}
}
}
$form['value'] = array(
'#type' => 'select',
'#title' => $this->options['limit'] ? t('Select terms from vocabulary @voc', array('@voc' => $vocabulary->name)) : t('Select terms'),
'#multiple' => TRUE,
'#options' => $options,
'#size' => min(9, count($options)),
'#default_value' => $default_value,
);
if (!empty($form_state['exposed']) && !isset($form_state['input'][$identifier])) {
$form_state['input'][$identifier] = $default_value;
}
}
if (empty($form_state['exposed'])) {
// Retain the helper option
$this->helper->options_form($form, $form_state);
}
}
function value_validate(&$form, &$form_state) {
The Great Git Migration
committed
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
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
265
266
267
268
269
270
271
272
273
274
275
276
// We only validate if they've chosen the text field style.
if ($this->options['type'] != 'textfield') {
return;
}
$values = drupal_explode_tags($form_state['values']['options']['value']);
$tids = $this->validate_term_strings($form['value'], $values);
if ($tids) {
$form_state['values']['options']['value'] = $tids;
}
}
function accept_exposed_input($input) {
if (empty($this->options['exposed'])) {
return TRUE;
}
// If it's optional and there's no value don't bother filtering.
if ($this->options['expose']['optional'] && empty($this->validated_exposed_input)) {
return FALSE;
}
$rc = parent::accept_exposed_input($input);
if ($rc) {
// If we have previously validated input, override.
if (isset($this->validated_exposed_input)) {
$this->value = $this->validated_exposed_input;
}
}
return $rc;
}
function exposed_validate(&$form, &$form_state) {
if (empty($this->options['exposed'])) {
return;
}
$identifier = $this->options['expose']['identifier'];
// We only validate if they've chosen the text field style.
if ($this->options['type'] != 'textfield') {
if ($form_state['values'][$identifier] != 'All') {
$this->validated_exposed_input = (array) $form_state['values'][$identifier];
}
return;
}
if (empty($this->options['expose']['identifier'])) {
return;
}
$values = drupal_explode_tags($form_state['values'][$identifier]);
$tids = $this->validate_term_strings($form[$identifier], $values);
if ($tids) {
$this->validated_exposed_input = $tids;
}
}
/**
* Validate the user string. Since this can come from either the form
* or the exposed filter, this is abstracted out a bit so it can
* handle the multiple input sources.
*/
function validate_term_strings(&$form, $values) {
if (empty($values)) {
return array();
}
$tids = array();
$placeholders = array();
$args = array();
$results = array();
foreach ($values as $value) {
$missing[strtolower($value)] = TRUE;
$names[] = $value;
The Great Git Migration
committed
}
if (!$names) {
The Great Git Migration
committed
return;
}
$query = db_select('taxonomy_term_data', 'td');
$query->innerJoin('taxonomy_vocabulary', 'tv', 'td.vid = tv.vid');
$query->fields('td');
$query->condition('td.name', $names);
$query->condition('tv.machine_name', $this->options['vocabulary']);
$query->addTag('term_access');
$result = $query->execute();
foreach ($result as $term) {
The Great Git Migration
committed
unset($missing[strtolower($term->name)]);
$tids[] = $term->tid;
}
Earl Miles
committed
if ($missing && !empty($this->options['error_message'])) {
The Great Git Migration
committed
form_error($form, format_plural(count($missing), 'Unable to find term: @terms', 'Unable to find terms: @terms', array('@terms' => implode(', ', array_keys($missing)))));
}
Earl Miles
committed
elseif ($missing && empty($this->options['error_message'])) {
$tids = array(0);
}
The Great Git Migration
committed
return $tids;
}
function value_submit($form, &$form_state) {
// prevent array_filter from messing up our arrays in parent submit.
}
function expose_form_right(&$form, &$form_state) {
parent::expose_form_right($form, $form_state);
if ($this->options['type'] != 'select') {
unset($form['expose']['reduce']);
}
Earl Miles
committed
$form['error_message'] = array(
'#type' => 'checkbox',
'#title' => t('Display error message'),
'#default_value' => !empty($this->options['error_message']),
);
The Great Git Migration
committed
}
function admin_summary() {
// set up $this->value_options for the parent summary
$this->value_options = array();
if ($this->value) {
$result = db_select('taxonomy_term_data', 'td')
->fields('td')
->condition('td.tid', $this->value)
->execute();
foreach ($result as $term) {
The Great Git Migration
committed
$this->value_options[$term->tid] = $term->name;
}
}
return parent::admin_summary();
}
}