You are here

notifications_content.admin.inc in Notifications 7

Subscriptions to content events

File

notifications_content/notifications_content.admin.inc
View source
<?php

/**
 * @file
 * Subscriptions to content events
 */

/**
 * Admin settings form
 */
function notifications_content_settings_form($form, &$form_state) {

  // Build check boxes table with content types x subscription types
  $form['content'] = array(
    '#type' => 'fieldset',
    '#title' => t('Enabled subscription types'),
    '#weight' => -10,
    '#collapsible' => TRUE,
    '#description' => t('Check the subscription types that will be enabled. You can use the global settings here or set different options for each content type.'),
  );
  $form['content']['notifications_content_per_type'] = array(
    '#type' => 'radios',
    '#default_value' => variable_get('notifications_content_per_type', 0),
    '#options' => array(
      t('Use global settings on this page for all content types'),
      t('Set up for each content type on <a href="@content-type-settings">Administer Content Types</a>.', array(
        '@content-type-settings' => url('admin/structure/types'),
      )),
    ),
  );
  $form['content']['notifications_content_type'] = array(
    '#type' => 'checkboxes',
    '#title' => t('Global options'),
    '#options' => node_type_get_names(),
    '#default_value' => variable_get('notifications_content_type', array()),
    '#description' => t('Content types for which subscriptions will be enabled.'),
  );
  return system_settings_form($form);
}

/**
 * Template testing form
 */
function notifications_content_test_template_form($form_state) {
  global $user, $language;
  module_load_include('admin.inc', 'notifications');
  $message = !empty($form_state['values']['message']) ? $form_state['values']['message'] : NULL;
  if ($message) {
    $form['showmessage'] = array(
      '#title' => t('Message'),
      '#type' => 'item',
      '#value' => _notifications_content_test_format_message(array(
        'subect' => $message->subject,
        'body' => $message->body,
      )),
    );
    $form['showtemplate'] = array(
      '#title' => t('Template parts'),
      '#type' => 'item',
      '#value' => _notifications_content_test_format_template($message->text_parts),
    );
  }
  $form['type'] = array(
    '#title' => t('Node type'),
    '#type' => 'select',
    '#options' => node_get_types('names'),
    '#default_value' => isset($form_state['values']['type']) ? $form_state['values']['type'] : NULL,
  );
  $form['action'] = array(
    '#title' => t('Action'),
    '#type' => 'select',
    '#options' => notifications_info('event actions'),
    '#default_value' => isset($form_state['values']['action']) ? $form_state['values']['action'] : NULL,
  );
  $form['subscription_type'] = array(
    '#title' => t('Subscription type'),
    '#type' => 'select',
    '#options' => notifications_subscription_type(NULL, 'title'),
    '#default_value' => isset($form_state['values']['subscription_type']) ? $form_state['values']['subscription_type'] : NULL,
    '#description' => t('Some modules may define a different template for their subscription types.'),
  );
  $form['send_method'] = array(
    '#title' => t('Send method'),
    '#type' => 'select',
    '#options' => notifications_send_methods($user),
  );
  $form['language'] = array(
    '#title' => t('Language'),
    '#type' => 'select',
    '#options' => messaging_template_language_list(),
    '#default_value' => isset($form_state['values']['language']) ? $form_state['values']['language'] : $language->language,
  );
  $form['node'] = array(
    '#title' => t('Select node'),
    '#type' => 'textfield',
    '#default_value' => isset($form_state['values']['node']) ? $form_state['values']['node'] : NULL,
    '#description' => t("Enter a node id. If empty, a dummy node will be generated with title 'Test title' and body 'Test body line' (x 5 lines)"),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Try'),
    '#submit' => array(
      'notifications_content_test_template_submit',
    ),
    '#description' => t('This test will generate fake events so only advised for development sites.'),
  );
  return $form;
}

/**
 * Process template test
 */
