Skip to content

Instantly share code, notes, and snippets.

@kevinchampion
Last active December 11, 2015 17:48
Show Gist options
  • Save kevinchampion/4637052 to your computer and use it in GitHub Desktop.
Save kevinchampion/4637052 to your computer and use it in GitHub Desktop.
Mcard autocomplete
/**
* Implementation of hook_menu().
*/
function mcard_menu() {
$items['admin/settings/mcard'] = array(
'title' => 'Mcard',
'description' => 'Adjust Mcard discount settings',
'page callback' => 'drupal_get_form',
'page arguments' => array( 'mcard_discount_settings' ),
'access arguments' => array('administer mcard discounts'),
);
$items['admin/settings/mcard/discounts'] = array(
'title' => 'Mcard discount settings',
'description' => 'Adjust Mcard discount settings',
'page callback' => 'drupal_get_form',
'page arguments' => array( 'mcard_discount_settings' ),
'access arguments' => array('administer mcard discounts'),
'weight' => -5,
);
$items['treasury/mcard/discounts'] = array(
'title' => 'Mcard Discounts',
'description' => 'Search for discounts for holders of an Mcard',
'page callback' => 'mcard_discounts_homepage',
'access arguments' => array('view mcard discounts'),
'type' => MENU_CALLBACK,
);
$items['treasury/mcard/discounts/ajax'] = array(
'title' => 'Ajax endpoint for search results',
'description' => 'Ajax requests get posted here and return search results',
'page callback' => 'mcard_search_results',
'access arguments' => array('view mcard discounts'),
'type' => MENU_CALLBACK,
);
$items['treasury/mcard/discounts-autocomplete/%'] = array(
'title' => 'Ajax autocomple endpoint for textual search',
'description' => 'Ajax requests get posted here and return autocomplete options',
'page callback' => 'mcard_search_autocomplete',
'page arguments' => array(3),
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
$items['treasury/mcard/discounts-print'] = array(
'title' => 'Mcard Discounts',
'description' => 'Print discounts from Mcard discount search',
'page callback' => 'mcard_print_discounts',
'access arguments' => array('view mcard discounts'),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* Autocomplete ajax helper to retrieve autocomplete options from textual mcard
* discount search.
*
* @param $search
* User entered search string.
*
* @return
* JSON listing of autocomplete search options.
*/
function mcard_search_autocomplete($search = '') {
$matches = $args = array();
$searchsql = '';
watchdog('mcard', 'autocomplete search query: !query !args', array('!query' => '<pre>' . print_r($search, TRUE) . '</pre>', '!args' => '<pre>' . print_r($_GET, TRUE) . '</pre>'), WATCHDOG_NOTICE);
// Generate search sql.
if($search) {
$searchfields = array("n.title" , "m.field_discount_long_description_value", "p.title", "q.body");
// Break up into words and do a LIKE %..% search on each word.
$words = explode(' ', $search);
foreach($words AS $word) {
$searchsql .= isset($searchsql) ? ") AND (" : "AND ((";
$searchsql_parts = array();
//search each field
foreach($searchfields as $searchfield) {
$searchsql_parts[] = $searchfield . " LIKE '%%%s%%'";
$args[] = drupal_strtolower($word);
}
$searchsql .= implode(" OR ", $searchsql_parts);
}
$searchsql .= ")";
}
else {
$searchsql = ')';
}
// The base get all mcard discounts query
$query = "SELECT
DISTINCT n.nid,
n.title,
n.created,
m.field_discount_long_description_value,
p.title AS p_title,
p.created,
q.body,
p.nid AS pnid
FROM {node} n
INNER JOIN {content_type_mcard_discount} m on n.vid = m.vid
INNER JOIN {node} p on m.field_discount_provider_nid = p.nid
INNER JOIN {node_revisions} q on p.vid = q.vid
WHERE (n.type = 'mcard_discount'
AND n.status = 1
" . $searchsql . "
ORDER BY p.title";
watchdog('mcard', 'discount search query: !query !args', array('!query' => '<pre>' . print_r($query, TRUE) . '</pre>', '!args' => '<pre>' . print_r($args, TRUE) . '</pre>'), WATCHDOG_NOTICE);
$result = db_query_range($query, $args, 0, 10);
$searchresultshtml = '';
$count = 0;
while ($row = db_fetch_object($result)) {
/*if ($search) {
$result = db_query_range("SELECT name FROM {users} WHERE LOWER(name) LIKE LOWER('%s%%')", $search, 0, 10); // only 10 results will show
while ($user = db_fetch_object($result)) {
$matches[$user->name] = check_plain($user->name);
}
}*/
$matches[$row->p_title] = check_plain($row->p_title);
}
drupal_json($matches); //Returns the data in JSON format
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment