You are here

function commerce_registration_form_alter in Commerce Registration 7.2

Same name and namespace in other branches
  1. 7 commerce_registration.module \commerce_registration_form_alter()

Implements hook_form_alter().

Changes the product title in the add to cart form to have the remaining capacity if available.

File

./commerce_registration.module, line 313
Commerce Registration module code.

Code

function commerce_registration_form_alter(&$form, &$form_state, $form_id) {

  // Add slots available text to Add to Cart form.
  if (substr($form_id, 0, 30) == 'commerce_cart_add_to_cart_form') {
    $form['#validate'][] = 'commerce_registration_add_to_cart_validate';
    if (!isset($form['product_id'])) {
      return;
    }
    switch ($form['product_id']['#type']) {
      case "select":
        $count = 0;
        $disabled = 0;
        $total_regs = 0;
        foreach ($form['product_id']['#options'] as $product_id => $title) {
          $product = commerce_product_load($product_id);
          $wrapper = entity_metadata_wrapper('commerce_product', $product);
          $count++;
          if (commerce_registration_product_has_registration_field($product->product_id)) {
            $total_regs++;
            $settings = registration_entity_settings('commerce_product', $product_id);
            if (registration_get_entity_registration_type('commerce_product', $product) && !empty($settings)) {
              if (registration_status('commerce_product', $product_id, TRUE) == 1 && registration_register_page_access('commerce_product', $product)) {
                $fieldsettings = field_extra_fields_get_display('commerce_product', $product->type, 'default');
                $showavail = isset($fieldsettings['registration_available']) && isset($fieldsettings['registration_available']['visible']) && $fieldsettings['registration_available']['visible'];
                $title = $showavail ? commerce_registration_get_product_title($product, $showavail) : $product->title;
                $form['product_id']['#options'][$product_id] = $title;
              }
              else {
                $price = commerce_currency_format($wrapper->commerce_price->amount
                  ->value(), $wrapper->commerce_price->currency_code
                  ->value());
                $selector = $count == count($form['product_id']['#options']) ? "prev" : "next";
                drupal_add_js('(function ($) { $("select[name=\'product_id\'] option[value=\'' . $product_id . '\']").attr(\'disabled\', \'disabled\'); $("select[name=\'product_id\'] option:selected").' . $selector . '(\'option\').attr(\'selected\', \'selected\'); $(window).load(function() { $("select[name=\'product_id\']").change(); }) }) (jQuery);', 'inline');
                $form['unavailable']['product_unavailable_' . $product_id] = array(
                  '#markup' => '<em>' . t('@product (@price)', array(
                    '@product' => $product->title,
                    '@price' => $price,
                  )) . '</em>' . t(' is currently unavailable.'),
                );
                $disabled++;
              }
            }
          }
        }
        if ($disabled === $count && $total_regs == $count) {
          $form['product_id']['#type'] = 'hidden';
          unset($form['submit']);
          $form['unavailable'] = array(
            '#markup' => t('There are no products available for registration at this time.'),
          );
        }
        break;
      case "hidden":
        $product = commerce_product_load($form['product_id']['#value']);
        $settings = registration_entity_settings('commerce_product', $form['product_id']['#value']);
        if (commerce_registration_product_has_registration_field($product->product_id) && !empty($settings) && registration_status('commerce_product', $form['product_id']['#value'], TRUE) && registration_register_page_access('commerce_product', $product)) {
          $fieldsettings = field_extra_fields_get_display('commerce_product', $product->type, 'default');
          $showavail = isset($fieldsettings['registration_available']) && isset($fieldsettings['registration_available']['visible']) && $fieldsettings['registration_available']['visible'];
          $submit = $form['submit'];
          unset($form['submit']);
          $capacity = (int) $settings['capacity'];
          $avail = $capacity - registration_event_count('commerce_product', $product->product_id);
          $availtext = $avail > 0 ? format_plural($avail, '1 slot available', '@count slots available') : t('No slots available');
          $capacity = $settings['capacity'] == 0 ? t("Unlimited slots available") : $availtext;
          $form['capacity'] = array(
            '#type' => 'markup',
            '#markup' => '<em>' . $capacity . '</em>',
          );
          if (!$showavail) {
            unset($form['capacity']);
          }
          if (registration_has_room('commerce_product', $product->product_id)) {
            $form['submit'] = $submit;
          }
          else {
            $form['not_available'] = array(
              '#type' => 'markup',
              '#markup' => '<p><strong>' . t('This item is currently unavailable.') . '</strong></p>',
            );
          }
        }
        break;
    }
  }
  elseif (substr($form_id, 0, 32) == 'commerce_product_ui_product_form') {

    // Add settings to Commerce Product Add/Edit Form.
    $product = $form_state['commerce_product'];
    if (isset($product->product_id)) {
      $settings = registration_entity_settings('commerce_product', $product->product_id);
      if (commerce_registration_product_has_registration_field($product->product_id)) {
        if (!function_exists("registration_entity_settings_form_validate")) {
          form_load_include($form_state, 'inc', 'registration', 'includes/registration.forms');
        }
        if (!function_exists("commerce_registration_registration_settings_form_validate")) {
          form_load_include($form_state, 'inc', 'commerce_registration', 'includes/commerce_registration.forms');
        }

        // Add validation and submission handlers to the form.
        $form['#validate'][] = "commerce_registration_registration_settings_form_validate";
        $form['actions']['submit']['#submit'][] = "commerce_registration_registration_settings_form_submit";
        $collapsed = empty($form['field_registration'][LANGUAGE_NONE]['0']['registration_type']['#default_value']['registration_type']) ? TRUE : FALSE;
        $form['registration_settings'] = array(
          '#title' => t('Registration Settings'),
          '#type' => "fieldset",
          '#collapsible' => TRUE,
          '#collapsed' => $collapsed,
          '#weight' => 45,
          '#tree' => TRUE,
          '#states' => array(
            'collapsed' => array(
              ':input[name="field_registration[und][0][registration_type]"]' => array(
                'value' => '',
              ),
            ),
          ),
        );

        // Grab the registration settings form for this entity.
        $addform = registration_entity_settings_form(array(), $form_state, $settings, "commerce_product", $product);

        // Remove the save button for this form since we have one already.
        unset($addform['save']);

        // We rename the registration settings form's status field to be reg_status
        // so our validation and submission doesn't overwrite the product's status.
        $addform['reg_status'] = $addform['status'];
        $addform['reg_status']['#weight'] = -20;
        unset($addform['status']);

        // Add parents to each registration setting so we can get the values.
        foreach ($addform as $key => $array) {
          $addform[$key]['#parents'] = array(
            'registration_settings',
            $key,
          );
        }

        // Add the registration settings form to the base form.
        $form['registration_settings'] += $addform;
        $form['registration_settings']['reminder']['#parents'] = array(
          'registration_settings',
          'reminder',
        );
        $form['registration_settings']['reminder']['reminder_settings']['#states']['visible'] = array(
          ':input[name="registration_settings[send_reminder]"]' => array(
            'checked' => TRUE,
          ),
        );
        $form['registration_settings']['settings']['hide_from_display'] = array(
          '#type' => 'checkbox',
          '#title' => t('Hide Manage Registrations tab from product display nodes'),
          '#default_value' => isset($settings['settings']['hide_from_display']) ? $settings['settings']['hide_from_display'] : 0,
        );
      }
    }
  }
  elseif (substr($form_id, -9) == 'node_form') {
    $node = NULL;
    if (isset($form_state['node']) && !empty($form_state['node'])) {
      $node = $form_state['node'];
    }
    $fields = field_read_fields(array(
      'type' => 'commerce_product_reference',
    ));
    $has_product_reference = FALSE;
    foreach ($fields as $field) {
      if (isset($node->{$field['field_name']}) && !isset($node->clone_from_original_nid)) {
        $has_product_reference = TRUE;
        break;
      }
    }
    if ($has_product_reference) {
      $node_settings = db_select('commerce_registration_node_settings', 'ns')
        ->fields('ns', array(
        'settings',
      ))
        ->condition('nid', $node->nid)
        ->execute()
        ->fetchCol();
      $node_settings = isset($node_settings[0]) ? $node_settings[0] : array();
      if (!is_array($node_settings)) {
        $node_settings = unserialize($node_settings);
      }
      $form['commerce_registration'] = array(
        '#type' => 'fieldset',
        '#title' => t('Commerce Registration settings'),
        '#collapsible' => TRUE,
        '#collapsed' => TRUE,
        '#group' => 'additional_settings',
        '#tree' => TRUE,
      );
      $form['commerce_registration']['hide_from_display'] = array(
        '#type' => 'checkbox',
        '#title' => t('Hide Manage Registrations tab on this node'),
        '#default_value' => isset($node_settings['hide_from_display']) ? $node_settings['hide_from_display'] : 0,
      );
      $form['#submit'][] = 'commerce_registration_node_settings_form_submit';
    }
  }
}