You are here

commerce_registration.module in Commerce Registration 7

Same filename and directory in other branches
  1. 7.3 commerce_registration.module
  2. 7.2 commerce_registration.module

Commerce Registration module code.

File

commerce_registration.module
View source
<?php

/**
 * @file
 *   Commerce Registration module code.
 */

/**
 * Implements hook_menu().
 */
function commerce_registration_menu() {
  $menu = array();
  $menu['node/%node/registration'] = array(
    'title' => 'Registrations',
    'access callback' => 'commerce_registration_registration_page_access',
    'access arguments' => array(
      1,
    ),
    'page callback' => 'commerce_registration_registration_page',
    'page arguments' => array(
      1,
    ),
    'type' => MENU_LOCAL_TASK,
  );
  $menu['admin/commerce/registrations'] = array(
    'title' => 'Registrations',
    'description' => 'Manage product registrations that have been purchased.',
    'access arguments' => array(
      'view any registration',
    ),
    'page callback' => 'commerce_registration_admin_overview',
    'file' => 'includes/commerce_registration.admin.inc',
  );
  return $menu;
}

/**
 * Page access callback to view all registrations for a given product display.
 * @todo Registration function to check if a given entity is register
 *   enabled.
 */
function commerce_registration_registration_page_access($node) {
  if (isset($node->field_commerce_product)) {
    foreach ($node->field_commerce_product[LANGUAGE_NONE] as $product) {
      $prod = commerce_product_load($product['product_id']);
      $info = array(
        'id' => $product['product_id'],
        'type' => 'commerce_product',
        'bundle' => $prod->type,
      );
      $status = registration_entity_registration_status($info);
      $bundle = registration_entity_registration_bundle($info);
      if ($status == 1 && $bundle != '' && (user_access('view any registration') || user_access('view ' . $bundle . ' registration'))) {
        return TRUE;
      }
    }
  }
  return FALSE;
}

/**
 * Registration page callback for all registrations for a given product display.
 */
function commerce_registration_registration_page($node) {
  $prodids = array();
  foreach ($node->field_commerce_product[LANGUAGE_NONE] as $product) {
    $prodids[] = (int) $product['product_id'];
  }
  $header = array(
    t('Order'),
    t('Date'),
    t('Product'),
    t('Registrant'),
  );
  $rows = array();
  foreach ($prodids as $product_id) {
    $reg = db_select('registration', 'r')
      ->fields('r', array(
      'registration_id',
      'order_id',
      'created',
      'author_uid',
      'user_uid',
    ));
    $reg
      ->condition('r.entity_type', 'commerce_product')
      ->condition('r.eid', $product_id)
      ->condition('r.status', 1)
      ->condition('r.order_id', 0, '!=')
      ->orderBy('r.created', 'DESC');
    $reg = $reg
      ->execute();
    foreach ($reg as $row) {
      $prod = commerce_product_load($product_id);
      $registrant = user_load($row->user_uid);
      $rows[] = array(
        l(t('Order #') . $row->order_id, 'user/' . $row->author_uid . '/orders/' . $row->order_id),
        date("F j, Y - g:i:s a", $row->created),
        $prod->title,
        l('#' . $row->registration_id . ': ' . $registrant->name, 'registration/' . $row->registration_id),
      );
    }
  }
  if (empty($rows)) {
    $rows[] = array(
      array(
        'data' => t('There are no registrations for any products for this node yet.'),
        'colspan' => 4,
      ),
    );
  }
  return theme('table', array(
    'header' => $header,
    'rows' => $rows,
  ));
}

/**
 * Implements hook_commerce_checkout_page_info().
 */
function commerce_registration_commerce_checkout_page_info() {
  $pages = array();
  $pages['registration'] = array(
    'name' => t('Registration'),
    'title' => t('Registration Information'),
    'weight' => 5,
    'status_cart' => TRUE,
    'buttons' => TRUE,
  );
  return $pages;
}

/**
 * Implements hook_commerce_checkout_pane_info().
 */
function commerce_registration_commerce_checkout_pane_info() {
  $panes = array();
  $panes['registration_information'] = array(
    'title' => t('Registration Information'),
    'base' => 'commerce_registration_information',
    'page' => 'registration',
    'enabled' => TRUE,
    'weight' => -50,
    'review' => TRUE,
    'file' => 'includes/commerce_registration.checkout_pane.inc',
  );
  return $panes;
}

/**
 * Implements hook_commerce_line_item_type_info().
 */
