groups/modules/commons/commons_follow/commons_follow.module

365 lines
14 KiB
Plaintext

<?php
include_once 'commons_follow.features.inc';
/**
* Implements hook_theme().
*/
function commons_follow_theme() {
return array(
'commons_follow_otheruser_flag' => array(
'variables' => array(
'is_flagged' => NULL,
'link_text' => NULL,
'flag_wrapper_classes' => NULL,
'flag_classes' => NULL,
),
'template' => 'commons-follow-otheruser-flag',
),
);
}
/**
* Implements hook_views_default_views_alter().
*
* Adding the "Following" filter to the group-browsing-widget views.
*/
function commons_follow_views_default_views_alter(&$views) {
// Add a new views pane for events the user follows.
if (isset($views['commons_events_user_upcoming_events'])) {
$view = $views['commons_events_user_upcoming_events'];
/* Display: You follow - pane */
$handler = $view->new_display('panel_pane', 'You follow - pane', 'panel_pane_3');
$handler->display->display_options['defaults']['title'] = FALSE;
$handler->display->display_options['title'] = 'You follow';
$handler->display->display_options['defaults']['hide_admin_links'] = FALSE;
$handler->display->display_options['defaults']['style_plugin'] = FALSE;
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['defaults']['style_options'] = FALSE;
$handler->display->display_options['defaults']['row_plugin'] = FALSE;
$handler->display->display_options['row_plugin'] = 'fields';
$handler->display->display_options['row_options']['inline'] = array(
'capacity_used' => 'capacity_used',
'comment_count' => 'comment_count',
);
$handler->display->display_options['defaults']['row_options'] = FALSE;
$handler->display->display_options['defaults']['empty'] = FALSE;
$handler->display->display_options['defaults']['relationships'] = FALSE;
/* Relationship: Flags: commons_follow_node */
$handler->display->display_options['relationships']['flag_content_rel']['id'] = 'flag_content_rel';
$handler->display->display_options['relationships']['flag_content_rel']['table'] = 'node';
$handler->display->display_options['relationships']['flag_content_rel']['field'] = 'flag_content_rel';
$handler->display->display_options['relationships']['flag_content_rel']['flag'] = 'commons_follow_node';
$handler->display->display_options['defaults']['fields'] = FALSE;
/* Field: Content: Title */
$handler->display->display_options['fields']['title_field']['id'] = 'title_field';
$handler->display->display_options['fields']['title_field']['table'] = 'field_data_title_field';
$handler->display->display_options['fields']['title_field']['field'] = 'title_field';
$handler->display->display_options['fields']['title_field']['label'] = '';
$handler->display->display_options['fields']['title_field']['link_to_entity'] = 1;
/* Field: Content: Address */
$handler->display->display_options['fields']['field_address']['id'] = 'field_address';
$handler->display->display_options['fields']['field_address']['table'] = 'field_data_field_address';
$handler->display->display_options['fields']['field_address']['field'] = 'field_address';
$handler->display->display_options['fields']['field_address']['label'] = '';
$handler->display->display_options['fields']['field_address']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['field_address']['click_sort_column'] = 'country';
$handler->display->display_options['fields']['field_address']['settings'] = array(
'use_widget_handlers' => 1,
'format_handlers' => array(
'address' => 'address',
),
);
/* Field: Registration Settings: Spaces used */
$handler->display->display_options['fields']['capacity_used']['id'] = 'capacity_used';
$handler->display->display_options['fields']['capacity_used']['table'] = 'node';
$handler->display->display_options['fields']['capacity_used']['field'] = 'capacity_used';
$handler->display->display_options['fields']['capacity_used']['label'] = '';
$handler->display->display_options['fields']['capacity_used']['alter']['alter_text'] = TRUE;
$handler->display->display_options['fields']['capacity_used']['alter']['text'] = '<strong>[capacity_used]</strong> attendees,';
$handler->display->display_options['fields']['capacity_used']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['capacity_used']['separator'] = '';
/* Field: Content: Comment count */
$handler->display->display_options['fields']['comment_count']['id'] = 'comment_count';
$handler->display->display_options['fields']['comment_count']['table'] = 'node_comment_statistics';
$handler->display->display_options['fields']['comment_count']['field'] = 'comment_count';
$handler->display->display_options['fields']['comment_count']['label'] = '';
$handler->display->display_options['fields']['comment_count']['alter']['alter_text'] = TRUE;
$handler->display->display_options['fields']['comment_count']['alter']['text'] = '<strong>[comment_count]</strong> comments';
$handler->display->display_options['fields']['comment_count']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['comment_count']['separator'] = '';
$handler->display->display_options['defaults']['arguments'] = FALSE;
}
// Add a "most active" exposed sort to Commons BW views.
foreach ($views as $view_id => $view) {
if (strpos($view_id, 'commons_bw_') !== 0) {
continue;
}
$handler = $views[$view_id]->display['default']->handler;
// Relationship to the "Following" flag.
$handler->display->display_options['relationships']['flag_content_rel']['id'] = 'flag_content_rel';
$handler->display->display_options['relationships']['flag_content_rel']['table'] = 'node';
$handler->display->display_options['relationships']['flag_content_rel']['field'] = 'flag_content_rel';
$handler->display->display_options['relationships']['flag_content_rel']['ui_name'] = 'Following';
$handler->display->display_options['relationships']['flag_content_rel']['label'] = 'following';
$handler->display->display_options['relationships']['flag_content_rel']['required'] = 0;
$handler->display->display_options['relationships']['flag_content_rel']['flag'] = 'commons_follow_node';
// Exposed "Following" filter.
$handler->display->display_options['filters']['flagged']['id'] = 'flagged';
$handler->display->display_options['filters']['flagged']['table'] = 'flagging';
$handler->display->display_options['filters']['flagged']['field'] = 'flagged';
$handler->display->display_options['filters']['flagged']['relationship'] = 'flag_content_rel';
$handler->display->display_options['filters']['flagged']['ui_name'] = 'Following';
$handler->display->display_options['filters']['flagged']['value'] = '1';
$handler->display->display_options['filters']['flagged']['exposed'] = TRUE;
$handler->display->display_options['filters']['flagged']['expose']['operator_id'] = '';
$handler->display->display_options['filters']['flagged']['expose']['label'] = 'Following';
$handler->display->display_options['filters']['flagged']['expose']['operator'] = 'flagged_op';
$handler->display->display_options['filters']['flagged']['expose']['identifier'] = 'following';
$handler->display->display_options['filters']['flagged']['expose']['required'] = FALSE;
}
}
/**
* Implements hook_form_alter().
*/
function commons_follow_form_alter(&$form, &$form_state, $form_id) {
if ($form_id != 'views_exposed_form' || strpos($form['#id'],'views-exposed-form-commons-bw') !== 0 || empty($form['following'])) {
return;
}
$form['#info']['filter-flagged']['label'] = t('Limited to');
$form['following']['#options'] = array(
'All' => t('All content'),
1 => t("Content you're following"),
0 => t("Content you're not following"),
);
}
/**
* Implements hook_flag_export_alter().
*/
function commons_follow_flag_export_alter(&$flag) {
// We export $flag->types as an array in code, then dynamically change
// the values in commons_follow_flag_alter(). Prevent that from being
// overwritten with the dynamic values.
if (in_array($flag['name'], array('commons_follow_node', 'email_node'))) {
$flag['types'] = array();
}
}
/**
* Implements hook_flag_alter().
*/
function commons_follow_flag_alter(&$flag) {
$commons_entity_integrations = commons_entity_integration_info();
// Find Commons node types that should have follow integration and alter
// the commons_follow_node flag to allow following these node types.
// This is currently hard-coded to node entities and the
// commons_follow_node flag, but could be expanded to add the ability
// to follow other entities.
// The Commons follow flags for user, term and group already have the
// appropriate content types in their flag exports, whereas
// $flag->types for commons_follow_node is more likely
// to change between sites.
if (in_array($flag->name, array('commons_follow_node', 'email_node'))) {
if (!empty($commons_entity_integrations['node'])) {
// Exclude bundles that users should not be able to follow:
foreach ($commons_entity_integrations['node'] as $bundle => $options) {
if (isset($options['exclude_commons_follow']) && $options['exclude_commons_follow'] == TRUE) {
unset($commons_entity_integrations['node'][$bundle]);
}
}
// Add the remaining bundles as flaggable options
if (!empty($commons_entity_integrations['node'])) {
$flag->types += array_keys($commons_entity_integrations['node']);
}
}
}
}
/**
* Get all node IDs relevant to what the user ordered.
*
* @param $account
* The user being checked. Defaults to the current user.
* @param $options
* Array. Includes options to alter the query. Options available are used
* within the hook implementations.
*
* @return
* Array of node IDs.
*/
function commons_follow_get_nids($account = NULL, $options = array()) {
if (empty($account)) {
global $user;
$account = clone $user;
}
$nids = array();
// We don't use module_invoke_all() is we want to retain the array keys,
// which are the user IDs.
foreach (module_implements('commons_follow_get_nids') as $module) {
$function = $module . '_commons_follow_get_nids';
$result = $function($account, $options);
if (empty($result)) {
continue;
}
foreach ($result as $nid) {
$nids[$nid] = $nid;
}
}
return $nids;
}
/**
* Get subscriptions flag IDs.
*
* @param $content_type
* Optional. The type of content for which to load the flags. Usually 'node'.
* @param $content_subtype
* Optional. The node type for which to load the flags.
* @param $account
* Optional. The user accont to filter available flags. If not set, all
* flags for will this node will be returned.
* @param $reset
* Optional. Reset the internal query cache.
*
* @return $flags
* An array of the structure [fid] = flag_object.
*
* @see flag_get_flags()
*/
function commons_follow_get_subscription_flags_ids($content_type = NULL, $content_subtype = NULL, $account = NULL, $reset = FALSE) {
if (!module_exists('message_subscribe')) {
// Requires message_subscribe module.
return;
}
$flags = message_subscribe_flag_get_flags($content_type, $content_subtype, $account, $reset);
$flag_ids = array();
foreach ($flags as $flag) {
$flag_ids[] = $flag->fid;
}
return $flag_ids;
}
/**
* Implements hook_views_api().
*/
function commons_follow_views_api() {
return array(
'api' => 3,
'path' => drupal_get_path('module', 'commons_follow') . '/includes/views',
);
}
/**
* Returns a list of Commons Follow Flag objects.
*/
function commons_follow_get_flags() {
$flags = flag_get_flags();
foreach ($flags as $key => $flag) {
if (substr($key, 0, 14) != 'commons_follow') {
unset($flags[$key]);
}
}
return $flags;
}
/**
* Returns an array of Commons Follow flags keyed on the numeric flag ID.
*/
function commons_follow_get_flag_ids() {
$flag_ids = array();
$flags = commons_follow_get_flags();
foreach ($flags as $key => $flag) {
$flag_ids[$flag->fid] = $key;
}
return $flag_ids;
}
/**
* Returns a single flag ID based on a flag machine name.
*/
function commons_follow_get_flag_id($name) {
$flag = flag_get_flag($name);
$return = $flag->fid;
return $flag->fid;
}
/**
* Get a list of all content that a user is following.
* @return
* An array keyed on the flag name with values corresponding to the IDs
* of the flagged entities.
*/
function commons_follow_get_followed_content($account = array()) {
if (empty($account)) {
global $user;
$account = $user;
}
$results = array();
$flag_ids = commons_follow_get_flag_ids();
// Get a list of everything that the user is following.
$result = db_query("SELECT fid, entity_id FROM {flagging} WHERE fid IN (:fids) AND uid = :uid", array(':fids' => array_keys($flag_ids), ':uid' => $account->uid));
foreach ($result as $this_result) {
$results[$flag_ids[$this_result->fid]][] = $this_result->entity_id;
}
return $results;
}
/**
* Find a list of message IDs that correspond to events that the current user
* is following.
*/
function commons_follow_get_followed_message_ids($account = NULL) {
$followed_mids = array();
// Allow the module with this flag namespace to return a list of
// followed MIDs.
$followed_content = commons_follow_get_followed_content($account);
$followed_mids = array();
foreach ($followed_content as $key => $content) {
$function = $key . '_commons_follow_get_message_ids';
if (function_exists($function)) {
$function($followed_mids, $followed_content);
}
}
return $followed_mids;
}
function commons_follow_views_data_alter(&$data) {
$data['flag_content']['ops']['field']['handler'] = 'commons_follow_handler_field_ops';
}
function commons_follow_views_query_alter(&$view, &$query) {
// Only act on the notifications page.
if (arg(2) != 'notification-settings') {
return;
}
global $user;
$prefix = variable_get('message_subscribe_flag_prefix', 'subscribe') . '_';
if(strpos($view->name, $prefix) === 0 && isset($view->args[0]) && $user->uid != $view->args[0]) {
$flag_content_keys = array_keys($query->table_queue);
foreach($flag_content_keys AS $key) {
if(strpos($key, 'flag_content') === 0) {
//Convert the Send Email Query
$join = $query->table_queue[$key]['join'];
$join->extra[1] = array(
'field' => 'uid',
'value' => $view->args[0],
'numeric' => TRUE,
);
$query->table_queue[$key]['join'] = $join;
}
}
}
}