function notifications_content_test_template_submit(&$form, &$form_state) {
  global $user;

  // Load node or build fake node
  if ($nid = (int) $form_state['values']['node']) {
    if (($node = node_load($nid)) && node_access('view', $node)) {
      drupal_set_message(t('Loaded node type @type', array(
        '@type' => $node->type,
      )));
    }
  }
  if (empty($node)) {
    $type = $form_state['values']['type'];
    $node = _notifications_content_test_generate_content($type);
    $node->nid = 1;
    $node->uid = $user->uid;
    $node->type = $type;
  }

  // Build fake event for node/action
  $action = $form_state['values']['action'];
  $objects['node'] = $node;

  // Add comment if needed
  if ($action == 'comment') {
    $comment = _notifications_content_test_generate_content('comment');
    $comment->cid = 1;
    $comment->uid = $user->uid;
    $comment->nid = $node->nid;
    $objects['comment'] = $comment;
  }
  $event = Notifications_Event::create(array(
    'eid' => 1,
    'module' => 'node',
    'type' => 'node',
    'action' => $action,
  ), $objects);
  if (!$event->queue) {
    drupal_set_message(t('That event type is not enabled though we try building a message for it.'), 'warning');
  }

  // Get a subscription template, that may determine the module
  $subscription = Notifications_Subscription::build_type($form_state['values']['subscription_type']);

  // Build the message and store it
  $send_method = $form_state['values']['send_method'];
  if ($destination = messaging_account_build_destination($user, $send_method)) {
    $template = new Notifications_Message();
    $template->method = $send_method;
    $template
      ->set_destination($destination);
    $template->language = $form_state['values']['language'];
    $message = Notifications_Message::build_simple_message($template, $event, array(), $subscription->module);

    // Store message and rebuild. The message will come with template information (text_parts);
    $form_state['values']['message'] = $message;
    $form_state['rebuild'] = TRUE;
  }
  else {
    drupal_set_message(t('Cannot build destination.'), 'warning');
  }
}

/**
 * Generate fake node or comment
 */
function _notifications_content_test_generate_content($type) {
  $node = new stdClass();
  $title = t('Test title for @type', array(
    '@type' => $type,
  ));
  for ($i = 1; $i <= 5; $i++) {
    $body[] = t('Test body line @number for @type.', array(
      '@number' => $i,
      '@type' => $type,
    ));
  }
  if ($type == 'comment') {
    $node->subject = $title;
    $node->comment = implode("\n", $body);
  }
  else {
    $node->title = $title;
    $node->body = implode("\n", $body);
    $node->teaser = node_teaser($node->body);
  }
  return $node;
}

/**
 * Format resulting message array as table
 */
function _notifications_content_test_format_message($message) {
  $rows = array();
  foreach ($message as $key => $value) {
    $rows[] = array(
      $key,
      is_array($value) ? _notifications_content_test_format_message($value) : '<pre>' . check_plain($value) . '</pre>',
    );
  }
  return theme('table', array(), $rows);
}

/**
 * Format template information as table
 */
function _notifications_content_test_format_template($parts) {
  $rows = array();
  $header = array(
    'msgkey' => t('Key'),
    'type' => t('Template'),
    'method' => t('Method'),
    'message' => t('Text'),
    'language' => t('Language'),
    'format' => t('Format'),
  );
  foreach ($parts as $key => $value) {
    $row = array();
    foreach (array_keys($header) as $field) {
      $row[] = isset($value->{$field}) ? check_plain($value->{$field}) : '';
    }
    $rows[] = $row;
  }
  return theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));
}

/**
 * Theme content type settings
 */
function theme_notifications_content_type_settings(&$elements) {
  $output = '';
  $options = _notifications_content_type_options();
  $header = array_merge(array(
    '',
  ), array_values($options));
  $rows = array();
  foreach (element_children($elements) as $key) {
    $row = array(
      $elements[$key]['#title'],
    );
    unset($elements[$key]['#title']);
    foreach (array_keys($options) as $index) {
      unset($elements[$key][$index]['#title']);
      $row[] = drupal_render($elements[$key][$index]);
    }
    $rows[] = $row;
  }
  $output .= theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));
  $output .= drupal_render($elements);
  return $output;
}

Functions

Namesort descending Description
notifications_content_settings_form Admin settings form
notifications_content_test_template_form Template testing form
notifications_content_test_template_submit Process template test
theme_notifications_content_type_settings Theme content type settings
_notifications_content_test_format_message Format resulting message array as table
_notifications_content_test_format_template Format template information as table
_notifications_content_test_generate_content Generate fake node or comment