function commerce_registration_commerce_line_item_type_info() {
  $items = array();
  $items['waitlist'] = array(
    'type' => 'waitlist',
    'name' => t('Waitlist'),
    'product' => TRUE,
    'description' => t('References a product that is out of stock or beyond registration capacity.'),
    'add_form_submit_value' => t('Add product to waitlist'),
    'base' => 'commerce_registration_waitlist',
    'callbacks' => array(
      'title' => 'commerce_registration_waitlist_title',
    ),
  );
  $items['registration'] = array(
    'type' => 'registration',
    'name' => t('Registration'),
    'product' => FALSE,
    'description' => t('Contains the registration information for product enabled line items.'),
    'base' => 'commerce_registration_lineitem',
  );
  return $items;
}
function commerce_registration_commerce_line_item_type_info_alter(&$line_item_types) {
  $line_item_types['product']['callbacks']['title'] = 'commerce_registration_product_title';
}

/**
 * Product title line item callback.
 *
 * We alter the title of the default line item to show available slots if the
 * product is register enabled.
 *
 * @param $line_item
 *
 * @return
 *   Title of the line item product plus available slots, if applicable.
 */
function commerce_registration_product_title($line_item) {
  $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
  return commerce_registration_get_product_title($line_item_wrapper->commerce_product
    ->value());
}

/**
 * Returns a product title.
 *
 * @param $product
 *   Fully formed Commerce Product object.
 *
 * @return
 *   Product title with remaining capacity if available.
 */
function commerce_registration_get_product_title($product) {
  $entity = array(
    'id' => $product->product_id,
    'type' => 'commerce_product',
    'bundle' => $product->type,
  );
  $status = registration_entity_registration_status($entity);
  if ($status == 1) {
    $settings = registration_entity_settings($entity);
    $waitlist = 0 == $settings['settings']['waitlist'] ? "" : ", waitlist only";
    $avail = registration_entity_slots_available($entity);
    $capacity = $avail != 0 ? format_plural($avail, '1 slot available', '@count slots available') : 'No slots available';
    return t('@title (@capacity@wl)', array(
      '@title' => $product->title,
      '@capacity' => $capacity,
      '@wl' => $waitlist,
    ));
  }
  else {
    return $product->title;
  }
}

/**
 * Waitlist line item title callback.
 */
function commerce_registration_waitlist_title($line_item) {
  $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
  $entity = array(
    'id' => $line_item_wrapper->commerce_product->product_id
      ->value(),
    'type' => 'commerce_product',
    'bundle' => $line_item_wrapper->commerce_product->type
      ->value(),
  );
  $avail = registration_entity_slots_available($entity);
  return t('<em>@title (@capacity available) (waitlisted)</em>', array(
    '@title' => $line_item_wrapper->commerce_product->title
      ->value(),
    '@capacity' => format_plural($avail, '1 slot', '@count slots'),
  ));
}

/**
 * Waitlist line item configuration callback.
 */
function commerce_registration_waitlist_configuration() {
}

/**
 * Waitlist line item add form callback.
 */
function commerce_registration_waitlist_add_form(&$form_state) {
}

/**
 * Waitlist line item item add form submit callback.
 */
function commerce_registration_waitlist_add_form_submit(&$line_item, $element, &$form_state, $form) {
}

/**
 * Registration line item configuration callback.
 */
function commerce_registration_lineitem_configuration() {
}

/**
 * Registration line item add form callback.
 */
function commerce_registration_lineitem_add_form(&$form_state) {
}

/**
 * Registration line item item add form submit callback.
 */
function commerce_registration_lineitem_add_form_submit(&$line_item, $element, &$form_state, $form) {
}

/**
 * Implements hook_form_alter().
 *
 * Changes the product title in the add to cart form to have the remaining
 * capacity if available.
 */
