t("Taxonomy term"),
// keyword to use for %substitution
'keyword' => 'term',
'description' => t('Restricts the argument to a taxonomy term.'),
'context' => 'panels_term_context',
'settings form' => 'panels_term_settings_form',
'settings form submit' => 'panels_term_settings_form_submit',
'title function' => 'panels_term_title',
'displays' => 'panels_term_displays',
'choose display' => 'panels_term_choose_display',
);
return $args;
}
/**
* Discover if this argument gives us the term we crave.
*/
function panels_term_context($arg = NULL, $conf = NULL, $empty = FALSE) {
// If unset it wants a generic, unfilled context.
if ($empty) {
return panels_context_create_empty('term');
}
switch ($conf['input_form']) {
case 'tid':
default:
if (!is_numeric($arg)) {
return FALSE;
}
$term = taxonomy_get_term($arg);
break;
case 'term':
$terms = taxonomy_get_term_by_name($arg);
if (count($terms) != 1) {
foreach ($terms as $potential) {
foreach ($conf['vids'] as $vid => $active) {
if ($active == 1 && $potential->vid == $vid) {
$term = $potential;
// break out of the foreaches AND the case
break 3;
}
}
}
}
$term = array_shift($terms);
break;
}
if (empty($term)) {
return FALSE;
}
if (!empty($conf['vids']) && array_filter($conf['vids']) && empty($conf['vids'][$term->vid])) {
return FALSE;
}
return panels_context_create('term', $term);
}
/**
* Settings form for the argument
*/
function panels_term_settings_form($conf) {
if (empty($conf)) {
$conf = array(
'input_form' => 'tid',
);
}
$options = array();
foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
$options[$vid] = $vocabulary->name;
}
$form['input_form'] = array(
'#title' => t('Argument type'),
'#type' => 'radios',
'#options' => array('tid' => t('Term ID'), 'term' => t('Term name')),
'#default_value' => $conf['input_form'],
'#prefix' => '
',
'#suffix' => '
',
);
$form['vids'] = array(
'#title' => t('Vocabularies'),
'#type' => 'checkboxes',
'#options' => $options,
'#description' => t('You can restrict this argument to use the checked vocabularies. Arguments from non-conforming vocabularies will be ignored, and Panels will behave as if no argument were given. Leave all unchecked to impose no restriction.'),
'#default_value' => $conf['vids'],
'#prefix' => '',
'#suffix' => '
',
);
$form['own_default'] = array(
'#title' => t('Use different default display'),
'#type' => 'checkbox',
'#description' => t('If checked, when this argument is present it will use its own display rather than the default. Vocabularies not selected in the "Own display" field will use this one.'),
'#default_value' => $conf['own_default'],
);
$form['displays'] = array(
'#title' => t('Own display'),
'#type' => 'checkboxes',
'#options' => $options,
'#default_value' => $conf['displays'],
'#description' => t('Each checked vocabulary will get its own special display to layout its content. Only vocabularies set above should be set here. Vocabularies not set here will use the default display.'),
'#prefix' => '',
'#suffix' => '
',
);
return $form;
}
/**
* There appears to be a bit of a bug with the way we're handling forms; it causes
* 'checkboxes' to get invalid values added to them when empty. This takes care
* of that.
*/
function panels_term_settings_form_submit(&$values) {
$vocs = taxonomy_get_vocabularies();
if (!empty($values['vids'])) {
foreach ($values['vids'] as $vid => $value) {
if (empty($vocs[$vid])) {
unset($values['vids'][$vid]);
}
}
}
if (!empty($values['displays'])) {
foreach ($values['displays'] as $vid => $value) {
if (empty($vocs[$vid])) {
unset($values['displays'][$vid]);
}
}
}
}
/**
* What additional displays does this argument provide?
*/
function panels_term_displays($conf, $id) {
$displays = array();
if (!empty($conf['own_default'])) {
$displays['default'] = array(
'title' => t('Taxonomy term @id Default', array('@id' => $id)),
'context' => 'term',
);
}
if (is_array($conf['displays'])) {
$options = array();
foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
$options[$vid] = $vocabulary->name;
}
foreach (array_keys(array_filter($conf['displays'])) as $vid) {
$displays[$vid] = array(
'title' => t('Taxonomy term @id @vocabulary', array('@id' => $id, '@vocabulary' => $options[$vid])),
// Tell it to base the template for this display off of the default.
'default' => 'default',
'context' => 'term',
);
}
}
return $displays;
}
/**
* Based upon the settings and the context, choose which display to use.
*/
function panels_term_choose_display($conf, $context) {
if (empty($context->data)) {
return;
}
if (!empty($conf['displays'][$context->data->vid])) {
return $context->data->vid;
}
// Please note that 'default' is a special display.
if (!empty($conf['own_default'])) {
return 'default';
}
// Empty return says to use the default display.
return;
}
/**
* Determine the title for substitution with this context
*/
function panels_term_title($context) {
if (isset($context->data->name)) {
return $context->data->name;
}
if (isset($context->page_title)) {
return $context->page_title;
}
}