You are here

node_expire.nodeapi.inc in Node expire 8

Node API integration.

File

node_expire.nodeapi.inc
View source
<?php

/**
 * @file
 * Node API integration.
 */

/**
 * Implements hook_node_load().
 */
function _node_expire_node_load($nodes, $types) {

  // Only deal with node types that have the Node expire feature enabled.
  // @FIXME
  // Could not extract the default value because it is either indeterminate, or
  // not scalar. You'll need to provide a default value in
  // config/install/node_expire.settings.yml and config/schema/node_expire.schema.yml.
  $ntypes = \Drupal::config('node_expire.settings')
    ->get('node_expire_ntypes');
  $node_expire_enabled = array();

  // Check if node_expire are enabled for each node.
  // If node_expires are not enabled, do nothing.
  foreach ($nodes as $node) {

    // Store whether node_expires are enabled for this node.
    if (isset($ntypes[$node->type]) and $ntypes = $ntypes[$node->type]) {
      $node_expire_enabled[] = $node->nid;
    }
  }

  // For nodes with node_expire enabled, fetch information from the database.
  if (!empty($node_expire_enabled)) {
    $handle_content_expiry = \Drupal::config('node_expire.settings')
      ->get('node_expire_handle_content_expiry');
    $result = db_query('SELECT n.nid, n.type, expire, expired, lastnotify
       FROM {node} n
         INNER JOIN {node_expire} ne
           ON n.nid = ne.nid
       WHERE n.nid
         IN (:node_expire_enabled)', array(
      ':node_expire_enabled' => $node_expire_enabled,
    ));
    foreach ($result as $record) {
      if ($handle_content_expiry == 0) {
        $nodes[$record->nid]->expire = $record->expire;
      }
      else {
        $ntype = isset($ntypes[$record->type]) ? $ntypes[$record->type] : NULL;
        $nodes[$record->nid]->expire = _node_expire_date_db_to_str($record->expire, $ntype);
      }
      $nodes[$record->nid]->expired = $record->expired;
      $nodes[$record->nid]->lastnotify = $record->lastnotify;
    }
  }
}

/**
 * Implements hook_node_prepare().
 */
function _node_expire_node_prepare(&$ntype, \Drupal\node\NodeInterface $node) {

  // To prevent default value 1969-12-31 check also $ntypes['default'].
  if (!isset($node->expire) && $ntype['default']) {
    $node->expire = format_date(strtotime($ntype['default']), 'custom', NODE_EXPIRE_FORMAT);
  }

  // This gives a way to users without edit exipration permission
  // to update nodes with default expiration.
  if (isset($node->expire) && !\Drupal::currentUser()
    ->hasPermission('edit node expire')) {
    $node->expire = format_date(strtotime($ntype['default']), 'custom', NODE_EXPIRE_FORMAT);
  }
}

/**
 * Implements hook_node_validate().
 */
function _node_expire_node_validate(&$ntype, \Drupal\node\NodeInterface $node) {
  $handle_content_expiry = \Drupal::config('node_expire.settings')
    ->get('node_expire_handle_content_expiry');
  if ($handle_content_expiry != 0) {
    if (!isset($ntype['enabled']) || !$ntype['enabled']) {
      return;
    }
  }

  // The only restriction we have is that the node can't expire in the past.
  if ($node->expire == '') {
    if (!empty($ntype['required']) && $ntype['default']) {
      form_set_error('expire_date', t('You must choose an expiration date.'));
    }
  }
  elseif (!($expire = strtotime($node->expire)) or $expire <= 0) {
    form_set_error('expire_date', t('You have to specify a valid expiration date.'));
  }
  elseif (\Drupal::config('node_expire.settings')
    ->get('node_expire_past_date_allowed') == 0 && $expire <= REQUEST_TIME) {
    form_set_error('expire_date', t("You can't expire a node in the past!"));
  }
  elseif (!empty($ntype['max']) and $expire > strtotime($ntype['max'], $node
    ->getCreatedTime())) {
    form_set_error('expire_date', t('It must expire before %date.', array(
      '%date' => format_date(strtotime($ntype['max'], $node
        ->getCreatedTime()), 'custom', NODE_EXPIRE_FORMAT),
    )));
  }
}

/**
 * Implements hook_node_update() and hook_node_insert().
 */
