/** * Implements hook_cron(). */ public static function hookCron() { $handle_content_expiry = ConfigHandler::getHandleContentExpiry(); if ($handle_content_expiry != 2) { $result = DbHandler::selectExpired(); } else { $result = DbHandler::selectExpiredNonFlagged(); } // $nids = array(); // Create NodeTypesConfigHandler once for whole cycle. $config_handler = new NodeTypesConfigHandler(); foreach ($result as $record) { // Try to handle the record. try { // $nids[] = $record->nid; $node_type = $record->type; $action_type = $config_handler->getActionType($node_type); $nid = $record->nid; DbHandler::setExpired($nid); // $node = node_load($record->nid); // rules_invoke_event('node_expired', $node); ActionsHandler::doAction($action_type, $nid); } catch (\Exception $e) { // TODO: Add configurable logging. } } }
/** * Implements hook_form_alter(). * * Adds expiration options to the node entry forms. */ private static function doFormAlter(&$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 = ConfigHandler::getHandleContentExpiry(); 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 = TimestampUtils::dateDbToStr('', $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', ConfigHandler::getDateFormat()); } } // This supports node to never expire. if (empty($ntype['default']) && empty($node->expire)) { $ntype['required'] = FALSE; } if (user_access('edit node expire')) { if (ConfigHandler::getDateEntryElements()) { // Date popups. // TODO: Edit format description sting. $expire_field = array('#title' => t('Expiration date'), '#description' => t('Time date to consider the node expired. Format: %time (%format).', array('%time' => format_date(REQUEST_TIME, 'custom', ConfigHandler::getDateFormat()), '%format' => ConfigHandler::getDateFormat())), '#type' => 'date_popup', '#date_format' => ConfigHandler::getDateFormat(), '#required' => $ntype['required'], '#default_value' => $node->expire); } else { // Text fields. // TODO: Edit format description sting. $expire_field = array('#title' => t('Expiration date'), '#description' => t('Time date to consider the node expired. Format: %time (%format).', array('%time' => format_date(REQUEST_TIME, 'custom', ConfigHandler::getDateFormat()), '%format' => ConfigHandler::getDateFormat())), '#type' => 'textfield', '#maxlength' => 25, '#required' => $ntype['required'], '#default_value' => $node->expire); } } else { $expire_field = array('#type' => 'value', '#value' => $node->expire); } // If we use hidden value, do not create fieldset. if ($expire_field['#type'] == 'value') { $form['options1'] = array(); $form['options1']['expire'] =& $expire_field; } elseif (!$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); } }
/** * Implements hook_form_alter(). */ public static function doFormNodeTypeFormAlterSubmit(&$form, &$form_state) { $ntypes = variable_get('node_expire_ntypes', array()); $handle_content_expiry = ConfigHandler::getHandleContentExpiry(); if ($handle_content_expiry != 0) { $ntypes[$form_state['values']['type']]['enabled'] = $form_state['values']['node_expire_type_cfg_enabled']; } // TODO: replace ['node_expire'] => ['node_expire_default'], // after that optimize. $ntypes[$form_state['values']['type']]['default'] = TimestampUtils::dateStrToCfgDefault($form_state['values']['node_expire_type_cfg_default']); $ntypes[$form_state['values']['type']]['max'] = TimestampUtils::dateStrToCfgDefault($form_state['values']['node_expire_type_cfg_max']); $ntypes[$form_state['values']['type']]['required'] = $form_state['values']['node_expire_type_cfg_required']; $ntypes[$form_state['values']['type']]['action_type'] = ActionsHelper::filterForRules($form_state['values']['node_expire_type_cfg_action_type']); variable_set('node_expire_ntypes', $ntypes); ModuleUtils::doVariablesCleanup(); }
/** * Administrative settings. * * @return array * An array containing form items to place on the module settings page. */ public static function hookAdminSettings() { $form['handle_content_expiry'] = array('#type' => 'fieldset', '#title' => t('Handle content expiry'), '#collapsible' => TRUE, '#collapsed' => FALSE); $form['handle_content_expiry']['node_expire_handle_content_expiry'] = array('#type' => 'radios', '#title' => t('Handle content expiry'), '#default_value' => ConfigHandler::getHandleContentExpiry(), '#options' => array(0 => t('In legacy mode'), 1 => t('Trigger "Content Expired" event every cron run when the node is expired'), 2 => t('Trigger "Content Expired" event only once when the node is expired')), '#description' => t('In non-legacy mode node expiry is set for each node type separately and disabled by default.') . ' ' . t('Enable it at Structure -> Content types -> {Your content type} -> Edit -> Publishing options.') . '<br />' . t('"Trigger "Content Expired" event only once " option allows to ignore nodes, which already have been processed.') . '<br />' . t('Legacy mode means: not possible to allow expiry separately for each particular node type, trigger "Content Expired" event every cron run, legacy data saving')); // Visibility. $states = array('visible' => array(':input[name="node_expire_handle_content_expiry"]' => array(array('value' => '1'), array('value' => '2')))); // Variable node_expire_date_entry_elements is not used in legacy mode, // so in legacy mode it is safe to keep any of it's value. // It is necessary just to take care about proper validation // (see node_expire_admin_settings_validate below). $form['date_entry_elements'] = array('#type' => 'fieldset', '#title' => t('Date values entry elements'), '#collapsible' => TRUE, '#collapsed' => FALSE, '#states' => $states); $form['date_entry_elements']['node_expire_date_entry_elements'] = array('#type' => 'radios', '#title' => t('Enter date values using'), '#default_value' => ConfigHandler::getDateEntryElements(), '#options' => array(0 => t('Text fields'), 1 => t('Date popups')), '#description' => t('"Date popups" option requires Date module to be installed') . ' ' . t('with Date Popup enabled. This option is not available in legacy mode.'), '#states' => $states); $form['date_format'] = array('#type' => 'fieldset', '#title' => t('Format of expiry date'), '#collapsible' => TRUE, '#collapsed' => FALSE); $form['date_format']['node_expire_date_format'] = array('#type' => 'textfield', '#maxlength' => 25, '#title' => t('Format of expiry date'), '#default_value' => ConfigHandler::getDateFormat(), '#description' => t('Format of expiry date.') . ' ' . t('Format: PHP <a href="http://www.php.net/strtotime" target="_blank">strtotime format</a>.')); $form['past_date_allowed'] = array('#type' => 'fieldset', '#title' => t('Expire date in the past'), '#collapsible' => TRUE, '#collapsed' => FALSE); $form['past_date_allowed']['node_expire_past_date_allowed'] = array('#type' => 'checkbox', '#title' => t('Allow expire date in the past'), '#default_value' => ConfigHandler::getPastDateAllowed(), '#description' => t('Checking this box will allow to save nodes with expire date in the past. This is helpful during site development and testing.')); // End of node_expire_admin_settings(). return system_settings_form($form); }
/** * Implements hook_node_update() and hook_node_insert(). */ private static function doNodeUpdateInsert(&$ntype, $node) { $handle_content_expiry = ConfigHandler::getHandleContentExpiry(); if ($handle_content_expiry == 0) { // Old (legacy) style of processing. // Has the expiration been removed, or does it exist? if (isset($node->expire)) { DbHandler::deleteNodeExpire($node->nid); // Should we create a new record? if ($node->expire) { if (strtotime($node->expire)) { $node->expire = strtotime($node->expire); } $node->expired = FALSE; drupal_write_record('node_expire', $node); } } } else { if (!isset($ntype['enabled']) || !$ntype['enabled']) { return; } // Create a proper $node_expire stdClass. $node_expire = new \stdClass(); $node_expire->nid = $node->nid; // 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); self::doNodePrepare($ntype, $node); } // Expire. $date_expire = TimestampUtils::dateStrToDb($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 = TimestampUtils::dateStrToDb($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. DbHandler::writeRecord($node_expire, $node->nid); } }