diff sites/all/modules/ctools/includes/content.menu.inc @ 0:ff03f76ab3fe

initial version
author danieleb <danielebarchiesi@me.com>
date Wed, 21 Aug 2013 18:51:11 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sites/all/modules/ctools/includes/content.menu.inc	Wed Aug 21 18:51:11 2013 +0100
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Contains menu item registration for the content tool.
+ *
+ * The menu items registered are AJAX callbacks for the things like
+ * autocomplete and other tools needed by the content types.
+ */
+
+function ctools_content_menu(&$items) {
+  $base = array(
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+    'file' => 'includes/content.menu.inc',
+  );
+  $items['ctools/autocomplete/%'] = array(
+    'page callback' => 'ctools_content_autocomplete_entity',
+    'page arguments' => array(2),
+  ) + $base;
+}
+
+/**
+ * Helper function for autocompletion of entity titles.
+ */
+function ctools_content_autocomplete_entity($type, $string = '') {
+  $entity = entity_get_info($type);
+  if ($string != '') {
+    // @todo verify the query logic here, it's untested.
+    // Set up the query
+    $query = db_select($entity['base table'], 'b');
+    if ($entity['entity keys']['label']) {
+      $query->fields('b', array($entity['entity keys']['id'], $entity['entity keys']['label']))->range(0, 10);
+    }
+    else {
+      $query->fields('b', array($entity['entity keys']['id']))->range(0, 10);
+    }
+
+    $preg_matches = array();
+    $match = preg_match('/\[id: (\d+)\]/', $string, $preg_matches);
+    if (!$match) {
+      $match = preg_match('/^id: (\d+)/', $string, $preg_matches);
+    }
+    if ($match) {
+      $query->condition('b.' . $entity['entity keys']['id'], $preg_matches[1]);
+    }
+    elseif ($entity['entity keys']['label']) {
+      $query->condition('b.' . $entity['entity keys']['label'], '%' . db_like($string) . '%', 'LIKE');
+    }
+
+    $matches = array();
+    if ($type == 'node') {
+      if (!user_access('bypass node access')) {
+        // If the user is able to view their own unpublished nodes, allow them
+        // to see these in addition to published nodes.
+        if (user_access('view own unpublished content')) {
+          $query->condition(db_or()
+            ->condition('b.status', NODE_PUBLISHED)
+            ->condition('b.uid', $GLOBALS['user']->uid)
+          );
+        }
+        else {
+          // If not, restrict the query to published nodes.
+          $query->condition('b.status', NODE_PUBLISHED);
+        }
+      }
+
+      $query->addTag('node_access');
+      $query->join('users', 'u', 'b.uid = u.uid');
+      $query->addField('u', 'name', 'name');
+
+      foreach ($query->execute() as $nodeish) {
+        $name = empty($nodeish->name) ? variable_get('anonymous', t('Anonymous')) : check_plain($nodeish->name);
+        $matches[$nodeish->title . " [id: $nodeish->nid]"] = '<span class="autocomplete_title">' . check_plain($nodeish->title) . '</span> <span class="autocomplete_user">(' . t('by @user', array('@user' => $name)) . ')</span>';
+      }
+    }
+    else {
+      foreach ($query->execute() as $item) {
+        $id = $item->{$entity['entity keys']['id']};
+        if ($entity['entity keys']['label']) {
+          $matches[$item->{$entity['entity keys']['label']} . " [id: $id]"] = '<span class="autocomplete_title">' . check_plain($item->{$entity['entity keys']['label']}) . '</span>';
+        }
+        else {
+          $matches["[id: $id]"] = '<span class="autocomplete_title">' . check_plain($item->{$entity['entity keys']['id']}) . '</span>';
+        }
+      }
+    }
+    drupal_json_output($matches);
+  }
+}