You are here

notifications_custom.admin.inc in Notifications 6.4

Same filename and directory in other branches
  1. 6 notifications_custom/notifications_custom.admin.inc

Custom notifications module (admin features)

File

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

/**
 * @file
 * Custom notifications module (admin features)
 */

/**
 * Page callback, administer custom subscriptions
 */
function notifications_custom_admin_page($op = NULL) {
  $output = '';
  $base_path = 'admin/messaging/customsubs';
  if ($op == 'new') {
    drupal_set_title(t('Add custom subscription'));
    $subs = notifications_custom_build_subscription(array(
      'csid' => 0,
      'type' => 'custom',
      'name' => '',
      'title' => '',
      'type' => 'custom_',
      'module' => 'notifications_custom',
      'event_type' => '',
      'description' => '',
      'weight' => 0,
      'visibility' => 0,
      'fields' => array(),
    ));
    $output .= drupal_get_form('notifications_custom_form', $subs);
  }
  else {
    notifications_custom_rebuild();
    if ($custom = notifications_custom_list()) {
      $header = array(
        t('Type'),
        t('Name'),
        t('Title'),
        t('Operations'),
      );
      foreach ($custom as $subs) {
        $ops = array(
          l(t('edit'), "{$base_path}/csid/{$subs->csid}/edit"),
          l(t('fields'), "{$base_path}/csid/{$subs->csid}/fields"),
        );
        $rows[] = array(
          l($subs->type, "{$base_path}/csid/{$subs->csid}/edit"),
          check_plain($subs->name),
          check_plain($subs->title),
          implode(' | ', $ops),
        );
      }
      $output .= theme('table', $header, $rows);
    }
    else {
      $output .= '<p>' . t('There are no custom subscriptions defined.') . '</p>';
    }
  }
  $output .= l(t('Add new custom subscription.'), "{$base_path}/new");
  return $output;
}

/**
 * Edit / create custom subscriptions
 * 
 */
function notifications_custom_form($form_state, $subs) {
  $form['#subscription_type'] = $subs;
  $form['subscription'] = array(
    '#tree' => TRUE,
  );
  $form['subscription']['csid'] = array(
    '#type' => 'value',
    '#value' => $subs->csid,
  );
  $form['subscription']['type'] = array(
    '#type' => 'value',
    '#value' => $subs->type,
  );
  $form['subscription']['module'] = array(
    '#type' => 'value',
    '#value' => !empty($subs->module) ? $subs->module : 'notifications_custom',
  );
  $form['subscription']['title'] = array(
    '#type' => 'textfield',
    '#title' => t('Title'),
    '#default_value' => $subs->title,
    '#description' => t('User readable name for this subscription type.'),
    '#required' => TRUE,
    '#weight' => -5,
  );

  // The type will be editable only if its a new subscription type, otherwise will be messy
  $editable = empty($subs->csid);
  $form['subscription']['newtype'] = array(
    '#title' => t('Subscription type'),
    '#type' => 'textfield',
    '#default_value' => $subs->type,
    '#required' => $editable,
    '#disabled' => !$editable,
    '#description' => t('The machine-readable name of this subscription type. This name must contain only lowercase letters, numbers, and underscores. This name must be unique and once created cannot be changed.'),
  );
  $form['subscription']['name'] = array(
    '#type' => 'textfield',
    '#title' => t('Name'),
    '#default_value' => $subs->name,
    '#description' => t('The title of the new subscription that will be shown to the user along with a subscribe checkbox.'),
    '#required' => TRUE,
  );
  $form['subscription']['event_type'] = array(
    '#title' => t('Event type'),
    '#type' => 'select',
    '#options' => notifications_info('event classes'),
    '#default_value' => $subs->event_type,
    '#description' => t('The type of events that will trigger this subscription.'),
  );
  if (!empty($subs->fields)) {
    $form['subscription']['fields'] = array(
      '#type' => 'item',
      '#title' => t('Fields'),
      '#value' => notifications_build_subscription($subs)
        ->format_fields(Notifications_Subscription::FORMAT_TABLE),
    );
  }
  $form['subscription']['description'] = array(
    '#type' => 'textarea',
    '#title' => t('Explanation'),
    '#default_value' => $subs->description,
    '#description' => t('An optional explanation to go with the subscription. The explanation will be shown to the user.'),
  );
  $form['subscription']['visibility'] = array(
    '#type' => 'radios',
    '#title' => t('Visibility'),
    '#default_value' => $subs->visibility,
    '#options' => array(
      t('Hidden option, only accessible by administrators.'),
      t('User editable, will be shown to users.'),
    ),
  );
  $form['subscription']['register'] = array(
    '#type' => 'checkbox',
    '#title' => t('Visible in user registration form.'),
    '#default_value' => $subs->register,
  );
  $form['subscription']['default_value'] = array(
    '#type' => 'checkbox',
    '#title' => t('Enabled for new users.'),
    '#default_value' => $subs->default_value,
    '#description' => t('If checked this subscription will be enabled by default for new users.'),
  );
  $form['subscription']['weight'] = array(
    '#type' => 'weight',
    '#title' => t('Weight'),
    '#default_value' => $subs->weight,
    '#description' => t('The weights define the order in which the form fields are shown. Lighter fields "float up".'),
  );
  $form['buttons'] = array(
    '#type' => 'fieldset',
  );
  $form['buttons']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save'),
  );
  if ($subs->module == 'notifications_custom') {
    $form['buttons']['reset'] = array(
      '#type' => 'submit',
      '#value' => t('Reset to defaults'),
    );
  }
  else {
    $form['buttons']['delete'] = array(
      '#type' => 'submit',
      '#value' => t('Delete'),
    );
  }
  return $form;
}

