You are here

scs.module in Simplenews Content Selection 8

Same filename and directory in other branches
  1. 6.2 scs.module
  2. 6 scs.module
  3. 7.2 scs.module
  4. 7 scs.module

General hooks and commonly-used functions

File

scs.module
View source
<?php

/**
 * @file
 * General hooks and commonly-used functions
 */

/**
 * Implements hook_menu()
 */
function scs_menu() {
  $items = array();
  $items['admin/config/services/simplenews/settings/scs'] = array(
    'title' => 'Simplenews Content Selection',
    'description' => 'Configure what node types could be used for SCS',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'scs_admin_settings_form',
    ),
    'access arguments' => array(
      'administer scs',
    ),
    'file' => 'scs.admin.inc',
    'type' => MENU_LOCAL_TASK,
  );
  return $items;
}

/**
 * Implements hook_permission()
 */
function scs_permission() {
  return array(
    'administer scs' => array(
      'title' => t('Administer Simplenews Content Selection'),
      'description' => t('User can perform administrative tasks like changing view mode and newsletter content type.'),
    ),
  );
}

/**
 * Implements hook_theme()
 */
function scs_theme() {
  return array(
    'scs_sortable_table' => array(
      'render element' => 'form',
      'file' => 'scs.theme.inc',
    ),
    'scs_newsletter' => array(
      'variables' => array(
        'nodes' => array(),
        'toc' => FALSE,
      ),
      'template' => 'scs-newsletter',
      'file' => 'scs.theme.inc',
    ),
    'scs_toc' => array(
      'variables' => array(
        'nodes' => array(),
      ),
      'file' => 'scs.theme.inc',
    ),
  );
}

/**
 * Implements hook_node_operations().
 */
function scs_node_operations() {
  $operations = array(
    'scs_create' => array(
      'label' => t('Create newsletter'),
      'callback' => NULL,
    ),
  );
  return $operations;
}

/**
 * Implements hook_entity_info().
 */
function scs_entity_info() {
  $return = array(
    'node' => array(
      'view modes' => array(
        'scs' => array(
          'label' => t('Simplenews Content Selection'),
          'custom settings' => TRUE,
        ),
      ),
    ),
  );
  return $return;
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function scs_form_node_admin_content_alter(&$form, &$form_state) {

  // Add an extra multistep operation to admin/content/node
  if (isset($form_state['values']['operation']) && $form_state['values']['operation'] == 'scs_create') {
    unset($form['filter']);
    unset($form['admin']);
    drupal_set_title(t('Sort nodes'));

    // Show the sorting form + ToC checkbox
    $form = array_merge($form, scs_node_sort_form($form, $form_state));
    $form['#submit'][] = 'scs_node_sort_submit';

    // Redirect to the simplenews node form
    $type = strtr(variable_get('scs_node_type', 'simplenews'), '_', '-');
    $form['#action'] = url('node/add/' . $type);
  }
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function scs_form_node_form_alter(&$form, &$form_state) {

  // Check that we are creating a newsletter and that we come from the
  // admin/content/node
  if (!empty($form['#node_edit_form']) && in_array($form['type']['#value'], simplenews_get_content_types()) && ($form_state['input']['op'] = t('Create newsletter') && isset($form_state['input']['nodes']))) {
    $nodes = \Drupal::entityTypeManager()
      ->getStorage('node')
      ->loadMultiple(array_keys($form_state['input']['nodes']));
    foreach ($nodes as $node) {
      $node->scs_view_mode = $form_state['input']['nodes'][$node->nid]['view_mode'];
    }
    $form['body'][LANGUAGE_NONE][0]['#default_value'] = theme('scs_newsletter', array(
      'nodes' => $nodes,
      'toc' => empty($form_state['input']['scs_toc']) ? FALSE : TRUE,
    ));
  }
}

/**
 * Form callback: second step of the selection form, sorting nodes
 */
function scs_node_sort_form($form, &$form_state) {
  $nodes = array_filter($form_state['values']['nodes']);

  // Checkbox for Table of contents
  $form['scs_toc'] = array(
    '#type' => 'checkbox',
    '#title' => t('Create a table of contents'),
    '#description' => t('Create a table of contents at top of the newsletter with the titles of the selected nodes. If newsletter is HTML format, these table of contents will be bookmarks.'),
  );

  // Create elements for the tablesort
  $form['nodes']['#tree'] = TRUE;
  foreach ($nodes as $nid) {
    $form['nodes'][$nid]['weight'] = array(
      '#type' => 'weight',
      '#attributes' => array(
        'class' => array(
          'node-weight',
        ),
      ),
    );
    $form['nodes'][$nid]['view_mode'] = array(
      '#type' => 'select',
      '#options' => scs_view_mode_options(),
    );
  }
  $form['#theme'] = 'scs_sortable_table';
  $form['actions']['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Create newsletter'),
  );
  return $form;
}

/**
 * Form callback: submit handler for sorting nodes
 */
function scs_node_sort_submit(&$form, &$form_state) {
  uasort($form_state['values']['nodes'], 'drupal_sort_weight');
}

/**
 * Put together a option list based on selected view modes
 */
function scs_view_mode_options() {
  $entity_info = entity_get_info();
  $view_modes = array_filter(variable_get('scs_view_mode', array(
    'scs' => 1,
  )));
  $options = array();
  foreach ($view_modes as $machine_name => $status) {
    if ($status) {
      $options[$machine_name] = $entity_info['node']['view modes'][$machine_name]['label'];
    }
  }
  return $options;
}

Functions

Namesort descending Description
scs_entity_info Implements hook_entity_info().
scs_form_node_admin_content_alter Implements hook_form_FORM_ID_alter().
scs_form_node_form_alter Implements hook_form_FORM_ID_alter().
scs_menu Implements hook_menu()
scs_node_operations Implements hook_node_operations().
scs_node_sort_form Form callback: second step of the selection form, sorting nodes
scs_node_sort_submit Form callback: submit handler for sorting nodes
scs_permission Implements hook_permission()
scs_theme Implements hook_theme()
scs_view_mode_options Put together a option list based on selected view modes