function _node_expire_node_update_insert(&$ntype, \Drupal\node\NodeInterface $node) {
  $handle_content_expiry = \Drupal::config('node_expire.settings')
    ->get('node_expire_handle_content_expiry');
  if ($handle_content_expiry == 0) {

    // Old (legacy) style of processing.
    // Has the expiration been removed, or does it exist?
    if (isset($node->expire)) {
      db_delete('node_expire')
        ->condition('nid', $node
        ->id())
        ->execute();

      // Should we create a new record?
      if ($node->expire) {
        if (strtotime($node->expire)) {
          $node->expire = strtotime($node->expire);
        }
        $node->expired = FALSE;
        \Drupal::database()
          ->insert('node_expire')
          ->fields($node)
          ->execute();
      }
    }
  }
  else {
    if (!isset($ntype['enabled']) || !$ntype['enabled']) {
      return;
    }

    // Create a proper $node_expire stdClass.
    $node_expire = new stdClass();
    $node_expire->nid = $node
      ->id();

    // For compatibility with Node Clone module.
    // Set default $node->expire value if it is not set.
    if (!isset($node->expire)) {
      _node_expire_node_prepare($ntype, $node);
    }

    // Expire.
    $date_expire = _node_expire_date_str_to_db($node->expire, $ntype);
    $node_expire->expire = $date_expire;

    // Lastnotify.
    if (isset($node->lastnotify)) {
      $node_expire->lastnotify = $node->lastnotify;
    }
    else {

      // Default value.
      $node_expire->lastnotify = 0;
    }

    // Expired.
    if (isset($node->expired)) {
      $node_expire->new_record = 0;
      $node_expire->expired = $node->expired;
      if ($node_expire->expire >= NODE_EXPIRE_NO_EXPIRE) {

        // No expiry for this node.
        $node_expire->expired = 0;
      }
    }
    elseif (isset($node->original->expired)) {

      // For VBO (Views Bulk Operations) compatibility.
      // With VBO it is necessary to get all Node expire information
      // from $node->original instead of $node.
      $node_expire->new_record = 0;
      $node_expire->expired = $node->original->expired;

      // Also get other Node expire values.
      // Expire.
      $date_expire = _node_expire_date_str_to_db($node->original->expire, $ntype);
      $node_expire->expire = $date_expire;

      // Lastnotify.
      if (isset($node->original->lastnotify)) {
        $node_expire->lastnotify = $node->original->lastnotify;
      }
      else {

        // Default value.
        $node_expire->lastnotify = 0;
      }
      if ($node_expire->expire >= NODE_EXPIRE_NO_EXPIRE) {

        // No expiry for this node.
        $node_expire->expired = 0;
      }
    }
    else {

      // No record in the database yet.
      $node_expire->new_record = 1;

      // Default value.
      $node_expire->expired = 0;
    }

    // Write the record.
    _node_expire_write_record($node_expire, $node
      ->id());
  }
}

/**
 * Writes node_expire record.
 */
function _node_expire_write_record($node_expire, $nid) {

  // Check, is it insert or update.
  $cnt = db_query('SELECT count(nid)
     FROM {node_expire} ne
     WHERE ne.nid = :nid', array(
    ':nid' => $nid,
  ))
    ->fetchField();

  // Write the record.
  if ($cnt == 0) {

    // Insert.
    \Drupal::database()
      ->insert('node_expire')
      ->fields($node_expire)
      ->execute();
  }
  else {

    // Update.
    \Drupal::database()
      ->merge('node_expire')
      ->fields($node_expire)
      ->key([
      'nid',
    ])
      ->execute();
  }
}

/**
 * Implements hook_node_delete().
 */
function _node_expire_node_delete(&$ntype, \Drupal\node\NodeInterface $node) {
  db_delete('node_expire')
    ->condition('nid', $node
    ->id())
    ->execute();
}

/**
 * Implements hook_form_alter().
 *
 * Adds expiration options to the node entry forms
 */
