node_registration.forms.inc in Node registration 7
New registration forms. Public and admin.
File
includes/node_registration.forms.incView source
<?php
/**
* @file
* New registration forms. Public and admin.
*/
/**
* Page callback for registration/%node_registration/toggle/ajax/%/%.
*/
function node_registration_toggle_flag($registration, $ajax, $field, $new_value) {
$ajax = $ajax == 'ajax';
$registration->{$field} = (int) (bool) $new_value;
$registration
->save();
if ($ajax) {
// Drupal 7.39+ is paranoid about their Ajax URLs.
// @see ajax.options.success in ajax.js.
if (function_exists('ajax_set_verification_header')) {
ajax_set_verification_header();
}
// What a mess, just to reload the page. CTools doesn't help here either.
$commands = array(
ajax_command_prepend('head', '<script>location.reload()</script>'),
);
print drupal_json_encode($commands);
exit;
}
drupal_goto();
}
/**
* Admin: registration types form.
*
* This is a form, because a form can be altered by other modules
* and then rendered/themed by this module. No buttons or handlers.
*/
function node_registration_types_form($form, $form_state) {
$module_path = _node_registration_type_to_uri('node_registration');
$form['#theme'] = 'node_registration_types_form';
$form['types'] = array(
'#tree' => TRUE,
);
foreach (node_type_get_names() as $type => $name) {
$enabled = _node_registration_node_type_enabled($type);
$operations = array();
if ($enabled) {
$operations['settings'] = array(
'#title' => t('settings'),
'#type' => 'link',
'#href' => 'admin/structure/' . $module_path . '/manage/' . $type . '/settings',
);
$operations['fields'] = array(
'#title' => t('fields'),
'#type' => 'link',
'#href' => 'admin/structure/' . $module_path . '/manage/' . $type . '/fields',
);
$operations['display'] = array(
'#title' => t('display'),
'#type' => 'link',
'#href' => 'admin/structure/' . $module_path . '/manage/' . $type . '/display',
);
}
$form['types'][$type] = array(
'#name' => $name,
'#enabled' => $enabled,
'#operations' => $operations,
);
}
return $form;
}
/**
* Action mail form.
*/
function node_registration_send_mail_action_form($context, $form_state) {
$values = $form_state['values'];
$selection = array_filter($values['views_bulk_operations']);
$form = array();
$registrations = node_registration_load_multiple($selection);
$form['#registrations'] = $registrations;
$form['recipients'] = array(
'#type' => 'item',
'#title' => t('Recipients'),
'#markup' => count($registrations),
);
$form['recipientfield'] = array(
'#type' => 'textfield',
'#title' => t('Recipient field (token)'),
'#default_value' => '[node-registration:email]',
'#required' => TRUE,
);
$form['bcc'] = array(
'#type' => 'textfield',
'#title' => t('Send BCC to'),
'#element_validate' => array(
'value_is_email',
),
'#max' => 20,
);
$form['message'] = array(
'#type' => 'fieldset',
'#title' => t('Message'),
);
$form['message']['subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#required' => TRUE,
);
$form['message']['message'] = array(
'#type' => 'textarea',
'#title' => t('Message'),
'#required' => TRUE,
'#cols' => '80',
'#rows' => '10',
);
/*$form['attachments'] = array(
'#type' => 'file',
'#title' => t('Attachments'),
'#name' => 'attachments[]',
'#attributes' => array('multiple' => ''),
);*/
$form['from'] = array(
'#type' => 'fieldset',
'#title' => t('From'),
);
$form['from']['from_name'] = array(
'#type' => 'textfield',
'#title' => t('Name'),
'#required' => TRUE,
'#default_value' => _node_registration_default_from_name(),
);
$form['from']['from_email'] = array(
'#type' => 'textfield',
'#title' => t('E-mail'),
'#required' => TRUE,
'#element_validate' => array(
'value_is_email',
),
'#default_value' => variable_get('site_mail'),
);
return $form;
}
/**
* Submit handler for node_registration_send_mail_action() form.
*
* Collects and returns a context to be used in the actual action.
*
* @see node_registration_send_mail_action()
*/
function node_registration_send_mail_action_submit($form, &$form_state) {
$values = $form_state['values'];
unset($values['submit'], $values['form_build_id'], $values['form_token'], $values['form_id'], $values['op']);
return $values;
}
/**
* All registration settings for registration types and nodes.
*/
function _node_registration_type_settings_form($type, $settings, $node = NULL) {
$strtotime_help = t('Use minutes, hours, days and weeks to provide a period. E.g.: <code>1 day 4 hours</code> or <code>50 hours</code>.');
$relative_utc = $node ? $node->registration
->site_utc() : REQUEST_TIME;
$form['register_cancel'] = array(
'#type' => 'fieldset',
'#title' => t('Register & Cancel'),
'#collapsible' => TRUE,
);
$form['register_cancel']['allow_registration_until'] = array(
'#type' => 'textfield',
'#title' => t('Allow registrations until'),
'#description' => $strtotime_help . ' ' . _node_registration_strtotime_debug($settings->allow_registration_until, $relative_utc),
'#default_value' => $settings->allow_registration_until,
'#field_suffix' => ' ' . t('before'),
'#element_validate' => array(
'_node_registration_value_is_strtotime',
),
'#weight' => -9,
);
$form['register_cancel']['registration_success_message'] = array(
'#type' => 'textfield',
'#title' => t('Registration success message'),
'#default_value' => $settings->registration_success_message,
'#description' => t('You can use HTML. URL for the new registration: @registration_url.') . _node_registration_translation_description_for($settings->registration_success_message, ''),
'#nr_locale_kick' => array(
'context' => FALSE,
),
);
$form['register_cancel']['allow_cancellation_until'] = array(
'#type' => 'textfield',
'#title' => t('Allow cancellations until'),
'#description' => $strtotime_help . ' ' . _node_registration_strtotime_debug($settings->allow_cancellation_until, $relative_utc),
'#default_value' => $settings->allow_cancellation_until,
'#field_suffix' => ' ' . t('before'),
'#element_validate' => array(
'_node_registration_value_is_strtotime',
),
);
$form['numbers'] = array(
'#type' => 'fieldset',
'#title' => t('Numbers'),
'#collapsible' => TRUE,
);
$form['numbers']['capacity'] = array(
'#type' => 'textfield',
'#title' => t('Capacity'),
'#size' => 6,
'#description' => t('This many <strong>slots</strong> can be filled. One registration >= 1 slot.'),
'#default_value' => $settings->capacity,
'#element_validate' => array(
'value_is_integer',
),
'#min' => 0,
'#required' => TRUE,
);
if ($settings->capacity_field) {
unset($form['numbers']['capacity']);
$form['numbers']['capacity'] = array(
'#type' => 'item',
'#title' => t('Capacity'),
'#markup' => is_callable(array(
$settings,
'capacity',
)) ? $settings
->capacity() : '-',
'#description' => t('This field is not editable and <strong>not used</strong>, because %field has been set as Capacity source field.', array(
'%field' => $settings->capacity_field,
)),
);
}
$form['numbers']['capacity']['#description'] .= ' ' . t("Empty or <code>0</code> means capacity is unlimited, waiting list will never be used.");
$form['numbers']['allow_exceeding_capacity'] = array(
'#type' => 'checkbox',
'#title' => t('Allow exceeding capacity (waiting list)'),
'#description' => t('Allows people to register even after capacity has been reached.'),
'#default_value' => $settings->allow_exceeding_capacity,
);
$form['numbers']['max_slots_per_registration_authenticated'] = array(
'#type' => 'textfield',
'#title' => t('Max slots per authenticated registration'),
'#size' => 6,
'#description' => t('This many <strong>slots</strong> can be consumed by 1 registration by an <strong>authenticated</strong> user. Set to 0 to disallow authenticated users.'),
'#default_value' => $settings->max_slots_per_registration_authenticated,
'#element_validate' => array(
'value_is_integer',
),
'#min' => 0,
);
$form['numbers']['max_slots_per_registration_anonymous'] = array(
'#type' => 'textfield',
'#title' => t('Max slots per anonymous registration'),
'#size' => 6,
'#description' => t('This many <strong>slots</strong> can be consumed by 1 registration by an <strong>anonymous</strong> user. Set to 0 to disallow anonymous users.'),
'#default_value' => $settings->max_slots_per_registration_anonymous,
'#element_validate' => array(
'value_is_integer',
),
'#min' => 0,
);
$form['numbers']['allow_email_change'] = array(
'#type' => 'checkbox',
'#title' => t('Allow e-mail address change?'),
'#description' => t('Allows signed in users to change their e-mail address via the registration interface/form.'),
'#default_value' => $settings->allow_email_change,
);
$form['numbers']['require_email_verification'] = array(
'#type' => 'checkbox',
'#title' => t('Require e-mail address verification?'),
'#description' => t('Forces a) authenticated users to verify their changed e-mail address OR b) anonymous users to verify their e-mail address.'),
'#default_value' => FALSE && $settings->require_email_verification,
'#disabled' => TRUE,
);
$accepts_tokens = ' ' . t('Accepts tokens.');
$any_mail = $settings->send_mail_to_registree + $settings->send_mail_to_admin + $settings->send_reminder_mail_to_registrees + $settings->send_cancel_mail_to_registree + $settings->send_cancel_mail_to_admin + $settings->send_unwaitinglist_mail_to_registree;
$form['email'] = array(
'#type' => 'fieldset',
'#title' => t('E-mail'),
'#collapsible' => TRUE,
'#collapsed' => !$any_mail,
);
if (module_exists('locale')) {
$menu_item = menu_get_item('admin/config/regional/translate/translate');
if (!empty($menu_item['access'])) {
$form['email']['#description'] = t('Mail texts are translatable via the <a href="!url">interface translation UI</a>. Saving this form adds relevant source strings.', array(
'!url' => url('admin/config/regional/translate/translate'),
));
}
}
$form['email']['sender_name'] = array(
'#type' => 'textfield',
'#title' => t('Sender name'),
'#default_value' => $settings->sender_name,
'#description' => t('Defaults to the site name: %site_name.', array(
'%site_name' => _node_registration_default_from_name(),
)),
);
$form['email']['sender_mail'] = array(
'#type' => 'textfield',
'#title' => t('Sender e-mail address'),
'#default_value' => $settings->sender_mail,
'#element_validate' => array(
'value_is_email_or_token',
),
'#description' => t('Defaults to the site e-mail: %site_email.', array(
'%site_email' => variable_get('site_mail'),
)) . $accepts_tokens,
);
if (module_exists('mimemail')) {
$form['email']['mail_system'] = array(
'#type' => 'radios',
'#title' => t('Mail system'),
'#default_value' => $settings->mail_system,
'#required' => TRUE,
'#options' => array(
0 => t('Default Drupal mail system'),
1 => t('MimeMail with attachments support'),
),
'#description' => t('Defaults to the default Drupal mail system, if MimeMail is enabled it allows for sending attachments with mails (mimemail module is necessary)'),
);
}
$form['email']['mail_to_registree'] = array(
'#type' => 'fieldset',
'#title' => t('Register e-mail to registree'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->send_mail_to_registree,
);
$form['email']['mail_to_registree']['send_mail_to_registree'] = array(
'#type' => 'checkbox',
'#title' => t('Send e-mail to registree'),
'#default_value' => $settings->send_mail_to_registree,
);
$form['email']['mail_to_registree']['mail_to_registree_bcc'] = array(
'#type' => 'textfield',
'#title' => t('Send BCC to'),
'#default_value' => $settings->mail_to_registree_bcc,
'#element_validate' => array(
'value_is_email_or_token',
),
'#max' => 20,
'#description' => t('A (comma separated) list of e-mail addresses to send this notification to.') . $accepts_tokens,
);
$form['email']['mail_to_registree']['mail_to_registree_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->mail_to_registree_subject,
'#description' => trim(_node_registration_translation_description_for($settings->mail_to_registree_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['mail_to_registree']['mail_to_registree_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->mail_to_registree_body,
'#description' => trim(_node_registration_translation_description_for($settings->mail_to_registree_body)),
'#nr_locale_kick' => TRUE,
);
$form['email']['mail_to_registree']['mail_for_waiting_list_registree'] = array(
'#type' => 'fieldset',
'#title' => t('Change e-mail for waiting list registrees'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->change_mail_for_waiting_list_registree,
);
$form['email']['mail_to_registree']['mail_for_waiting_list_registree']['change_mail_for_waiting_list_registree'] = array(
'#type' => 'checkbox',
'#title' => t('Yes, different e-mail for waiting list registrees'),
'#default_value' => $settings->change_mail_for_waiting_list_registree,
);
$form['email']['mail_to_registree']['mail_for_waiting_list_registree']['mail_for_waiting_list_registree_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->mail_for_waiting_list_registree_subject,
'#description' => trim(_node_registration_translation_description_for($settings->mail_for_waiting_list_registree_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['mail_to_registree']['mail_for_waiting_list_registree']['mail_for_waiting_list_registree_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->mail_for_waiting_list_registree_body,
'#description' => trim(_node_registration_translation_description_for($settings->mail_for_waiting_list_registree_body)),
'#nr_locale_kick' => TRUE,
);
$form['email']['mail_to_admin'] = array(
'#type' => 'fieldset',
'#title' => t('Register e-mail to admin'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->send_mail_to_admin,
);
$form['email']['mail_to_admin']['send_mail_to_admin'] = array(
'#type' => 'checkbox',
'#title' => t('Send e-mail to admin'),
'#default_value' => $settings->send_mail_to_admin,
);
$form['email']['mail_to_admin']['mail_to_admin_recipients'] = array(
'#type' => 'textfield',
'#title' => t('Recipients'),
'#default_value' => $settings->mail_to_admin_recipients,
'#element_validate' => array(
'value_is_email_or_token',
),
'#max' => 20,
'#description' => t('A (comma separated) list of e-mail addresses to send this notification to.') . $accepts_tokens,
);
$form['email']['mail_to_admin']['mail_to_admin_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->mail_to_admin_subject,
'#description' => trim(_node_registration_translation_description_for($settings->mail_to_admin_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['mail_to_admin']['mail_to_admin_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->mail_to_admin_body,
'#description' => trim(_node_registration_translation_description_for($settings->mail_to_admin_body)),
'#nr_locale_kick' => TRUE,
);
$form['email']['reminder_mail_to_registrees'] = array(
'#type' => 'fieldset',
'#title' => t('Reminder e-mail to registrees'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->send_reminder_mail_to_registrees,
);
$form['email']['reminder_mail_to_registrees']['send_reminder_mail_to_registrees'] = array(
'#type' => 'checkbox',
'#title' => t('Send e-mail to registree'),
'#default_value' => $settings->send_reminder_mail_to_registrees,
);
$form['email']['reminder_mail_to_registrees']['send_reminders_before'] = array(
'#type' => 'textfield',
'#title' => t('Send reminder'),
'#description' => $strtotime_help . ' ' . _node_registration_strtotime_debug($settings->send_reminders_before, $relative_utc),
'#default_value' => $settings->send_reminders_before,
'#field_suffix' => ' ' . t('before'),
'#element_validate' => array(
'_node_registration_value_is_strtotime',
),
);
$form['email']['reminder_mail_to_registrees']['reminder_mail_to_registrees_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->reminder_mail_to_registrees_subject,
'#description' => trim(_node_registration_translation_description_for($settings->reminder_mail_to_registrees_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['reminder_mail_to_registrees']['reminder_mail_to_registrees_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->reminder_mail_to_registrees_body,
'#description' => trim(_node_registration_translation_description_for($settings->reminder_mail_to_registrees_body)),
'#nr_locale_kick' => TRUE,
);
$form['email']['cancel_mail_to_registree'] = array(
'#type' => 'fieldset',
'#title' => t('Cancel e-mail to registree'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->send_cancel_mail_to_registree,
);
$form['email']['cancel_mail_to_registree']['send_cancel_mail_to_registree'] = array(
'#type' => 'checkbox',
'#title' => t('Send e-mail to registree'),
'#default_value' => $settings->send_cancel_mail_to_registree,
);
$form['email']['cancel_mail_to_registree']['cancel_mail_to_registree_bcc'] = array(
'#type' => 'textfield',
'#title' => t('Send BCC to'),
'#default_value' => $settings->cancel_mail_to_registree_bcc,
'#element_validate' => array(
'value_is_email_or_token',
),
'#max' => 20,
'#description' => t('A (comma separated) list of e-mail addresses to send this notification to.') . $accepts_tokens,
);
$form['email']['cancel_mail_to_registree']['cancel_mail_to_registree_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->cancel_mail_to_registree_subject,
'#description' => trim(_node_registration_translation_description_for($settings->cancel_mail_to_registree_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['cancel_mail_to_registree']['cancel_mail_to_registree_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->cancel_mail_to_registree_body,
'#description' => trim(_node_registration_translation_description_for($settings->cancel_mail_to_registree_body)),
'#nr_locale_kick' => TRUE,
);
$form['email']['cancel_mail_to_admin'] = array(
'#type' => 'fieldset',
'#title' => t('Cancel e-mail to admin'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->send_cancel_mail_to_admin,
);
$form['email']['cancel_mail_to_admin']['send_cancel_mail_to_admin'] = array(
'#type' => 'checkbox',
'#title' => t('Send e-mail to admin'),
'#default_value' => $settings->send_cancel_mail_to_admin,
);
$form['email']['cancel_mail_to_admin']['cancel_mail_to_admin_recipients'] = array(
'#type' => 'textfield',
'#title' => t('Recipients'),
'#default_value' => $settings->cancel_mail_to_admin_recipients,
'#element_validate' => array(
'value_is_email_or_token',
),
'#max' => 20,
'#description' => t('A (comma separated) list of e-mail addresses to send this notification to.') . $accepts_tokens,
);
$form['email']['cancel_mail_to_admin']['cancel_mail_to_admin_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->cancel_mail_to_admin_subject,
'#description' => trim(_node_registration_translation_description_for($settings->cancel_mail_to_admin_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['cancel_mail_to_admin']['cancel_mail_to_admin_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->cancel_mail_to_admin_body,
'#description' => trim(_node_registration_translation_description_for($settings->cancel_mail_to_admin_body)),
'#nr_locale_kick' => TRUE,
);
$form['email']['unwaitinglist_mail_to_registree'] = array(
'#type' => 'fieldset',
'#title' => t('Unwaitinglist e-mail to registree'),
'#collapsible' => TRUE,
'#collapsed' => !$settings->send_unwaitinglist_mail_to_registree,
);
$form['email']['unwaitinglist_mail_to_registree']['send_unwaitinglist_mail_to_registree'] = array(
'#type' => 'checkbox',
'#title' => t('Send e-mail to registree'),
'#default_value' => $settings->send_unwaitinglist_mail_to_registree,
);
$form['email']['unwaitinglist_mail_to_registree']['unwaitinglist_mail_to_registree_subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#default_value' => $settings->unwaitinglist_mail_to_registree_subject,
'#description' => trim(_node_registration_translation_description_for($settings->unwaitinglist_mail_to_registree_subject)),
'#nr_locale_kick' => TRUE,
);
$form['email']['unwaitinglist_mail_to_registree']['unwaitinglist_mail_to_registree_body'] = array(
'#type' => 'textarea',
'#title' => t('Body'),
'#default_value' => $settings->unwaitinglist_mail_to_registree_body,
'#description' => trim(_node_registration_translation_description_for($settings->unwaitinglist_mail_to_registree_body)),
'#nr_locale_kick' => TRUE,
);
$form['show_messages'] = array(
'#type' => 'fieldset',
'#title' => t('Block error messages'),
'#description' => t("Show a themeable warning message for which scenario's?"),
'#collapsible' => TRUE,
);
$form['show_messages']['show_message_access'] = array(
'#type' => 'checkbox',
'#title' => t('User has insufficient access'),
'#default_value' => $settings->show_message_access,
);
$form['show_messages']['show_message_date'] = array(
'#type' => 'checkbox',
'#title' => t('Invalid date'),
'#default_value' => $settings->show_message_date,
);
$form['show_messages']['show_message_capacity'] = array(
'#type' => 'checkbox',
'#title' => t('No more room'),
'#default_value' => $settings->show_message_capacity,
);
$form['show_messages']['show_message_registered'] = array(
'#type' => 'checkbox',
'#title' => t('User already registered'),
'#default_value' => $settings->show_message_registered,
);
_node_registration_add_token_tree($form);
return $form;
}
/**
* Returns a pretty translation status text for the given source string.
*/
function _node_registration_translation_description_for($source_text, $textgroup = NULL) {
if (!module_exists('locale')) {
return '';
}
$languages = _node_registration_translations_for($source_text, $textgroup);
if ($languages) {
return ' ' . t('Translation status: <span class="nr-translated">translated into: @languages</span>.', array(
'@languages' => implode(', ', $languages),
));
}
return ' ' . t('Translation status: <span class="nr-not-translated">NOT translated</span>.');
}
/**
* Fetches languages this source string has been translated into.
*
* @see _node_registration_send_email()
*/
function _node_registration_translations_for($source_text, $textgroup = NULL) {
if (!module_exists('locale')) {
return array();
}
if ($textgroup === NULL) {
$textgroup = 'node_registration';
}
$translations =& drupal_static(__FUNCTION__, array());
$cid = md5($source_text . ':' . $textgroup);
$languages =& $translations[$cid];
if (!isset($languages)) {
$languages = db_query('
SELECT t.language
FROM {locales_source} s
JOIN {locales_target} t ON (s.lid = t.lid)
WHERE s.textgroup = ? AND context = ? AND source = ?
', array(
'default',
$textgroup,
$source_text,
))
->fetchCol();
}
return $languages;
}
/**
* Add token tree to form array.
*/
function _node_registration_add_token_tree(&$form) {
if (module_exists('token')) {
$form['token_tree'] = array(
'#type' => 'fieldset',
'#title' => t('Tokens'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'tokens' => array(
'#theme' => 'token_tree',
'#dialog' => TRUE,
'#token_types' => array(
'node-registration',
'node',
'current-date',
),
'#global_types' => variable_get('node_registration_token_tree_globals', FALSE),
),
);
}
}
/**
* Form for registration type settings.
*/
function node_registration_type_settings($form, &$form_state, $registration_type) {
$form['#registration_type'] = $registration_type;
$type = $registration_type->type;
// This might be a 'private fields' bundle and that can't have settings.
if (preg_match('/^node_(\\d+)$/', $type, $match)) {
$node = node_load($match[1]);
$goto = 'admin/structure/node_registration' . ($node ? '/manage/' . $node->type : '');
return drupal_goto($goto);
}
$settings = _node_registration_node_type_settings($type);
$form['events'] = array(
'#type' => 'fieldset',
'#title' => t('Events'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['events']['toggle_enabled_in_node_form'] = array(
'#type' => 'checkbox',
'#title' => t('Show registration status checkbox in node form'),
'#default_value' => $settings->toggle_enabled_in_node_form,
'#description' => t('Will add a vertical tab with enabled checkbox to the node form.'),
);
$form['events']['no_register_page'] = array(
'#type' => 'checkbox',
'#title' => t('Disable register page'),
'#default_value' => $settings->no_register_page,
'#description' => t('Will hide the register tab on the node page and deny access to the register page for all people without Administer registration permission.'),
);
$form += _node_registration_type_settings_form($type, $settings);
$form['register_cancel']['help'] = array(
'#markup' => '<p>' . t('To disable registration on this <strong>content type</strong>, or to change the <strong>date field</strong>, go to the !settings_link.', array(
'!settings_link' => l(t('content type settings page'), 'admin/structure/types/manage/' . $type, array(
'fragment' => 'edit-registration',
)),
)) . '</p>',
'#weight' => -10,
);
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
$form['#submit'][] = 'node_registration_type_settings_submit';
$form['#submit'][] = 'node_registration_submit_locale_kick';
return $form;
}
/**
* Submit handler for node_registration_type_settings().
*/
function node_registration_type_settings_submit($form, &$form_state) {
$registration_type = $form['#registration_type'];
$type = $registration_type->type;
// Allowed settings.
$old_settings = (array) _node_registration_node_type_settings($type);
$values = $form_state['values'];
// Remove foreign stuff from values.
$new_settings = array_intersect_key($values, $old_settings);
// Add allowed `extra_` stuff from values.
foreach ($values as $name => $value) {
if (0 === strpos($name, 'extra_')) {
$new_settings[$name] = $value;
}
}
_node_registration_node_type_settings($type, $new_settings);
drupal_set_message(t('Registration type settings saved.'));
}
/**
* Helper to get available users (names) from the node_registration_users view.
*/
function _node_registration_assoc_users_from_view() {
$view = views_get_view('node_registration_users');
if ($view && empty($view->disabled)) {
$view
->execute_display('master');
if ($view->executed && $view->result) {
$values = $view->result;
$labels = $view->style_plugin->rendered_fields;
$options = array();
foreach ($values as $i => $value) {
$options[$value->users_name] = strip_tags($labels[$i]['name']);
}
if ($options) {
return $options;
}
}
}
}
/**
* The registration form. It takes a (mandatory) existing or empty
* registration object.
*/
function node_registration_form($form, &$form_state, $registration, $user_to_register = NULL) {
global $user;
$account = $user_to_register ? $user_to_register : $user;
$account_email = isset($account->mail) ? $account->mail : '';
$form['#registration'] = $registration;
$form['#node'] = $node = $registration->node ?: node_load($registration->nid);
$form['#account'] = $account;
$admin = user_access('administer node registration');
$mail_admin = node_registration_node_access($node, 'administer');
$can_register_others = $admin || node_registration_node_access($node, 'register others');
$auth_type = $account->uid ? 'authenticated' : 'anonymous';
$settings = $node->registration;
$capacity = $settings
->capacity();
$is_new = (bool) $registration->is_new;
// Verify the event hasn't sold out.
if ($is_new && 'GET' == $_SERVER['REQUEST_METHOD']) {
if (!_node_registration_event_has_room($node)) {
$waitinglist = _node_registration_waitinglist_size($node);
drupal_set_message(t("This event is at capacity. You can register for the waiting list. There are @num people waiting...", array(
'@num' => $waitinglist,
)), 'warning');
}
}
// Different user context
if ($can_register_others && $is_new && !$user_to_register) {
// Allow changing the context user (=registree).
$form['account'] = array(
'#type' => 'textfield',
'#title' => t('Account'),
'#element_validate' => array(
'value_is_username',
),
'#exists' => TRUE,
'#autocomplete_path' => 'user/autocomplete',
'#default_value' => $account->uid ? $account->name : '',
'#empty_option' => t('-- Anonymous'),
'#description' => t('Leaving this field empty, means the registree will be anonymous.'),
);
// Get users from a view.
if ($options = _node_registration_assoc_users_from_view()) {
$form['account']['#type'] = 'select';
$form['account']['#options'] = $options;
$form['account']['#description'] = t('Choose Anonymous to disconnect this registration from any Drupal user.');
}
}
// Field: attended.
if (!$is_new) {
$form['attended'] = array(
'#type' => 'checkbox',
'#title' => t('Attended?'),
'#default_value' => !empty($registration->attended),
'#access' => $admin,
'#weight' => -11,
);
}
// Field: slots.
$setting_name = 'max_slots_per_registration_' . $auth_type;
$max_slots = min($settings->{$setting_name}, ($capacity ?: 999) - node_registration_event_count($node));
$options = range(1, max(1, min(9, $max_slots)));
$form['slots'] = array(
'#type' => 'select',
'#title' => t('Slots'),
'#description' => t('Select the number of slots your registration will consume.'),
'#options' => array_combine($options, $options),
'#default_value' => $registration->slots,
'#access' => 1 < $max_slots,
'#real_max_slots' => $max_slots,
);
// Field fields.
_node_registration_fields_callback('field_attach_form', $registration, $form, $form_state);
// E-mail field/value.
$default_email = !empty($registration->email) ? $registration->email : $account_email;
// Show e-mail field.
if (!$default_email || $settings->allow_email_change || $can_register_others || $mail_admin) {
$form['email'] = array(
'#type' => 'textfield',
'#title' => t('E-mail address'),
'#default_value' => $default_email,
'#required' => TRUE,
'#element_validate' => array(
'value_is_email',
),
);
// Admins are allowed to leave this empty, so it's autofilled via the registree user.
// If the registree user is Anonymous, this field will be required (in the validation handler).
if ($can_register_others && $is_new) {
$form['email']['#default_value'] = '';
$form['email']['#required'] = FALSE;
$form['email']['#description'] = t("You can leave this field empty to autofill it with the registree's e-mail address.");
}
}
else {
$form['#fixed_email'] = $default_email;
$form['email'] = array(
'#type' => 'item',
'#title' => t('E-mail address'),
'#markup' => '<div class="value">' . $default_email . '</div>',
'#value' => $default_email,
);
}
// Default values.
if ($is_new) {
$values = array();
$context = array(
'node' => $node,
'registration' => $registration,
'user' => $account,
);
drupal_alter('node_registration_default_values', $form, $values, $context);
// Simple default values.
$lang = $registration->language;
foreach ($values as $field_name => $value) {
if ($field_info = field_info_field($field_name)) {
if (isset($field_info['columns']['value'])) {
$form[$field_name][$lang][0]['value']['#default_value'] = $value;
}
elseif (isset($field_info['columns']['email'])) {
$form[$field_name][$lang][0]['email']['#default_value'] = $value;
}
}
}
}
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $is_new ? t('Create registration') : t('Update registration'),
);
// Cancel registration.
if ($registration->registration_id) {
$uri = node_registration_uri($registration);
$form['actions']['cancel'] = array(
'#type' => 'link',
'#title' => t('Cancel registration'),
'#href' => $uri['path'] . '/cancel',
'#access' => node_registration_access($registration, 'cancel'),
);
}
else {
$form['actions']['return'] = array(
'#type' => 'link',
'#title' => t('Cancel'),
'#href' => 'node/' . $registration->nid,
);
}
$form['#validate'][] = 'node_registration_form_validate';
$form['#submit'][] = 'node_registration_form_submit';
return $form;
}
/**
* Validation handler for node_registration_form().
*/
function node_registration_form_validate($form, &$form_state) {
$registration = $form['#registration'];
$is_new = (bool) $registration->is_new;
$node = $form['#node'];
$account = $form['#account'];
$settings = $node->registration;
$admin = user_access('administer node registration');
$mail_admin = node_registration_node_access($node, 'administer');
$can_register_others = node_registration_node_access($node, 'register others');
$values =& $form_state['values'];
// Verify the event hasn't sold out.
if ($is_new && !_node_registration_event_has_room($node) && !$settings->allow_exceeding_capacity) {
return form_set_error('email', t("Sorry, this event's capacity during your registration."));
}
// Change user context for admins.
if ($can_register_others && isset($form['account'])) {
$account = '' == $values['account'] ? drupal_anonymous_user() : user_load_by_name($values['account']);
}
// E-mail not editable.
if (isset($form['#fixed_email'])) {
$values['email'] = $form['#fixed_email'];
}
if (empty($values['email'])) {
if ($account->uid) {
$values['email'] = $account->mail;
}
else {
return form_set_error('email', t("You have to submit an e-mail address for anonymous registrations."));
}
}
else {
$existing_account = user_load_by_mail($values['email']);
if ($existing_account && $existing_account->uid != $account->uid && !$mail_admin) {
return form_set_error('email', t('This e-mail address belongs to a registered user. If you are that user, please <a href="!url">log in</a> first.', array(
'!url' => url('user/login'),
)));
}
}
// Used values / flags.
$email = $values['email'];
// Notify field widgets to validate their data.
_node_registration_fields_callback('field_attach_form_validate', $registration, $form, $form_state);
$errors = form_get_errors();
if (!$errors) {
// E-mail address must be unique per event.
$registered = _node_registration_email_registered($node, $email);
if ($registered) {
if (!$registration->registration_id || $registration->registration_id != $registered->registration_id) {
form_set_error('email', t('%email is already registered for this event.', array(
'%email' => $email,
)));
}
}
// Alter registration object and collect custom errors.
$context = array(
'form' => $form,
'form_state' => $form_state,
'node' => $node,
'user' => $account,
);
$errors = array();
drupal_alter('node_registration_submit', $registration, $context, $errors);
// Set custom form errors.
foreach ($errors as $field => $error) {
form_set_error($field, $error);
}
}
}
/**
* Submit handler for node_registration_form().
*/
function node_registration_form_submit($form, &$form_state) {
global $user;
$account = $form['#account'];
$registration = $form['#registration'];
$node = $form['#node'];
$settings = $node->registration;
$can_register_others = node_registration_node_access($node, 'register others');
$values =& $form_state['values'];
// Change user context for admins.
if ($can_register_others && isset($form['account'])) {
$account = '' == $values['account'] ? drupal_anonymous_user() : user_load_by_name($values['account']);
}
// E-mail not editable.
if (isset($form['#fixed_email'])) {
$values['email'] = $form['#fixed_email'];
}
// Used values / flags.
$email = $values['email'];
$is_new = (bool) $registration->is_new;
// {node_registration} values.
$registration->email = $email;
$registration->slots = (int) $values['slots'];
isset($values['attended']) && ($registration->attended = (int) $values['attended']);
// Only set for new registration.
if ($is_new) {
$registration->uid = $account->uid;
$registration->author_uid = $user->uid;
$registration->secret = _node_registration_secret();
// Auto verify for authenticated users and admins.
if ($account->uid || $can_register_others) {
$registration->verified = 1;
}
}
// Notify field widgets.
_node_registration_fields_callback('field_attach_submit', $registration, $form, $form_state);
// Alter registration object.
$context = array(
'form' => $form,
'form_state' => $form_state,
'node' => $node,
'user' => $account,
);
$errors = array();
drupal_alter('node_registration_submit', $registration, $context, $errors);
// Very last pre-flight check to make sure this is a unique e-mail address.
if ($is_new) {
$exists = db_query('SELECT registration_id FROM {node_registration} WHERE nid = :nid AND cancelled = :cancelled AND email = :email', array(
':nid' => $node->nid,
':cancelled' => 0,
':email' => $email,
))
->fetchField();
if ($exists) {
$form_state['rebuild'] = TRUE;
return form_set_error('email', t('%email is already registered for this event.', array(
'%email' => $email,
)));
}
}
// Save the registration.
if (node_registration_save($registration)) {
$uri = node_registration_uri($registration);
if ($is_new) {
drupal_set_message(t($settings->registration_success_message, array(
'@registration_url' => url($uri['path']),
)));
// Token param.
$registration->node = $node;
// Waitinglist? then re-fetch object.
$waitinglist = FALSE;
if (_node_registration_reset_waitinglist($node)) {
$registration = node_registration_load($registration->registration_id, TRUE);
$waitinglist = TRUE;
}
$token_data = array(
'node' => $node,
'node-registration' => $registration,
);
// Send e-mail to new registree.
if ($settings->send_mail_to_registree) {
$subject = $waitinglist && $settings->change_mail_for_waiting_list_registree && $settings->mail_for_waiting_list_registree_subject ? $settings->mail_for_waiting_list_registree_subject : $settings->mail_to_registree_subject;
$message = $waitinglist && $settings->change_mail_for_waiting_list_registree && $settings->mail_for_waiting_list_registree_body ? $settings->mail_for_waiting_list_registree_body : $settings->mail_to_registree_body;
$options = array(
'bcc' => token_replace($settings->mail_to_registree_bcc, $token_data, array(
'clear' => TRUE,
)),
'alter' => 'new_registration',
);
node_registration_send_broadcast($node, $subject, $message, array(
$registration,
), $options);
}
// Send notification e-mail to admin.
if ($settings->send_mail_to_admin) {
$subject = token_replace($settings->mail_to_admin_subject, $token_data);
$message = token_replace($settings->mail_to_admin_body, $token_data);
$recipients = token_replace($settings->mail_to_admin_recipients, $token_data);
_node_registration_send_email($recipients, $subject, $message, $token_data);
}
}
else {
// Trigger: verify / unverify.
$op = $registration->verified ? 'verify' : 'unverify';
module_invoke_all('node_registration_' . $op, $registration);
drupal_set_message(t('Your registration has been updated.'));
}
// Redirect to event node.
$form_state['redirect'] = $is_new ? 'node/' . $registration->nid : $uri['path'];
}
else {
drupal_set_message(t('Sorry, there has been a problem submitting your registration.'));
}
}
/**
* Menu callback -- ask for confirmation of registration cancellation.
*/
function node_registration_cancel_confirm($form, &$form_state, $registration) {
// Always provide entity id in the same form key as in the entity edit form.
$form['#registration'] = $registration;
$form['#submit'][] = 'node_registration_cancel_confirm_submit';
$uri = node_registration_uri($registration);
return confirm_form($form, t('Are you sure you want to cancel registration %title?', array(
'%title' => $registration->registration_id,
)), $uri['path'], t('This action cannot be undone.'), t('Cancel registration'), t('Cancel'));
}
/**
* Menu callback -- ask for confirmation of registration cancellation
*/
function node_registration_cancel($form, &$form_state, $registration) {
// Always provide entity id in the same form key as in the entity edit form.
$form['#registration'] = $registration;
$form['description'] = array(
'#markup' => t('Are you sure you want to cancel registration %title?', array(
'%title' => $registration->registration_id,
)),
);
$form['confirm'] = array(
'#type' => 'submit',
'#value' => t('Yes'),
'#submit' => array(
'node_registration_cancel_confirm_submit',
),
);
$form['no'] = array(
'#type' => 'submit',
'#value' => t('No'),
);
return $form;
}
/**
* Execute node registration cancellation.
*/
function node_registration_cancel_confirm_submit($form, &$form_state) {
$registration = $form['#registration'];
$node = node_load($registration->nid);
if ($form_state['values']['confirm']) {
node_registration_cancel_action($registration, TRUE);
// Notify user.
drupal_set_message(t('Registration %id has been cancelled.', array(
'%id' => $registration->registration_id,
)));
}
$form_state['redirect'] = 'node/' . $registration->nid;
}
/**
* Confirm delete registration.
*/
function node_registration_delete_confirm($form, &$form_state, $registration) {
$form['#registration'] = $registration;
$form['#submit'][] = 'node_registration_delete_confirm_submit';
$uri = node_registration_uri($registration);
return confirm_form($form, t('Are you sure you want to delete registration %title?', array(
'%title' => $registration->registration_id,
)), $uri['path'], t('This action cannot be undone.'), t('Delete registration'), t('Cancel'));
}
/**
* Execute delete registration.
*/
function node_registration_delete_confirm_submit($form, &$form_state) {
$registration = $form['#registration'];
if ($form_state['values']['confirm']) {
// Delete.
node_registration_delete_multiple(array(
$registration->registration_id,
));
// Notify.
watchdog('node_registration', 'Registration %id deleted.', array(
'%id' => $registration->registration_id,
));
drupal_set_message(t('Registration %id has been deleted.', array(
'%id' => $registration->registration_id,
)));
}
$form_state['redirect'] = 'node/' . $registration->nid;
}
/**
* Return a form for sending a broadcast email to participants.
*/
function node_registration_registrations_broadcast_form($form, &$form_state, $node) {
$form['#node'] = $node;
$registrations = node_registration_load_multiple(FALSE, array(
'nid' => $node->nid,
'cancelled' => 0,
));
$form['recipients'] = array(
'#type' => 'item',
'#title' => t('Recipients'),
'#markup' => count($registrations),
);
$form['bcc'] = array(
'#type' => 'textfield',
'#title' => t('Send BCC to'),
'#element_validate' => array(
'value_is_email',
),
'#max' => 20,
);
$form['subject'] = array(
'#type' => 'textfield',
'#title' => t('Subject'),
'#required' => TRUE,
'#maxlength' => 150,
);
$form['message'] = array(
'#type' => 'textarea',
'#title' => t('Message'),
'#required' => TRUE,
'#cols' => 60,
'#rows' => 6,
);
if ($node->registration->mail_system) {
$form['attachment'] = array(
'#type' => 'file',
'#title' => t('Attachment'),
'#required' => FALSE,
);
}
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['send'] = array(
'#type' => 'submit',
'#value' => t('Send'),
);
_node_registration_add_token_tree($form);
return $form;
}
/**
* Validate handler for registration_registrations_broadcast_form.
*/
function node_registration_registrations_broadcast_form_validate($form, &$form_state) {
$validators = array(
'file_validate_extensions' => array(
'jpg gif png pdf doc docx xls xlsx ppt pptx txt zip rar gz',
),
);
$file = file_save_upload('attachment', $validators);
if (isset($file)) {
// File upload was attempted.
if ($file) {
// Put the temporary file in form_values so we can save it on submit.
$form_state['values']['attachment'] = $file;
}
else {
// File upload failed.
form_set_error('attachment', t('The attachment must be of these types: !types.', array(
'!types' => $validators['file_validate_extensions'][0],
)));
}
}
}
/**
* Submit handler for registration_registrations_broadcast_form.
*/
function node_registration_registrations_broadcast_form_submit($form, &$form_state) {
$options = array(
'notify' => TRUE,
'bcc' => $form_state['values']['bcc'],
);
if (isset($form_state['values']['attachment']) && isset($form_state['values']['attachment']->uri)) {
$options['attachments'] = array(
$form_state['values']['attachment'],
);
}
node_registration_send_broadcast($form['#node'], $form_state['values']['subject'], $form_state['values']['message'], NULL, $options);
}
/**
* Return a form for a node's registration settings.
*/
function node_registration_registrations_settings_form($form, &$form_state, $node) {
$form['#node'] = $node;
$form['#attributes']['class'][] = 'node-registration';
$type = $node->type;
$settings = $node->registration;
$form += _node_registration_type_settings_form($type, $settings, $node);
$status = $settings
->enabled() ? '<span class="registration-status enabled">' . t('Enabled') . '</span>' : '<span class="registration-status disabled">' . t('Disabled') . '</span>';
$form['register_cancel']['prestatus'] = array(
'#markup' => '<div class="form-item">',
'#weight' => -11,
);
$form['register_cancel']['status'] = array(
'#type' => 'submit',
'#value' => $settings
->enabled() ? t('Disable registrations') : t('Enable registrations'),
'#weight' => -10,
'#submit' => array(
'node_registration_node_settings_status_submit',
),
'#prefix' => '<span>' . t('Current status: !status', array(
'!status' => $status,
)) . '</span> ',
);
$form['register_cancel']['poststatus'] = array(
'#markup' => '</div>',
'#weight' => -9,
);
$form['actions'] = array(
'#type' => 'actions',
);
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save Settings'),
);
$form['#submit'][] = 'node_registration_registrations_settings_form_submit';
$form['#submit'][] = 'node_registration_submit_locale_kick';
return $form;
}
/**
* Submit handler for registration_registrations_settings_form().
*
* Saves actual settings into {node_registration_node}.
*/
function node_registration_registrations_settings_form_submit($form, &$form_state) {
$node = $form['#node'];
$nid = $node->nid;
$values =& $form_state['values'];
unset($values['status']);
$node->registration
->update($values);
drupal_set_message(t('Registration node settings saved.'));
}
/**
* Submit handler for localized forms.
*/
function node_registration_submit_locale_kick($form, &$form_state) {
if (!module_exists('locale')) {
return;
}
// Find any enabled non-English language.
foreach (language_list() as $langcode => $language) {
if ($langcode != 'en' && $language->enabled) {
break;
}
}
// No point if we only have English.
if ($langcode == 'en') {
return;
}
// Recursively find ALL #nr_locale_kick elements and force their value into locale.
$walk = function ($element) use (&$walk, $langcode) {
foreach (element_children($element) as $name) {
if (!empty($element[$name]['#nr_locale_kick'])) {
// Got one. Make sure this value exists in locale, so it's translatable via Locale's UI.
if (!empty($element[$name]['#value'])) {
$cfg = is_array($element[$name]['#nr_locale_kick']) ? $element[$name]['#nr_locale_kick'] : array();
$context = isset($cfg['context']) ? $cfg['context'] ?: NULL : 'node_registration';
locale($element[$name]['#value'], $context, $langcode);
}
}
elseif (is_array($element[$name])) {
$walk($element[$name]);
}
}
};
$walk($form_state['complete form']);
}
/**
* Submit handler for node_registration_registrations_settings_form().
*
* Toggles registration status for a node/event.
*/
function node_registration_node_settings_status_submit($form, &$form_state) {
$node = $form['#node'];
$settings = $node->registration;
// Update these values.
$update = array(
// Toggle status.
'status' => $settings
->enabled() ? 0 : 1,
);
$settings
->update($update);
}
/**
* Form element validator for simple strtotime() format.
*
* Possibly interesting regex: #(^|[^\+\d\-])(\d+)#
*/
function _node_registration_value_is_strtotime($element, &$form_state, $form) {
$value = $element['#value'];
if ('' != $value) {
if (!preg_match('#^(?:\\d+ (?:minute|hour|day|week|month)s? ?)+$#i', $value)) {
form_error($element, t('%title must be a valid period.', array(
'%title' => $element['#title'],
)));
}
}
}
Functions
Name![]() |
Description |
---|---|
node_registration_cancel | Menu callback -- ask for confirmation of registration cancellation |
node_registration_cancel_confirm | Menu callback -- ask for confirmation of registration cancellation. |
node_registration_cancel_confirm_submit | Execute node registration cancellation. |
node_registration_delete_confirm | Confirm delete registration. |
node_registration_delete_confirm_submit | Execute delete registration. |
node_registration_form | The registration form. It takes a (mandatory) existing or empty registration object. |
node_registration_form_submit | Submit handler for node_registration_form(). |
node_registration_form_validate | Validation handler for node_registration_form(). |
node_registration_node_settings_status_submit | Submit handler for node_registration_registrations_settings_form(). |
node_registration_registrations_broadcast_form | Return a form for sending a broadcast email to participants. |
node_registration_registrations_broadcast_form_submit | Submit handler for registration_registrations_broadcast_form. |
node_registration_registrations_broadcast_form_validate | Validate handler for registration_registrations_broadcast_form. |
node_registration_registrations_settings_form | Return a form for a node's registration settings. |
node_registration_registrations_settings_form_submit | Submit handler for registration_registrations_settings_form(). |
node_registration_send_mail_action_form | Action mail form. |
node_registration_send_mail_action_submit | Submit handler for node_registration_send_mail_action() form. |
node_registration_submit_locale_kick | Submit handler for localized forms. |
node_registration_toggle_flag | Page callback for registration/%node_registration/toggle/ajax/%/%. |
node_registration_types_form | Admin: registration types form. |
node_registration_type_settings | Form for registration type settings. |
node_registration_type_settings_submit | Submit handler for node_registration_type_settings(). |
_node_registration_add_token_tree | Add token tree to form array. |
_node_registration_assoc_users_from_view | Helper to get available users (names) from the node_registration_users view. |
_node_registration_translations_for | Fetches languages this source string has been translated into. |
_node_registration_translation_description_for | Returns a pretty translation status text for the given source string. |
_node_registration_type_settings_form | All registration settings for registration types and nodes. |
_node_registration_value_is_strtotime | Form element validator for simple strtotime() format. |