/**
 * Validate subscription type. Just check for 'type' duplicates
 */
function notifications_custom_form_validate($form, &$form_state) {
  if (empty($form_state['values']['subscription']['csid'])) {
    if (notifications_custom_load($form_state['values']['subscription']['newtype'])) {
      form_set_error('newtype', t('Duplicate subscription type. You need to select a unique string for it.'));
    }
    else {
      $form_state['values']['subscription']['type'] = $form_state['values']['subscription']['newtype'];
    }
  }
}

/**
 * Form submission for custom subscriptions form
 */
function notifications_custom_form_submit($form, &$form_state) {
  $op = isset($form_state['values']['op']) ? $form_state['values']['op'] : '';
  $subs = $form_state['values']['subscription'];
  if ($op == t('Reset to defaults')) {
    notifications_custom_delete($subs['type']);
    notifications_custom_rebuild();
  }
  elseif ($op == t('Delete')) {
    $form_state['redirect'] = 'admin/messaging/customsubs/csid/' . $subs['csid'] . '/delete';
  }
  elseif (empty($subs['csid'])) {
    drupal_write_record('notifications_custom', $subs);
    drupal_set_message(t('The subscription type has been created. Now you must add one or more fields to it.'));
    $form_state['redirect'] = 'admin/messaging/customsubs/csid/' . $subs['csid'] . '/fields';
  }
  else {
    drupal_write_record('notifications_custom', $subs, 'csid');
    drupal_set_message(t('The subscription type has been updated.'));
  }
}

/**
 * Fields form: edit /add fields to custom subscription type
 */
function notifications_custom_fields_form($form_state, $custom_type) {
  notifications_include('object.inc');
  $subscription = notifications_build_subscription($custom_type);
  $form['subscription'] = array(
    '#type' => 'value',
    '#value' => $subscription,
  );

  // Now the hard part, which are the fields. Only when subscriptions is created.
  $form['fields'] = array(
    '#title' => t('Fields'),
    '#type' => 'fieldset',
    '#tree' => 'true',
    '#theme' => 'notifications_custom_fields',
  );

  // Take the values from form state (if submitted) or from the subscription itself
  $fields = array();
  if (!empty($form_state['submitted'])) {
    $fields = notifications_field_parse_submitted($form_state, 'fields');
  }
  else {
    $fields = $subscription
      ->get_fields_array();
  }

  // Build the form with current fields
  if ($fields) {
    foreach ($fields as $fid => $data) {
      $form['fields']['type'][$fid] = array(
        '#type' => 'hidden',
        '#value' => $data['type'],
      );
      $form['fields']['name'][$fid] = array(
        '#value' => notifications_subscription_fields($data['type'], 'name'),
      );
      $form['fields']['delete'][$fid] = array(
        '#type' => 'checkbox',
        '#default_value' => 0,
      );
      $form['fields']['value'][$fid] = array(
        '#type' => 'value',
        '#value' => $data['value'],
      );

      // Generate the editable field value and pass the value only if it doesn't come from a previous submission
      if (empty($data['edit'])) {
        $form['fields']['edit'][$fid] = $subscription
          ->field_element($data['type'], $data['value']);
      }
      else {
        $form['fields']['edit'][$fid] = $subscription
          ->field_element($data['type']);
        $form['fields']['edit'][$fid]['#default_value'] = $data['edit'];
      }
    }
  }
  else {
    $form['fields']['#description'] = t('You have to define at least one field for this subscription.');
  }
  $form['fields']['name']['new'] = array(
    '#type' => 'select',
    '#options' => notifications_subscription_fields(NULL, 'name'),
  );
  $form['fields']['delete']['new'] = array(
    '#value' => t('new'),
  );
  $form['fields']['edit']['new'] = array(
    '#type' => 'submit',
    '#value' => t('Add new field'),
    '#submit' => array(
      'notifications_custom_fields_form_add_field',
    ),
  );
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Save fields'),
  );
  return $form;
}

/**
 * Submit callback for adding new fields
 */
function notifications_custom_fields_form_add_field(&$form, &$form_state) {
  $form_state['values']['fields']['type'][] = $form_state['values']['fields']['name']['new'];
  $form_state['values']['fields']['value'][] = NULL;
  $form_state['values']['fields']['edit'][] = '';
  $form_state['rebuild'] = TRUE;
}