function _node_expire_form_alter_nodeform(&$ntype, &$form, &$form_state, $form_id) {

  // Check if the Node expire feature is enabled for the node type.
  $node = isset($form['#node']) ? $form['#node'] : NULL;
  $handle_content_expiry = \Drupal::config('node_expire.settings')
    ->get('node_expire_handle_content_expiry');
  if ($handle_content_expiry != 0) {
    if (empty($ntype['enabled'])) {
      return;
    }

    // Replace not set to default string.
    if (!isset($node->expire)) {

      // $ntype = isset($ntypes[$node->type]) ? $ntypes[$node->type] : NULL;
      $node->expire = _node_expire_date_db_to_str('', $ntype);
    }
  }
  else {

    // Replace not set to empty string.
    if (!isset($node->expire)) {
      $node->expire = '';
    }

    // Convert the timestamp into a human readable date - legacy branch.
    if (is_numeric($node->expire)) {
      $node->expire = format_date($node->expire, 'custom', NODE_EXPIRE_FORMAT);
    }
  }

  // This supports node to never expire.
  if (empty($ntype['default']) && empty($node->expire)) {
    $ntype['required'] = FALSE;
  }
  if (\Drupal::currentUser()
    ->hasPermission('edit node expire')) {
    if (_node_expire_get_date_entry_elements()) {

      // Date popups.
      $expire_field = array(
        '#title' => t('Expiration date'),
        '#description' => t('Time date to consider the node expired. Format: %time (YYYY-MM-DD).', array(
          '%time' => format_date(REQUEST_TIME, 'custom', NODE_EXPIRE_FORMAT),
        )),
        '#type' => 'date_popup',
        '#date_format' => NODE_EXPIRE_FORMAT,
        '#required' => $ntype['required'],
        '#default_value' => $node->expire,
      );
    }
    else {

      // Text fields.
      $expire_field = array(
        '#title' => t('Expiration date'),
        '#description' => t('Time date to consider the node expired. Format: %time (YYYY-MM-DD).', array(
          '%time' => format_date(REQUEST_TIME, 'custom', NODE_EXPIRE_FORMAT),
        )),
        '#type' => 'textfield',
        '#maxlength' => 25,
        '#required' => $ntype['required'],
        '#default_value' => $node->expire,
      );
    }
  }
  else {
    $expire_field = array(
      '#type' => 'value',
      '#value' => $node->expire,
    );
  }

  // If the form doesn't have the publishing options we'll create our own.
  if (!$form['options']['#access']) {
    $form['options1'] = array(
      '#type' => 'fieldset',
      '#title' => t('Publishing options'),
      '#collapsible' => TRUE,
      '#collapsed' => FALSE,
      '#weight' => 95,
    );
    $form['options1']['expire'] =& $expire_field;
  }
  else {
    $form['options']['expire'] =& $expire_field;
  }
  if (isset($node->expired)) {
    $form['node_expire'] = array(
      '#type' => 'value',
      '#value' => TRUE,
    );
  }
}

/**
 * Convert date string to timestamp int.
 *
 * @param string $date_in
 *   String date representation for UI:
 *   not set, non-date string, date string.
 * @param object $ntype
 *   Node expire configuration for particular node type.
 *
 * @return int
 *   Timestamp (int) date representation for DB:
 *   timestamp int, NODE_EXPIRE_NO_EXPIRE as a special value.
 */
function _node_expire_date_str_to_db($date_in, $ntype) {
  if (!isset($date_in)) {
    $date_out = NODE_EXPIRE_NO_EXPIRE;
    return $date_out;
  }
  $date_inner = trim($date_in);
  if (!strtotime($date_inner)) {

    // Make a valid date string.
    if (isset($ntype) && !empty($ntype->default) && strtotime($ntype->default)) {
      $date_inner = $ntype->default;
    }
    else {
      $date_out = NODE_EXPIRE_NO_EXPIRE;
      return $date_out;
    }
  }
  $date_out = strtotime($date_inner);
  return $date_out;
}

/**
 * Convert timestamp int to date string.
 *
 * @param int $date_in
 *   Timestamp (int) date representation for DB:
 *   not set, timestamp int.
 * @param object $ntype
 *   Node expire configuration for particular node type.
 *
 * @return string
 *   String date representation for UI:
 *   date string or ''.
 */
function _node_expire_date_db_to_str($date_in, $ntype) {
  $date_inner = $date_in;
  if (empty($date_inner) || !_node_expire_is_valid_time_stamp($date_inner)) {
    if (isset($ntype) && !empty($ntype->default) && strtotime($ntype->default)) {
      $date_out = $ntype->default;
    }
    else {
      $date_out = '';
    }
  }
  elseif ($date_inner >= NODE_EXPIRE_NO_EXPIRE) {
    $date_out = '';
  }
  else {
    $date_out = date(NODE_EXPIRE_FORMAT, $date_inner);
  }
  return $date_out;
}

/**
 * Checks timestamp to be valid.
 */
function _node_expire_is_valid_time_stamp($timestamp) {
  return (string) (int) $timestamp === $timestamp && $timestamp <= PHP_INT_MAX && $timestamp >= ~PHP_INT_MAX;
}

Functions

Namesort descending Description
_node_expire_date_db_to_str Convert timestamp int to date string.
_node_expire_date_str_to_db Convert date string to timestamp int.
_node_expire_form_alter_nodeform Implements hook_form_alter().
_node_expire_is_valid_time_stamp Checks timestamp to be valid.
_node_expire_node_delete Implements hook_node_delete().
_node_expire_node_load Implements hook_node_load().
_node_expire_node_prepare Implements hook_node_prepare().
_node_expire_node_update_insert Implements hook_node_update() and hook_node_insert().
_node_expire_node_validate Implements hook_node_validate().
_node_expire_write_record Writes node_expire record.