Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save deepagupta/2362289 to your computer and use it in GitHub Desktop.
Save deepagupta/2362289 to your computer and use it in GitHub Desktop.
search for tags at search_hooks.php at mod/search (core plugin of elgg)
<?php
/** copied a part of code: /mod/search/search_hooks.php
* Return default results for searches on tags.
*
* @param unknown_type $hook
* @param unknown_type $type
* @param unknown_type $value
* @param unknown_type $params
* @return unknown_type
*/
function search_tags_hook($hook, $type, $value, $params) {
$db_prefix = elgg_get_config('dbprefix');
$valid_tag_names = elgg_get_registered_tag_metadata_names();
// @todo will need to split this up to support searching multiple tags at once.
$query = sanitise_string($params['query']);
// if passed a tag metadata name, only search on that tag name.
// tag_name isn't included in the params because it's specific to
// tag searches.
if ($tag_names = get_input('tag_names')) {
if (is_array($tag_names)) {
$search_tag_names = $tag_names;
} else {
$search_tag_names = array($tag_names);
}
// check these are valid to avoid arbitrary metadata searches.
foreach ($search_tag_names as $i => $tag_name) {
if (!in_array($tag_name, $valid_tag_names)) {
unset($search_tag_names[$i]);
}
}
} else {
$search_tag_names = $valid_tag_names;
}
if (!$search_tag_names) {
return array('entities' => array(), 'count' => $count);
}
// don't use elgg_get_entities_from_metadata() here because of
// performance issues. since we don't care what matches at this point
// use an IN clause to grab everything that matches at once and sort
// out the matches later.
$params['joins'][] = "JOIN {$db_prefix}metadata md on e.guid = md.entity_guid";
$params['joins'][] = "JOIN {$db_prefix}metastrings msn on md.name_id = msn.id";
$params['joins'][] = "JOIN {$db_prefix}metastrings msv on md.value_id = msv.id";
$access = get_access_sql_suffix('md');
$sanitised_tags = array();
foreach ($search_tag_names as $tag) {
$sanitised_tags[] = '"' . sanitise_string($tag) . '"';
}
$tags_in = implode(',', $sanitised_tags);
$params['wheres'][] = "(msn.string IN ($tags_in) AND msv.string = '$query' AND $access)";
$params['count'] = TRUE;
$count = elgg_get_entities($params);
// no need to continue if nothing here.
if (!$count) {
return array('entities' => array(), 'count' => $count);
}
$params['count'] = FALSE;
$entities = elgg_get_entities($params);
// add the volatile data for why these entities have been returned.
foreach ($entities as $entity) {
$matched_tags_strs = array();
// get tags for each tag name requested to find which ones matched.
foreach ($search_tag_names as $tag_name) {
$tags = $entity->getTags($tag_name);
// @todo make one long tag string and run this through the highlight
// function. This might be confusing as it could chop off
// the tag labels.
if (in_array(strtolower($query), array_map('strtolower', $tags))) {
if (is_array($tags)) {
$tag_name_str = elgg_echo("tag_names:$tag_name");
$matched_tags_strs[] = "$tag_name_str: " . implode(', ', $tags);
}
}
}
// different entities have different titles
switch($entity->type) {
case 'site':
case 'user':
case 'group':
$title_tmp = $entity->name;
break;
case 'object':
$title_tmp = $entity->title;
break;
}
// Nick told me my idea was dirty, so I'm hard coding the numbers.
$title_tmp = strip_tags($title_tmp);
if (elgg_strlen($title_tmp) > 297) {
$title_str = elgg_substr($title_tmp, 0, 297) . '...';
} else {
$title_str = $title_tmp;
}
$desc_tmp = strip_tags($entity->description);
if (elgg_strlen($desc_tmp) > 297) {
$desc_str = elgg_substr($desc_tmp, 0, 297) . '...';
} else {
$desc_str = $desc_tmp;
}
$tags_str = implode('. ', $matched_tags_strs);
$tags_str = search_get_highlighted_relevant_substrings($tags_str, $params['query']);
$entity->setVolatileData('search_matched_title', $title_str);
$entity->setVolatileData('search_matched_description', $desc_str);
$entity->setVolatileData('search_matched_extra', $tags_str);
}
return array(
'entities' => $entities,
'count' => $count,
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment