You are here

function signup_node_settings_form in Signup 6.2

Same name and namespace in other branches
  1. 5.2 signup.module \signup_node_settings_form()
  2. 6 includes/node_settings.inc \signup_node_settings_form()
  3. 7 includes/node_settings.inc \signup_node_settings_form()

Returns the form for the per-node signup settings.

This is shared by the settings page and the node edit page.

Parameters

$node: The fully loaded node object if we've got it.

$node_type: The type of the node. When creating new content, the caller can know the node type, even if $node is NULL.

$has_date: Boolean flag indicating if this node (or site) has signup-aware date functionality, which is required for reminder emails to be in the form.

$include_buttons: Boolean flag indicating if the form should include its own submit buttons.

Return value

The form array for the per-node signup settings.

1 call to signup_node_settings_form()
signup_settings_form in includes/admin.settings.inc
Form builder for the settings page under admin/setttings/signup
1 string reference to 'signup_node_settings_form'
signup_node_settings_page in includes/node_settings.inc
Page callback for the node/N/signups/settings subtab.

File

includes/node_settings.inc, line 30
Code related to the per-node signup settings form.

Code

function signup_node_settings_form($form_state, $node = NULL, $node_type = NULL, $has_date = FALSE, $include_buttons = FALSE) {
  if (module_exists('token')) {
    $signup_token_description = t('Supported string substitutions: %node_title, %node_url, %node_start_time, %user_name, %user_mail, %user_signup_info (additional information from the signup form), %cancel_signup_url (access to this link is denied to users without the "%cancel_own_signups" permission), and any tokens in the %replacement_tokens list.', array(
      '%replacement_tokens' => t('Replacement tokens'),
      '%cancel_own_signups' => t('cancel own signups'),
    ));
  }
  else {
    $signup_token_description = t('Supported string substitutions: %node_title, %node_url, %node_start_time, %user_name, %user_mail, %user_signup_info (additional information from the signup form), and %cancel_signup_url (access to this link is denied to users without the "%cancel_own_signups" permission).', array(
      '%cancel_own_signups' => t('cancel own signups'),
    ));
  }

  // Load the default admin form data for new nodes.
  if (!$node || !$node->signup) {
    $result = db_fetch_object(db_query("SELECT * FROM {signup} WHERE nid = 0"));
    $node->signup_forwarding_email = $result->forwarding_email;
    $node->signup_send_confirmation = $result->send_confirmation;
    $node->signup_confirmation_email = $result->confirmation_email;
    $node->signup_send_reminder = $result->send_reminder;
    $node->signup_reminder_days_before = $result->reminder_days_before;
    $node->signup_reminder_email = $result->reminder_email;
    $node->signup_close_signup_limit = $result->close_signup_limit;

    // Load pane data
    $result = db_query("SELECT * FROM {signup_panes} WHERE nid = 0 ORDER BY weight");
    $node->signup_form_panes = array();
    while ($pane_data = db_fetch_array($result)) {
      $node->signup_form_panes[$pane_data['pane_id']] = array(
        'weight' => $pane_data['weight'],
        'callback' => $pane_data['callback'],
      );
    }
  }

  // Get information about all potential form panes from modules that
  // implement hook_signup_pane_info.
  $signup_form_pane_info = module_invoke_all('signup_pane_info', $node);

  // Put in weights from either saved settings or for panes not enabled on this
  // node a default heavy weight of 10.
  foreach ($signup_form_pane_info as $id => $signup_form_pane) {
    $signup_form_pane_info[$id]['weight'] = isset($node->signup_form_panes[$id]) ? $node->signup_form_panes[$id]['weight'] : 10;
  }

  // Sort the list by weight so it appears correctly in the UI.
  uasort($signup_form_pane_info, '_signup_cmp_weight');

  // The label and the theme function for the form panes table.
  $form['signup_form_panes'] = array(
    // This gets a label on the whole table; not sure this is the best approach though.
    // Improvements welcome.
    '#type' => 'item',
    '#title' => t('Signup form panes'),
    '#tree' => TRUE,
    '#description' => t('Enable the signup form panes you want to use on this content. You may also drag enabled panes into any order. The position of disabled panes in the list is ignored.'),
    '#theme' => 'signup_node_settings_form_panes',
  );

  // Add a warning if there are already existing signups.
  if ($node->signup_effective_total > 0) {
    $form['signup_form_panes']['#description'] .= t(' <span class="warning">There are existing signups recorded. If you disable panes their data will remain in your records; if you enable panes then past signups will not have any data for them.</span>');
  }

  // The draggable table of signup panes.
  // @see hook_signup_pane_info() for information on the array structure here.
  $href_replace_nid = isset($node->nid) ? $node->nid : 0;
  foreach ($signup_form_pane_info as $id => $signup_form_pane) {

    // Stash the callback as a hidden value for the submit handler to find.
    $form['signup_form_panes'][$id]['callback'] = array(
      '#type' => 'value',
      '#value' => $signup_form_pane['callback'],
    );
    $form['signup_form_panes'][$id]['enabled'] = array(
      '#type' => 'checkbox',
      '#default_value' => isset($node->signup_form_panes[$id]),
    );
    $form['signup_form_panes'][$id]['label'] = array(
      '#value' => $signup_form_pane['label'],
    );
    $form['signup_form_panes'][$id]['description'] = array(
      '#value' => $signup_form_pane['description'],
    );

    // Signup panes may define links to operations for individual configuration.
    if (isset($signup_form_pane['operations'])) {
      foreach ($signup_form_pane['operations'] as $op_key => $operation) {

        // Operations get the token %nid in their href replaced with the nid of
        // the current node or 0 for defaults.
        $signup_form_pane['operations'][$op_key]['href'] = str_replace('%nid', $href_replace_nid, $signup_form_pane['operations'][$op_key]['href']);

        // Operations may request to have the return destination appended to their link.
        if (isset($operation['destination'])) {
          $signup_form_pane['operations'][$op_key]['query'] .= drupal_get_destination();
        }

        // Operations with 'not_defaults' are skipped when there is no node.
        if (!isset($node->nid) && isset($operation['not_defaults'])) {
          unset($signup_form_pane['operations'][$op_key]);
        }
        $form['signup_form_panes'][$id]['operations'] = array(
          // This array is rendered by theme_links() in the form's theme function.
          '#value' => $signup_form_pane['operations'],
        );
      }
    }
    $form['signup_form_panes'][$id]['weight'] = array(
      '#type' => 'weight',
      '#delta' => 10,
      '#default_value' => $signup_form_pane['weight'],
      '#attributes' => array(
        'class' => "signup-pane-weight",
      ),
    );
  }

  // Unset weight item if only 1 element
  if (count($signup_form_pane_info) == 1) {
    unset($form['signup_form_panes'][$id]['weight']);
  }
  $form['signup_forwarding_email'] = array(
    '#type' => 'textfield',
    '#title' => t('Send signups to'),
    '#default_value' => $node->signup_forwarding_email,
    '#size' => 40,
    '#maxlength' => 64,
    '#description' => t('Email address where notification of new signups will be sent. Leave blank for no notifications.'),
  );
  $form['signup_send_confirmation'] = array(
    '#type' => 'checkbox',
    '#title' => t('Send confirmation'),
    '#default_value' => $node->signup_send_confirmation,
  );
  $form['signup_confirmation_email'] = array(
    '#type' => 'textarea',
    '#title' => t('Confirmation email'),
    '#default_value' => $node->signup_confirmation_email,
    '#cols' => 40,
    '#rows' => 6,
    '#description' => t('Email sent to user upon signup. !token_description', array(
      '!token_description' => $signup_token_description,
    )),
  );
  if (module_exists('token')) {
    module_load_include('inc', 'signup', 'includes/token_help');
    _signup_token_help($form, 'signup_confirmation_token_fieldset');
  }
  if ($has_date) {

    // Define a sub-tree to wrap the next 2 form elements together in an
    // inline div for better display.
    $form['signup_reminder'] = array(
      '#prefix' => '<div class="container-inline">',
      '#suffix' => '</div>',
    );
    $form['signup_reminder']['signup_send_reminder'] = array(
      '#type' => 'checkbox',
      '#title' => t('Send reminder'),
      '#default_value' => $node->signup_send_reminder,
    );
    $options = array();
    for ($i = 1; $i <= 60; $i++) {
      $options[$i] = $i;
    }
    $node_type_name = isset($node_type) ? node_get_types('name', $node_type) : '';
    $form['signup_reminder']['signup_reminder_days_before'] = array(
      '#type' => 'select',
      '#default_value' => $node->signup_reminder_days_before,
      '#options' => $options,
      '#suffix' => !empty($node_type_name) ? t('day(s) before this %node_type', array(
        '%node_type' => $node_type_name,
      )) : t('day(s) before start time'),
    );
    $form['signup_reminder_email'] = array(
      '#type' => 'textarea',
      '#title' => t('Reminder email'),
      '#default_value' => $node->signup_reminder_email,
      '#cols' => 40,
      '#rows' => 6,
      '#description' => !empty($node_type_name) ? t('Email sent to user as a reminder before the %node_type starts. !token_description', array(
        '%node_type' => $node_type_name,
        '!token_description' => $signup_token_description,
      )) : t('Email sent to user as a reminder before the start time. !token_description', array(
        '!token_description' => $signup_token_description,
      )),
    );
    if (module_exists('token')) {
      module_load_include('inc', 'signup', 'includes/token_help');
      _signup_token_help($form, 'signup_reminder_token_fieldset');
    }
  }
  $form['signup_close_signup_limit'] = array(
    '#type' => 'textfield',
    '#title' => t('Signup limit'),
    '#default_value' => $node->signup_close_signup_limit,
    '#size' => 4,
    '#maxlength' => 8,
    '#description' => t('Maximum number of users who can sign up before signups are automatically closed. If set to 0, there is no limit.'),
    '#prefix' => '<div id="signup-limit">',
    '#suffix' => '</div>',
  );
  $form['signup'] = array(
    '#type' => 'hidden',
    '#value' => 1,
  );
  if ($include_buttons) {
    $form['#node'] = $node;
    $form['buttons']['submit'] = array(
      '#type' => 'submit',
      '#value' => t('Save configuration'),
    );
    $form['buttons']['reset'] = array(
      '#type' => 'submit',
      '#value' => t('Reset to defaults'),
    );
    $form['#submit'][] = 'signup_node_settings_form_submit';
  }
  return $form;
}