function commerce_registration_form_alter(&$form, &$form_state, $form_id) {

  // Add waitlist/slots available text to Add to Cart form.
  if (substr($form_id, 0, 30) == 'commerce_cart_add_to_cart_form') {
    switch ($form['product_id']['#type']) {
      case "select":
        $products = $form['product_id']['#options'];
        foreach ($products as $product_id => $title) {
          $product = commerce_product_load($product_id);
          $title = commerce_registration_get_product_title($product);
          $form['product_id']['#options'][$product_id] = $title;
        }
        break;
      case "hidden":
        $product = commerce_product_load($form['product_id']['#value']);
        $entity = array(
          'id' => $product->product_id,
          'type' => 'commerce_product',
          'bundle' => $product->type,
        );
        if (registration_entity_registration_status($entity) == 1) {
          $submit = $form['submit'];
          unset($form['submit']);
          if (registration_entity_has_capacity_limit($entity)) {
            $capacity = registration_entity_slots_available($entity);
            $settings = registration_entity_settings($entity);
            $wl = 0 == $settings['settings']['waitlist'] ? "" : "(waitlist only)";
            $capacity = $capacity != 0 ? format_plural($capacity, '1 slot available', '@count slots available') : t('No slots available @wl', array(
              '@wl' => $wl,
            ));
            $form['capacity'] = array(
              '#type' => 'markup',
              '#markup' => '<em>' . $capacity . '</em>',
            );
          }
          if (registration_can_register($entity)) {
            $form['submit'] = $submit;
          }
          else {
            $form['not_available'] = array(
              '#type' => 'markup',
              '#markup' => t('<p><strong>This item is currently unavailable.</strong></p>'),
            );
          }
        }
        break;
    }
  }

  // Add administrative Registration settings to Product Add/Edit form.
  if (substr($form_id, 0, 32) == 'commerce_product_ui_product_form') {
    if (!function_exists('registration_bundle_options')) {
      module_load_include('inc', 'registration', 'includes/registration.admin');
    }
    $product_info = array(
      'id' => 0,
      'type' => 'commerce_product',
      'bundle' => 'product',
    );
    if (isset($form_state['build_info']['args'][0])) {
      $product = $form_state['build_info']['args'][0];
      $product_info['id'] = $product->product_id;
      $product_info['bundle'] = $product->type;
    }
    $form['registration_settings'] = array(
      '#type' => 'fieldset',
      '#title' => t('Registration Settings'),
      '#collapsible' => TRUE,
      '#collapsed' => !registration_entity_registration_status($product_info),
    );
    $settings = registration_entity_settings($product_info);
    $form['registration_settings'] += registration_default_settings_base_form(array(
      'registration_settings',
    ), $settings);
    $open = $form['registration_settings']['settings']['open_date']['#default_value'];
    $close = $form['registration_settings']['settings']['close_date']['#default_value'];
    $form['registration_settings']['settings']['open_date']['#default_value'] = date('c', (int) $open);
    $form['registration_settings']['settings']['close_date']['#default_value'] = date('c', (int) $close);
    $form['registration_settings']['settings']['status']['#weight'] = -2;
    $form['registration_settings']['settings']['bundle'] = array(
      '#type' => 'select',
      '#options' => registration_bundle_options(),
      '#title' => t('Registration Bundle'),
      '#parents' => array(
        'registration_settings',
        'settings',
        'bundle',
      ),
      '#weight' => -1,
      '#default_value' => registration_entity_registration_bundle($product_info),
    );
    unset($form['registration_settings']['actions']);
    $form['actions']['submit']['#submit'][] = 'commerce_registration_product_ui_form_submit';
  }
}

/**
 * Submission handler for store UI form alterations.
 */
function commerce_registration_product_ui_form_submit($form, $form_state) {
  if (isset($form_state['values']['registration_settings'])) {
    $product = $form_state['build_info']['args'][0];
    $product_info = array(
      'id' => $product->product_id,
      'type' => 'commerce_product',
      'bundle' => $product->type,
    );
    $status = $form_state['values']['registration_settings']['settings']['status'];
    $bundle = $form_state['values']['registration_settings']['settings']['bundle'];
    $settings = registration_entity_settings($product_info);
    $new = array_merge($settings, $form_state['values']['registration_settings']);
    $new['status'] = $status;
    $new['settings']['open_date'] = strtotime($new['settings']['open_date']);
    $new['settings']['close_date'] = strtotime($new['settings']['close_date']);
    unset($new['settings']['bundle']);
    $row_data = array(
      'registration_bundle' => $bundle,
      'settings' => serialize($new),
    );
    if (1 == $status) {
      registration_update_entity_settings($product_info, $row_data);
    }
    else {
      db_delete('registration_attach')
        ->condition('entity_type', 'commerce_product')
        ->condition('entity_bundle', $product->type)
        ->condition('entity_id', $product->product_id)
        ->execute();
    }
  }
}

/**
 * Implements hook_views_api().
 */
function commerce_registration_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'commerce_registration') . '/includes/views',
  );
}

Functions

Namesort descending Description
commerce_registration_commerce_checkout_page_info Implements hook_commerce_checkout_page_info().
commerce_registration_commerce_checkout_pane_info Implements hook_commerce_checkout_pane_info().
commerce_registration_commerce_line_item_type_info Implements hook_commerce_line_item_type_info().
commerce_registration_commerce_line_item_type_info_alter
commerce_registration_form_alter Implements hook_form_alter().
commerce_registration_get_product_title Returns a product title.
commerce_registration_lineitem_add_form Registration line item add form callback.
commerce_registration_lineitem_add_form_submit Registration line item item add form submit callback.
commerce_registration_lineitem_configuration Registration line item configuration callback.
commerce_registration_menu Implements hook_menu().
commerce_registration_product_title Product title line item callback.
commerce_registration_product_ui_form_submit Submission handler for store UI form alterations.
commerce_registration_registration_page Registration page callback for all registrations for a given product display.
commerce_registration_registration_page_access Page access callback to view all registrations for a given product display. @todo Registration function to check if a given entity is register enabled.
commerce_registration_views_api Implements hook_views_api().
commerce_registration_waitlist_add_form Waitlist line item add form callback.
commerce_registration_waitlist_add_form_submit Waitlist line item item add form submit callback.
commerce_registration_waitlist_configuration Waitlist line item configuration callback.
commerce_registration_waitlist_title Waitlist line item title callback.