shoutbox_tags.module in Shoutbox 7
Same filename and directory in other branches
File
shoutbox_tags/shoutbox_tags.moduleView source
<?php
/**
* Implements hook_menu().
*/
function shoutbox_tags_menu() {
return array(
'shoutbox/tag/%/js/view' => array(
'title' => 'Shout tag',
'page callback' => 'shoutbox_tags_js_view',
'page arguments' => array(
2,
),
'access arguments' => array(
'view shouts',
),
'description' => 'Javascript callback for viewing shout tags',
'type' => MENU_CALLBACK,
),
);
}
/**
* Implements hook_shoutbox().
*/
function shoutbox_tags_shoutbox($op, &$shout, &$a1 = NULL, $form_state = NULL) {
switch ($op) {
case 'insert':
// Extract the tags
if ($tags = shoutbox_tags_extract($shout)) {
// Save the tags
shoutbox_tags_save($shout, $tags);
}
break;
case 'edit':
// Delete any tags from the shout
shoutbox_tags_shoutbox('delete', $shout);
// Redetect any tags from the shout
shoutbox_tags_shoutbox('insert', $shout);
break;
case 'delete':
// Remove any tag references to this shout
db_delete('shoutbox_tags')
->condition('shout_id', $shout->shout_id)
->execute();
break;
case 'view':
// Replace tags with links
shoutbox_tags_to_links($shout);
break;
case 'context':
// If we're viewing a tag, only returned shouts that have the tag
if ($tag = shoutbox_tags_is_page()) {
$a1['shoutbox_tags'] = $tag;
}
break;
case 'js path':
// Alter the js update path so only shouts with the given
// tag are shown
if ($tag = shoutbox_tags_is_page()) {
$a1 = "shoutbox/tag/{$tag}/js/view/";
}
break;
case 'form':
// Remove the shout form if we're viewing a tag
if (shoutbox_tags_is_page()) {
$a1 = array();
}
break;
}
}
/**
* Implements hook_query_TAG_alter().
*/
function shoutbox_tags_query_shouts_alter(QueryAlterableInterface $query) {
$tag = $query
->getMetaData('shoutbox_tags');
if ($query
->hasTag('shouts') && NULL != $tag) {
$query
->join('shoutbox_tags', 't', 's.shout_id = t.shout_id');
$query
->condition('t.tag', $tag, '=');
}
}
/**
* Determine if we're viewing a shout tag page
*
* @return
* The tag, otherwise FALSE is we're not viewing a tag page
*/
function shoutbox_tags_is_page() {
if (arg(0) == 'shoutbox' && arg(1) == 'tag' && ($tag = filter_xss(arg(2)))) {
return $tag;
}
return FALSE;
}
/**
* Replace tags with links inside a shout
*
* @param &$shout
* A shout object
*/
function shoutbox_tags_to_links(&$shout) {
// Extract the tags
$tags = shoutbox_tags_extract($shout);
// Replace the links with tags
foreach ($tags as $tag) {
$shout->shout = str_replace('#' . $tag, l('#' . $tag, 'shoutbox/tag/' . strtolower($tag)), $shout->shout);
}
}
/**
* Extract tags from a shout
*
* @param $shout
* A shout object
* @return
* An array of unique tags
*/
function shoutbox_tags_extract($shout) {
$tags = array();
// Break down the shout by word
$words = explode(' ', $shout->shout);
foreach ($words as $word) {
// See if the word begins with a #
if (substr($word, 0, 1) == '#') {
// Remove the #
$word = str_replace('#', '', $word);
// Remove a trailing non alphanumeric
if (preg_match('/\\W/', substr($word, strlen($word) - 1))) {
$word = substr($word, 0, strlen($word) - 1);
}
// Store the tag
$tags[] = $word;
}
}
// Remove duplicates and return
return array_unique($tags);
}
/**
* Save a tag or tags for a given shout
*
* @param $shout
* A shout object
* @param $tags
* A single tag or array of tags. This function will not
* check for duplicate entries for the given shout.
*/
function shoutbox_tags_save($shout, $tags) {
// If a single tag is given, place it in an array
if (!is_array($tags)) {
$tags = array(
$tags,
);
}
// Save each tag
foreach ($tags as $tag) {
$record = new stdClass();
$record->shout_id = $shout->shout_id;
$record->tag = strtolower($tag);
drupal_write_record('shoutbox_tags', $record);
}
}
/**
* Javascript callback for viewing shouts for a given tag
*/
function shoutbox_tags_js_view($tag) {
// This callback is only needed to keep the
// URL like shoutbox/tag/%tag so the query gets altered
shoutbox_js_view();
}
Functions
Name | Description |
---|---|
shoutbox_tags_extract | Extract tags from a shout |
shoutbox_tags_is_page | Determine if we're viewing a shout tag page |
shoutbox_tags_js_view | Javascript callback for viewing shouts for a given tag |
shoutbox_tags_menu | Implements hook_menu(). |
shoutbox_tags_query_shouts_alter | Implements hook_query_TAG_alter(). |
shoutbox_tags_save | Save a tag or tags for a given shout |
shoutbox_tags_shoutbox | Implements hook_shoutbox(). |
shoutbox_tags_to_links | Replace tags with links inside a shout |