View source
<?php
define('NOTIFICATIONS_CONTENT_PAGER', 20);
function notifications_content_menu() {
$items['admin/messaging/notifications/subscriptions/content'] = array(
'title' => 'Content',
'description' => 'Content subscriptions',
'type' => MENU_LOCAL_TASK,
'page callback' => 'drupal_get_form',
'page arguments' => array(
'notifications_content_settings_form',
),
'access arguments' => array(
'administer site configuration',
),
'file' => 'notifications_content.pages.inc',
);
$items['user/%user/notifications/thread'] = array(
'type' => MENU_LOCAL_TASK,
'access callback' => FALSE,
'title' => 'Thread',
'page callback' => 'notifications_user_subscription_list_page',
'page arguments' => array(
'thread',
1,
),
'weight' => 10,
);
$items['user/%user/notifications/nodetype'] = array(
'type' => MENU_LOCAL_TASK,
'access callback' => FALSE,
'title' => 'Content type',
'page callback' => 'notifications_user_subscription_list_page',
'page arguments' => array(
'nodetype',
1,
),
'weight' => 10,
);
$items['user/%user/notifications/author'] = array(
'type' => MENU_LOCAL_TASK,
'access callback' => FALSE,
'title' => t('Author'),
'page callback' => 'notifications_user_subscription_list_page',
'page arguments' => array(
'author',
1,
),
'weight' => 10,
);
$items['user/%user/notifications/typeauthor'] = array(
'type' => MENU_LOCAL_TASK,
'access callback' => FALSE,
'title' => t('Content type by author'),
'page callback' => 'notifications_user_subscription_list_page',
'page arguments' => array(
'typeauthor',
1,
),
'weight' => 10,
);
$items['admin/messaging/notifications/events/configure'] = array(
'title' => 'Configure',
'type' => MENU_DEFAULT_LOCAL_TASK,
'access arguments' => array(
'administer site configuration',
),
'file' => 'notifications.admin.inc',
);
$items['admin/messaging/notifications/events/test'] = array(
'title' => 'Test',
'description' => 'Test event templates.',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'notifications_content_test_template_form',
),
'type' => MENU_LOCAL_TASK,
'access arguments' => array(
'administer notifications',
),
'file' => 'notifications_content.pages.inc',
);
return $items;
}
function notifications_content_access($account, $perm) {
global $user;
return $account->uid && $account->uid == $user->uid && user_access($perm) || user_access('administer notifications') && user_access($perm, $account);
}
function notifications_content_perm() {
return array(
'subscribe to content',
'subscribe to content type',
'subscribe to author',
'subscribe to content type and author',
'skip notifications',
);
}
function notifications_content_help($path, $arg) {
if ($path == 'admin/messaging/notifications/content') {
$output = '<p>' . t('Content subscriptions are subscriptions to nodes that will produce notifications when a node is posted or updated or when a comment is posted for that nodes. Notifications will be sent only for published content so if you need to be notified of unpublished content waiting for approval you better use Triggers and Actions or some other module for that.') . '</p>';
$output .= '<p>' . t('On this page you can set which of the available subscription types are allowed. Alternatively you can select the <em>Set up for each content type</em> option and use the <a href="@content-type-settings">Administer Content types</a> page. These settings will be combined with permissions and other options (See user interface options if enabled) to determine which subscriptions will be finally available for users.', array(
'@content-type-settings' => url('admin/content/types'),
)) . '</p>';
return $output;
}
elseif (array(
$arg[0],
$arg[1],
$arg[2],
$arg[3],
) == array(
'admin',
'messaging',
'template',
'edit',
) && ($group = $arg[4])) {
switch ($group) {
case 'notifications-digest-node-nid':
case 'notifications-digest-node-type':
$help = '<p>' . t('This is the format for each digest group. A message may consist on one or many of these groups:') . '</p>';
$help .= '<small><pre>';
$help .= t('Group title') . "\n";
$help .= '- ' . t('Digest line.') . "\n";
$help .= '- ' . t('Digest line.') . "\n";
$help .= '- ...' . "\n";
$help .= t('Group footer') . "\n";
$help .= '</pre></small>';
return $help;
}
}
}
function notifications_content_form_alter(&$form, &$form_state, $form_id) {
switch ($form_id) {
case 'comment_form':
$node = node_load($form['nid']['#value']);
if (notifications_content_type_enabled($node->type)) {
if (notifications_event_enabled('node-comment')) {
_notifications_content_add_disable_field($form);
}
if (!empty($form['cid']['#value']) && !empty($form['admin']['status'])) {
$form['notifications_comment_status'] = array(
'#type' => 'value',
'#value' => $form['admin']['status']['#default_value'],
);
}
}
break;
case 'node_type_form':
if (isset($form['identity']['type'])) {
if (!isset($form['notifications'])) {
$form['notifications'] = array();
}
$form['notifications'] += array(
'#type' => 'fieldset',
'#title' => t('Subscription settings'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['notifications']['notifications_content_type'] = array(
'#type' => 'checkboxes',
'#title' => t('Allowed subscription types'),
'#default_value' => notifications_content_type_enabled($form['#node_type']->type),
'#options' => _notifications_content_type_options(),
'#description' => t('Enable different subscription options for this content type.'),
'#weight' => -10,
);
if (!variable_get('notifications_content_per_type', 0)) {
$form['notifications']['notifications_content_type']['#disabled'] = TRUE;
$form['notifications']['notifications_content_type']['#description'] .= ' <strong>' . t('To enable these options check the <a href="@notifications-settings">Notifications content settings</a>', array(
'@notifications-settings' => url('admin/messaging/notifications/content'),
)) . '</strong>';
}
}
break;
default:
if (isset($form['type']) && isset($form['#node']) && $form['type']['#value'] . '_node_form' == $form_id) {
$node = $form['#node'];
if (notifications_content_type_enabled($node->type) && (empty($node->nid) && notifications_event_enabled('node-insert') || !empty($node->nid) && notifications_event_enabled('node-update'))) {
_notifications_content_add_disable_field($form, !empty($node->notifications_content_disable));
}
}
}
}
function _notifications_content_add_disable_field(&$form, $default = 0) {
if (user_access('skip notifications')) {
$form['notifications']['#type'] = 'fieldset';
$form['notifications']['#title'] = t('Notifications');
$form['notifications']['#collapsible'] = TRUE;
$form['notifications']['notifications_content_disable'] = array(
'#type' => 'checkbox',
'#title' => t('Do not send notifications for this update.'),
'#default_value' => $default,
);
}
}
function notifications_content_content_extra_fields($type_name) {
$extra = array();
if (notifications_content_type_enabled($type_name) && (notifications_event_enabled('node-insert') || notifications_event_enabled('node-update'))) {
$extra['notifications'] = array(
'label' => t('Notifications'),
'description' => t('Notifications module form.'),
'weight' => 100,
);
}
return $extra;
}
function notifications_content_theme() {
return array(
'notifications_content_type_settings' => array(
'arguments' => array(
'element' => NULL,
),
'file' => 'notifications_content.pages.inc',
),
);
}
function notifications_content_notifications($op) {
switch ($op) {
case 'subscription types':
$disabled = !variable_get('notifications_content_per_type', 0);
$types['thread'] = array(
'event_type' => 'node',
'object_type' => 'node',
'title' => t('Thread'),
'access' => 'subscribe to content',
'page callback' => 'notifications_content_page_thread',
'user page' => 'user/%user/notifications/thread',
'fields' => array(
'nid',
),
'description' => t('Subscribe to all changes and comments for a thread.'),
'name callback' => 'notifications_content_subscription_name',
);
$types['nodetype'] = array(
'event_type' => 'node',
'object_type' => 'node',
'title' => t('Content type'),
'access' => 'subscribe to content type',
'page callback' => 'notifications_content_page_nodetype',
'user page' => 'user/%user/notifications/nodetype',
'fields' => array(
'type',
),
'description' => t('Subscribe to all content of a given type.'),
'name callback' => 'notifications_content_subscription_name',
);
$types['author'] = array(
'event_type' => 'node',
'object_type' => 'user',
'title' => t('Author'),
'access' => 'subscribe to author',
'page callback' => 'notifications_content_page_author',
'user page' => 'user/%user/notifications/author',
'fields' => array(
'author',
),
'description' => t('Subscribe to all content submitted by a user.'),
'name callback' => 'notifications_content_subscription_name',
);
$types['typeauthor'] = array(
'event_type' => 'node',
'object_type' => array(
'node',
'user',
),
'title' => t('Content type by author'),
'access' => 'subscribe to content type and author',
'page callback' => 'notifications_content_page_typeauthor',
'user page' => 'user/%user/notifications/typeauthor',
'fields' => array(
'author',
'type',
),
'description' => t('Subscribe to all content of a given type submitted by a user.'),
'name callback' => 'notifications_content_subscription_name',
);
return $types;
case 'subscription fields':
$fields['nid'] = array(
'name' => t('Node'),
'field' => 'nid',
'type' => 'int',
'object_type' => 'node',
);
$fields['author'] = array(
'name' => t('Author'),
'field' => 'author',
'type' => 'int',
'object_type' => 'user',
);
$fields['type'] = array(
'name' => t('Node type'),
'field' => 'type',
'type' => 'string',
'options callback' => 'notifications_content_types_callback',
);
return $fields;
case 'object types':
$types['comment'] = array(
'name' => t('Comment'),
'key_field' => 'cid',
'load callback' => 'notifications_content_comment_load',
'format callback' => 'notifications_content_comment_cid2title',
'access callback' => 'notifications_content_comment_access',
);
return $types;
case 'event types':
$types['node-insert'] = array(
'type' => 'node',
'action' => 'insert',
'name' => t('New content of type [type-name] has been submitted'),
'line' => t('[type-name] [title] by [author-name]'),
'digest' => array(
'node',
'type',
),
'description' => t('Node creation'),
'template' => 'notifications-event-node-insert',
);
$types['node-update'] = array(
'type' => 'node',
'action' => 'update',
'name' => t('[type-name]: [title]'),
'line' => t('The [type-name] has been updated'),
'digest' => array(
'node',
'nid',
),
'description' => t('Node update'),
'template' => 'notifications-event-node-update',
);
$types['node-comment'] = array(
'type' => 'node',
'action' => 'comment',
'name' => t('[type-name]: [title]'),
'line' => t('New comment by [comment-author-name]: [comment-title]'),
'digest' => array(
'node',
'nid',
),
'description' => t('Node comment'),
'template' => 'notifications-event-node-comment',
);
return $types;
case 'event classes':
return array(
'node' => t('Node'),
);
case 'event actions':
return array(
'insert' => t('Creation'),
'update' => t('Update'),
'comment' => t('Comment'),
);
}
}
function notifications_content_notifications_subscription($op, $subscription = NULL) {
switch ($op) {
case 'access':
if (($conditions = $subscription
->get_conditions()) && !empty($conditions['type'])) {
return notifications_content_type_enabled($conditions['type'], $subscription->type);
}
break;
case 'page objects':
if (arg(0) == 'node' && is_numeric(arg(1)) && ($node = menu_get_object('node'))) {
return array(
'node' => $node,
);
}
break;
}
}
function notifications_content_notifications_object_node($op, $node, $account = NULL) {
switch ($op) {
case 'conditions':
return array(
'nid' => $node->nid,
'type' => $node->type,
'author' => $node->uid,
);
case 'subscriptions':
$options = array();
if (notifications_content_type_enabled($node->type, 'thread')) {
$options[] = array(
'name' => t('This post'),
'type' => 'thread',
'fields' => array(
'nid' => $node->nid,
),
);
}
if (notifications_content_type_enabled($node->type, 'nodetype')) {
$options[] = array(
'name' => t('Posts of type @type', array(
'@type' => notifications_content_type_name($node->type),
)),
'type' => 'nodetype',
'fields' => array(
'type' => $node->type,
),
);
}
if (notifications_content_type_enabled($node->type, 'author')) {
$options[] = array(
'name' => t('Posts by @name', array(
'@name' => _notifications_content_node_username($node),
)),
'type' => 'author',
'fields' => array(
'author' => $node->uid,
),
);
}
if (notifications_content_type_enabled($node->type, 'typeauthor')) {
$options[] = array(
'name' => t('@type posts by @name', array(
'@name' => _notifications_content_node_username($node),
'@type' => notifications_content_type_name($node->type),
)),
'type' => 'typeauthor',
'fields' => array(
'author' => $node->uid,
'type' => $node->type,
),
);
}
return $options;
break;
}
}
function notifications_content_notifications_object_user($op, $user, $account = NULL) {
switch ($op) {
case 'conditions':
return array(
'uid' => $user->uid,
'author' => $user->uid,
);
case 'subscriptions':
$options = array();
if (!$account || user_access('subscribe to author', $account)) {
$options[] = array(
'name' => t('All posts by @name', array(
'@name' => $user->name,
)),
'type' => 'author',
'fields' => array(
'author' => $user->uid,
),
);
}
if (!$account || user_access('subscribe to content type and author', $account)) {
foreach (notifications_content_types('typeauthor') as $type => $type_name) {
$options[] = array(
'name' => t('@type posts by @name', array(
'@name' => $user->name,
'@type' => $type_name,
)),
'type' => 'typeauthor',
'fields' => array(
'author' => $author->uid,
'type' => $type,
),
);
}
}
return $options;
}
}
function notifications_content_notifications_templates($op, $type = 'all', $language = NULL) {
switch ($op) {
case 'help':
if (strpos($type, 'notifications-event') === 0) {
$help[] = t('The <em>Header</em> and <em>Footer</em> will be taken from Notification events.');
$help[] = t('The <em>Digest line</em> will be used when composing Short digests on which each event will be just a line.');
return $help;
}
break;
case 'info':
$info = array();
if ($type == 'all' || $type == 'notifications-event-node') {
$info['notifications-event-node'] = array(
'module' => 'notifications_content',
'name' => t('Notifications for node events'),
'description' => t('Defaults for all notifications related to node events.'),
'fallback' => 'notifications-event',
);
}
if ($type == 'all' || $type == 'notifications-event-node-insert') {
$info['notifications-event-node-insert'] = array(
'module' => 'notifications_content',
'name' => t('Notifications for node creation'),
'description' => t('Notifications produced when a new node is created.'),
'fallback' => 'notifications-event-node',
);
}
if ($type == 'all' || $type == 'notifications-event-node-update') {
$info['notifications-event-node-update'] = array(
'module' => 'notifications_content',
'name' => t('Notifications for node updates'),
'description' => t('Notifications produced when a node is updated.'),
'fallback' => 'notifications-event-node',
);
}
if ($type == 'all' || $type == 'notifications-event-node-comment') {
$info['notifications-event-node-comment'] = array(
'module' => 'notifications_content',
'name' => t('Notifications for node comments'),
'description' => t('Notifications produced when a comment is posted to a node.'),
'fallback' => 'notifications-event-node',
);
}
if ($type == 'digest' || $type == 'notifications-digest-node-nid') {
$info['notifications-digest-node-nid'] = array(
'module' => 'notifications_content',
'name' => t('Groups digests per node'),
'description' => t('Group of events digested for each node.'),
'fallback' => 'notifications-digest',
);
}
if ($type == 'digest' || $type == 'notifications-digest-node-type') {
$info['notifications-digest-node-type'] = array(
'module' => 'notifications_content',
'name' => t('Groups digests per node type'),
'description' => t('Group of events digested for each node type.'),
'fallback' => 'notifications-digest',
);
}
return $info;
case 'parts':
switch ($type) {
case 'notifications-event-node':
case 'notifications-event-node-insert':
case 'notifications-event-node-update':
case 'notifications-event-node-comment':
return array(
'subject' => t('Subject'),
'main' => t('Content'),
'digest' => t('Digest line'),
);
case 'notifications-digest-node-nid':
case 'notifications-digest-node-type':
$parts['title'] = t('Group title');
$parts['closing'] = t('Group footer');
return $parts;
}
break;
case 'defaults':
switch ($type) {
case 'notifications-event-node':
case 'notifications-event-node-update':
return array(
'subject' => t('Update for [type-name]: [title]', array(), $language->language),
'main' => array(
'[node-teaser]',
t('Read more [node-url]', array(), $language->language),
),
'digest' => array(
'[title]',
t('Read more [node-url]', array(), $language->language),
),
);
case 'notifications-event-node-insert':
return array(
'subject' => t('New [type-name]: [title]', array(), $language->language),
'main' => array(
'[node-teaser]',
t('Read more [node-url]', array(), $language->language),
),
'digest' => array(
'[title]',
t('Read more [node-url]', array(), $language->language),
),
);
case 'notifications-event-node-comment':
return array(
'subject' => t('Comment for [type-name]: [title]', array(), $language->language),
'main' => array(
t('Comment by [comment-author-name]: [comment-title]', array(), $language->language),
'[comment-body]',
t('Read more [comment-url]', array(), $language->language),
),
'digest' => array(
t('New Comment on [title] by [comment-author-name] titled [comment-title]'),
t('Read more [comment-url]', array(), $language->language),
),
);
case 'notifications-digest-node-nid':
return array(
'title' => t('Updates for [type-name]: [title]', array(), $language->language),
'closing' => t('Read more [node-url]', array(), $language->language),
);
case 'notifications-digest-node-type':
return array(
'title' => t('New content of type [type-name] has been submitted', array(), $language->language),
'closing' => '<none>',
);
}
break;
case 'tokens':
$args = explode('-', $type) + array(
2 => '',
3 => '',
);
$tokens = array();
if ($args[0] == 'notifications' && $args[2] == 'node') {
if ($args[1] == 'event') {
$tokens[] = 'node';
if ($args[3] == 'comment') {
$tokens[] = 'comment';
}
}
elseif ($args[1] == 'digest') {
if ($args[3] == 'nid') {
$tokens[] = 'node';
}
elseif ($args[3] == 'type') {
$tokens[] = array(
'node',
'type-name',
);
}
}
}
return $tokens;
}
}
function _notifications_content_type_options($enabled = TRUE) {
if ($types = notifications_subscription_types()) {
if ($enabled) {
$types = array_intersect_key($types, notifications_subscription_type_enabled());
}
if ($types) {
if ($types = notifications_array_filter($types, array(
'event_type' => 'node',
))) {
if ($types = notifications_array_filter($types, array(
'custom' => TRUE,
), TRUE)) {
return array_map('notifications_format_title_description', $types);
}
}
}
}
return array();
}
function _notifications_content_node_username($node) {
if (empty($node->name)) {
if ($author = notifications_load_user($node->uid)) {
$node->name = $author->name;
}
else {
$node->name = t('Unknown');
}
}
return $node->name;
}
function notifications_content_nodeapi(&$node, $op, $arg = 0) {
global $user;
$done =& messaging_static(__FUNCTION__);
switch ($op) {
case 'load':
$node->old_status = $node->status;
break;
case 'update':
case 'insert':
if (!isset($done[$node->nid]) && $node->status && empty($node->notifications_content_disable) && notifications_content_type_enabled($node->type)) {
$done[$node->nid] = TRUE;
$event = array(
'module' => 'node',
'oid' => $node->nid,
'type' => 'node',
'action' => $op,
'params' => array(
'nid' => $node->nid,
),
);
if ($op == 'update') {
if (!isset($node->old_status)) {
$oldnode = node_load($node->nid);
$node->old_status = $oldnode->status;
}
if (!$node->old_status) {
$event['uid'] = $node->uid;
$event['action'] = 'insert';
}
if (variable_get('notifications_send_immediate', 0)) {
node_load(0, NULL, TRUE);
}
}
notifications_event($event, array(
'node' => $node,
));
}
break;
case 'delete':
notifications_delete_subscriptions(array(
'event_type' => 'node',
), array(
'nid' => $node->nid,
), FALSE);
}
}
function notifications_content_comment($comment, $op) {
$comment = (object) $comment;
if ($op == 'publish' && empty($comment->notifications_content_disable) && notifications_event_enabled('node-comment') && (!isset($comment->notifications_comment_status) || !empty($comment->notifications_comment_status))) {
$node = node_load($comment->nid);
if ($node->status && notifications_content_type_enabled($node->type)) {
$event = array(
'uid' => $comment->uid,
'module' => 'node',
'type' => 'node',
'oid' => $node->nid,
'action' => 'comment',
);
notifications_event($event, array(
'node' => $node,
'comment' => $comment,
));
}
}
}
function notifications_content_node_type($op, $info) {
switch ($op) {
case 'delete':
notifications_delete_subscriptions(array(
'event_type' => 'node',
), array(
'type' => $info->type,
));
break;
case 'update':
if (!empty($info->old_type) && $info->old_type != $info->type) {
db_query("UPDATE {notifications_fields} SET value = '%s' WHERE field = 'type' AND value = '%s'", $info->type, $info->old_type);
}
break;
}
}
function notifications_content_comment_load($cid) {
$cache =& messaging_static(__FUNCTION__);
if (!$cache || !array_key_exists($cid, $cache)) {
$comment = db_fetch_object(db_query('SELECT c.*, u.uid, u.name AS registered_name, u.data FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.cid = %d', $cid));
if ($comment) {
$comment = drupal_unpack($comment);
$comment->name = $comment->uid ? $comment->registered_name : $comment->name;
}
$cache[$cid] = $comment;
}
return $cache[$cid];
}
function notifications_content_comment_cid2title($cid, $html = FALSE) {
if ($comment = notifications_content_comment_load($cid)) {
return $html ? l($comment->subject, "node/{$comment->nid}", array(
'fragment' => "comment-{$comment->cid}",
)) : check_plain($comment->subject);
}
else {
return t('Not found');
}
}
function notifications_content_types_callback($subscription = NULL) {
if ($subscription && !notifications_subscription_types($subscription->type, 'custom')) {
return notifications_content_types($subscription->type);
}
else {
return notifications_content_type_name();
}
}
function notifications_content_types($subs_type = NULL) {
$types = array();
foreach (notifications_content_type_name() as $key => $name) {
if (notifications_content_type_enabled($key, $subs_type)) {
$types[$key] = $name;
}
}
return $types;
}
function notifications_content_type_name($type = NULL) {
static $types;
if (!isset($types)) {
foreach (node_get_types('names') as $key => $name) {
$types[$key] = notifications_translate("type:{$key}:name", $name, NULL, 'nodetype');
}
}
return $type ? $types[$type] : $types;
}
function notifications_content_type_enabled($type = NULL, $option = NULL, $disabled = FALSE) {
$settings = variable_get('notifications_content_type', array());
if ($type) {
if (!$disabled && !notifications_subscription_type_enabled($type)) {
$settings = array();
}
elseif (variable_get('notifications_content_per_type', 0)) {
$settings = variable_get('notifications_content_type_' . $type, $settings);
}
}
elseif (!$disabled) {
$settings = array_intersect($settings, notifications_subscription_type_enabled());
}
if ($option) {
return in_array($option, $settings, TRUE);
}
else {
return array_filter($settings);
}
}
function notifications_content_token_list($type = 'all') {
$tokens = array();
if ($type == 'node' || $type == 'all') {
$tokens['node']['node-teaser'] = t('The node teaser.');
$tokens['node']['node-body'] = t('The node body.');
$tokens['node']['node-content'] = t('The fully rendered node content.');
$tokens['node']['node-teaser-raw'] = t('Unfiltered node teaser. WARNING - raw user input.');
$tokens['node']['node-body-raw'] = t('Unfiltered node body. WARNING - raw user input.');
}
if ($type == 'comment' || $type == 'all') {
$tokens['comment']['comment-url'] = t('The comment view url.');
$tokens['comment']['comment-reply-url'] = t('The comment reply url.');
}
return $tokens;
}
function notifications_content_token_values($type, $object = NULL, $options = array()) {
switch ($type) {
case 'node':
if (is_object($object) && ($node = drupal_clone($object))) {
$values['node-teaser'] = !empty($node->teaser) ? check_markup($node->teaser, $node->format, FALSE) : '';
$values['node-body'] = !empty($node->body) ? check_markup($node->body, $node->format, FALSE) : '';
$values['node-teaser-raw'] = !empty($node->teaser) ? $node->teaser : '';
$values['node-body-raw'] = !empty($node->body) ? $node->body : '';
$node = node_build_content($node);
$values['node-content'] = drupal_render($node->content);
return $values;
}
break;
case 'comment':
if ($comment = (object) $object) {
$values['comment-url'] = url('node/' . $comment->nid, array(
'fragment' => 'comment-' . $comment->cid,
'absolute' => TRUE,
));
$values['comment-reply-url'] = url('comment/reply/' . $comment->nid . '/' . $comment->cid, array(
'absolute' => TRUE,
));
return $values;
}
break;
}
}
function notifications_content_node_allow($account, $node) {
static $access;
if (!$node) {
return FALSE;
}
if (!isset($access[$account->uid][$node->nid])) {
$access[$account->uid][$node->nid] = node_access('view', $node, $account);
}
return $access[$account->uid][$node->nid];
}
function notifications_content_comment_allow($account, $comment) {
static $access;
$comment = is_object($comment) ? $comment : db_fetch_object(db_query("SELECT * FROM {comments} WHERE cid = %d", $comment));
if (!isset($access[$account->uid][$comment->cid])) {
if (($account->uid == $comment->uid || $comment->status == COMMENT_PUBLISHED) && user_access('access comments', $account) || user_access('administer comments', $account)) {
$access[$account->uid][$comment->cid] = TRUE;
}
else {
$access[$account->uid][$comment->cid] = FALSE;
}
}
return $access[$account->uid][$comment->cid];
}
function notifications_content_comment_access($comment, $account) {
return ($account->uid == $comment->uid || $comment->status == COMMENT_PUBLISHED && user_access('access comments', $account) || user_access('administer comments', $account)) && notifications_object_access('node', $comment->nid, $account);
}