summaryrefslogtreecommitdiff
path: root/sites/all/modules/ctools/plugins/content_types/node_context/node_terms.inc
diff options
context:
space:
mode:
Diffstat (limited to 'sites/all/modules/ctools/plugins/content_types/node_context/node_terms.inc')
-rw-r--r--sites/all/modules/ctools/plugins/content_types/node_context/node_terms.inc205
1 files changed, 205 insertions, 0 deletions
diff --git a/sites/all/modules/ctools/plugins/content_types/node_context/node_terms.inc b/sites/all/modules/ctools/plugins/content_types/node_context/node_terms.inc
new file mode 100644
index 000000000..f6e7aec33
--- /dev/null
+++ b/sites/all/modules/ctools/plugins/content_types/node_context/node_terms.inc
@@ -0,0 +1,205 @@
+<?php
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+ 'single' => TRUE,
+ 'title' => t('Node terms'),
+ 'icon' => 'icon_node.png',
+ 'description' => t('Taxonomy terms of the referenced node.'),
+ 'required context' => new ctools_context_required(t('Node'), 'node'),
+ 'category' => t('Node'),
+ 'defaults' => array(
+ 'vid' => 0,
+ 'term_format' => 'term-links',
+ 'link' => TRUE,
+ 'term_delimiter' => ', ',
+ ),
+);
+
+/**
+ * Render the node_terms content type.
+ */
+function ctools_node_terms_content_type_render($subtype, $conf, $panel_args, $context) {
+ if (empty($context) || empty($context->data)) {
+ return;
+ }
+
+ // Get a shortcut to the node.
+ $node = $context->data;
+
+ // Load all terms for this node from all vocabularies
+ $query = db_select('taxonomy_index', 't');
+ $result = $query
+ ->fields('t')
+ ->condition('t.nid', $node->nid)
+ ->execute();
+
+ $tids = array();
+ foreach ($result AS $term) {
+ $tids[] = $term->tid;
+ }
+
+ // Get the real term objects
+ $term_objects = taxonomy_term_load_multiple($tids);
+
+ $terms = array();
+
+ if (empty($conf['vid'])) {
+ // All terms.
+ foreach ($term_objects AS $term) {
+ $terms['taxonomy_term_' . $term->tid] = array(
+ 'title' => check_plain($term->name),
+ 'href' => 'taxonomy/term/' . $term->tid,
+ 'attributes' => array('rel' => 'tag', 'title' => strip_tags($term->description))
+ );
+ }
+ }
+ else {
+ // They want something special and custom, we'll have to do this ourselves.
+ foreach ($term_objects as $term) {
+ if ($term->vid == $conf['vid']) {
+ if ($conf['term_format'] == 'term-links') {
+ $terms['taxonomy_term_' . $term->tid] = array(
+ 'title' => $term->name,
+ 'href' => 'taxonomy/term/' . $term->tid,
+ 'attributes' => array('rel' => 'tag', 'title' => strip_tags($term->description)),
+ );
+ }
+ elseif (empty($conf['link'])) {
+ $terms[] = check_plain($term->name);
+ }
+ else {
+ $terms[] = l($term->name, 'taxonomy/term/' . $term->tid, array('attributes' => array('rel' => 'tag', 'title' => strip_tags($term->description))));
+ }
+ }
+ }
+ }
+
+ $formatted_terms = '';
+ switch ($conf['term_format']) {
+ case 'term-links':
+ drupal_alter('link', $terms, $node);
+ $formatted_terms = theme('links', array('links' => $terms));
+ break;
+
+ case 'ul':
+ $formatted_terms = theme('item_list', array('items' => $terms));
+ break;
+
+ case 'inline-delimited':
+ $delimiter = isset($conf['term_delimiter']) ? $conf['term_delimiter'] : ', ';
+ $processed_terms = array();
+ foreach ($terms as $key => $term) {
+ if (is_string($term)) {
+ $processed_terms[$key] = $term;
+ }
+ else {
+ $terms[$key] = l($term['title'], $term['href'], $term);
+ }
+ }
+
+ $formatted_terms = implode($delimiter, $processed_terms);
+ break;
+ }
+
+ // Build the content type block.
+ $block = new stdClass();
+ $block->module = 'node_terms';
+ $block->delta = $node->nid;
+ $block->title = t('Terms');
+ $block->content = $formatted_terms;
+
+ return $block;
+}
+
+/**
+ * Returns an edit form for node terms display settings.
+ *
+ * The first question is if they want to display all terms or restrict it to a
+ * specific taxonomy vocabulary.
+ *
+ * Then, they're presented with a set of radios to find out how they want the
+ * terms formatted, which can be either be via theme('links'), a regular item
+ * list (ul), or inline with a delimiter. Depending on which radio they
+ * choose, some other settings might appear. If they're doing either the ul or
+ * inline, we ask if they want the terms to appear as links or not. If they
+ * want it inline, we ask what delimiter they want to use.
+ */
+function ctools_node_terms_content_type_edit_form($form, &$form_state) {
+ ctools_include('dependent');
+
+ $conf = $form_state['conf'];
+
+ $options = array();
+ $options[0] = t('- All vocabularies -');
+ foreach (taxonomy_get_vocabularies() as $vid => $vocabulary) {
+ $options[$vid] = $vocabulary->name;
+ }
+ $form['vid'] = array(
+ '#title' => t('Vocabulary'),
+ '#type' => 'select',
+ '#options' => $options,
+ '#default_value' => $conf['vid'],
+ '#description' => t('Optionally restrict the terms to a specific vocabulary, or allow terms from all vocabularies.'),
+ '#prefix' => '<div class="clearfix">',
+ '#suffix' => '</div>',
+ );
+
+ $form['term_format'] = array(
+ '#type' => 'radios',
+ '#title' => t('Term formatting'),
+ '#options' => array(
+ 'term-links' => t("Taxonomy links (uses theme('links'))"),
+ 'ul' => t('Unordered list'),
+ 'inline-delimited' => t('Inline, delimited'),
+ ),
+ '#default_value' => $conf['term_format'],
+ '#prefix' => '<div class="clearfix">',
+ '#suffix' => '</div>',
+ );
+
+ $form['link'] = array(
+ '#title' => t('Link to terms'),
+ '#type' => 'checkbox',
+ '#default_value' => $conf['link'],
+ '#description' => t('Check here to make the terms link to the term paths.'),
+ '#dependency' => array('radio:term_format' => array('inline-delimited', 'ul')),
+ '#prefix' => '<div class="clearfix">',
+ '#suffix' => '</div>',
+ );
+
+ $form['term_delimiter'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Term delimiter'),
+ '#default_value' => $conf['term_delimiter'],
+ '#size' => 10,
+ '#dependency' => array('radio:term_format' => array('inline-delimited')),
+ );
+ return $form;
+}
+
+/**
+ * Submit handler for the custom type settings form.
+ */
+function ctools_node_terms_content_type_edit_form_submit($form, &$form_state) {
+ // Copy everything from our defaults.
+ foreach (array_keys($form_state['plugin']['defaults']) as $key) {
+ $form_state['conf'][$key] = $form_state['values'][$key];
+ }
+}
+
+/**
+ * Returns the administrative title for a type.
+ */
+function ctools_node_terms_content_type_admin_title($subtype, $conf, $context) {
+ $placeholders['@s'] = $context->identifier;
+ if (!empty($conf['vid'])) {
+ $vocabulary = taxonomy_vocabulary_load($conf['vid']);
+ $placeholders['@vocabulary'] = $vocabulary->name;
+ return t('"@s" terms from @vocabulary', $placeholders);
+ }
+ return t('"@s" terms', $placeholders);
+}