/**
 * Validate field values
 */
function notifications_custom_fields_form_validate($form, &$form_state) {
  notifications_include('object.inc');
  $form_state['field_values'] = notifications_field_validate_submitted($form_state, 'fields', TRUE, TRUE);
}

/**
 * Submit fields form
 */
function notifications_custom_fields_form_submit($form, $form_state) {
  $subscription = $form_state['values']['subscription'];
  $fields = $form_state['field_values'];
  db_query("UPDATE {notifications_custom} SET fields = '%s' WHERE csid = %d", serialize($fields), $subscription->csid);
  drupal_set_message(t('The fields for this subscription have been updated.'));
  $subscription
    ->set_fields($fields);
  notifications_custom_fields_update_all($subscription);
}

/**
 * Update all fields for this subscription type
 */
function notifications_custom_fields_update_all($subscription) {
  if ($count = db_result(db_query("SELECT COUNT(*) FROM {notifications} WHERE type = '%s'", $subscription->type))) {

    // Delete all fields for this subscription type
    db_query("DELETE FROM {notifications_fields} WHERE sid IN (SELECT sid FROM {notifications} WHERE type = '%s')", $subscription->type);

    // Create the new fields
    foreach ($subscription
      ->get_fields() as $field) {
      db_query("INSERT INTO {notifications_fields} (sid, field, value, intval) SELECT sid, '%s', '%s', %d FROM {notifications} WHERE type = '%s'", $field->field, $field->value, (int) $field->value, $subscription->type);
    }
    drupal_set_message(t('@count subscriptions have been updated with the new values.', array(
      '@count' => $count,
    )));
  }
}

/**
 * Menu callback; delete a single subscription type.
 */
function notifications_custom_delete_confirm(&$form_state, $custom) {
  $form['type'] = array(
    '#type' => 'value',
    '#value' => $custom->type,
  );
  $form['name'] = array(
    '#type' => 'value',
    '#value' => $custom->name,
  );
  $message = t('Are you sure you want to delete the subscription type %type?', array(
    '%type' => $custom->name,
  ));
  $caption = '';
  $num_nodes = db_result(db_query("SELECT COUNT(*) FROM {notifications} WHERE type = '%s'", $custom->type));
  if ($num_nodes) {
    $caption .= '<p>' . format_plural($num_nodes, '<strong>Warning:</strong> there is currently 1 %type subscription on your site. It may not be able to be displayed or edited correctly, once you have removed this content type.', '<strong>Warning:</strong> there are currently @count %type subscriptions on your site. They may not be able to be displayed or edited correctly, once you have removed this subscription type.', array(
      '%type' => $custom->name,
    )) . '</p>';
    $form['subscriptions'] = array(
      '#type' => 'checkbox',
      '#title' => t('Delete subscriptions'),
      '#description' => t('Marking this checkbox will delete also all subscription instances of this type for users of this site.'),
    );
  }
  $caption .= '<p>' . t('This action cannot be undone.') . '</p>';
  return confirm_form($form, $message, 'admin/messaging/customsubs', $caption, t('Delete'));
}

/**
 * Process subscription type delete confirm submissions.
 */
function notifications_custom_delete_confirm_submit($form, &$form_state) {
  notifications_custom_delete($form_state['values']['type'], $form_state['values']['subscriptions']);
  $t_args = array(
    '%name' => $form_state['values']['name'],
  );
  drupal_set_message(t('The subscription type %name has been deleted.', $t_args));
  watchdog('notifications', 'Deleted subscription type %name.', $t_args, WATCHDOG_NOTICE);
  $form_state['redirect'] = 'admin/messaging/customsubs';
  return;
}

/**
 * Theme function for fields in form
 */
function theme_notifications_custom_fields($elements) {
  $header = array(
    t('Delete'),
    t('Field type'),
    t('Value'),
  );
  $rows = array();
  foreach (element_children($elements['name']) as $key) {
    $rows[] = array(
      drupal_render($elements['delete'][$key]),
      drupal_render($elements['name'][$key]),
      drupal_render($elements['edit'][$key]),
    );
  }
  $output = theme('table', $header, $rows);
  $output .= drupal_render($elements);
  return $output;
}

Functions

Namesort descending Description
notifications_custom_admin_page Page callback, administer custom subscriptions
notifications_custom_delete_confirm Menu callback; delete a single subscription type.
notifications_custom_delete_confirm_submit Process subscription type delete confirm submissions.
notifications_custom_fields_form Fields form: edit /add fields to custom subscription type
notifications_custom_fields_form_add_field Submit callback for adding new fields
notifications_custom_fields_form_submit Submit fields form
notifications_custom_fields_form_validate Validate field values
notifications_custom_fields_update_all Update all fields for this subscription type
notifications_custom_form Edit / create custom subscriptions
notifications_custom_form_submit Form submission for custom subscriptions form
notifications_custom_form_validate Validate subscription type. Just check for 'type' duplicates
theme_notifications_custom_fields Theme function for fields in form