You are here

UCXF_Pane.class.php in Extra Fields Checkout Pane 6.2

Contains the UCXF_Pane class.

File

class/UCXF_Pane.class.php
View source
<?php

/**
 * @file
 * Contains the UCXF_Pane class.
 */

/**
 * Base class for checkout panes and order panes implemented by Extra Fields Pane.
 *
 * The extra information pane uses this class directly, while the delivery and
 * billing panes make use of UCXF_AddressPane instead.
 */
class UCXF_Pane {

  // -----------------------------------------------------------------------------
  // CONSTANTS
  // -----------------------------------------------------------------------------
  const PANE_CHECKOUT = 'checkout';
  const PANE_ORDER = 'order';

  // -----------------------------------------------------------------------------
  // PROPERTIES
  // -----------------------------------------------------------------------------

  /**
   * Pane ID
   * @var string
   * @access protected
   */
  protected $pane_id;

  /**
   * Ubercart pane type
   * 'order' or 'checkout'
   * @var string
   * @access protected
   */
  protected $uc_pane_type;

  /**
   * Order object
   * @var object
   * @access protected
   */
  protected $order;

  /**
   * Filled in values in pane form
   * @var array
   * @access protected
   */
  protected $values;

  // -----------------------------------------------------------------------------
  // STATIC PROPERTIES
  // -----------------------------------------------------------------------------

  /**
   * An array of all processed order panes
   * Used by uc_extra_fields_pane_order().
   * @var array
   * @access private
   */
  private static $processed_order_panes = array();

  // -----------------------------------------------------------------------------
  // CONSTRUCT
  // -----------------------------------------------------------------------------

  /**
   * UCXF_Pane object constructor
   * @param string $pane_type
   * @param string $uc_pane_type
   * @param object $order
   * @param mixed $arg2
   * @access public
   * @return void
   */
  public function __construct($pane_id, $uc_pane_type, $order, &$values) {
    $this->pane_id = $pane_id;
    $this->uc_pane_type = $uc_pane_type;
    $this->order = $order;
    $this->values = $values;
  }

  // -----------------------------------------------------------------------------
  // ACTION
  // -----------------------------------------------------------------------------

  /**
   * Executes an operation
   * @param string $op
   * @return mixed
   */
  public function execute($op) {
    try {

      // Replace hyphens with underscores
      $op = str_replace('-', '_', $op);
      switch ($this->uc_pane_type) {
        case self::PANE_CHECKOUT:
          switch ($op) {

            // Supported operations for checkout
            case 'view':
            case 'process':
            case 'review':
              return $this
                ->{$this->uc_pane_type . '_' . $op}();
          }
          break;
        case self::PANE_ORDER:
          switch ($op) {

            // Supported operations for order
            case 'customer':
            case 'view':
            case 'edit_form':
            case 'edit_theme':
            case 'edit_process':
              return $this
                ->{$this->uc_pane_type . '_' . $op}();
          }
          break;
      }
      return NULL;
    } catch (UCXF_Exception $e) {
      $e
        ->printMessage();
      $e
        ->logError();
    }
  }

  // -----------------------------------------------------------------------------
  // CHECKOUT
  // -----------------------------------------------------------------------------

  /**
   * View the pane to the customer
   * @access protected
   * @return string
   */
  protected function checkout_view() {
    $fields = $this
      ->loadFields();
    $contents = array();

    // Dynamically generate form elements
    $description = '';
    if (count($fields) > 0) {
      foreach ($fields as $field) {
        if ($field->enabled) {
          $generated_field = $field
            ->generate();
          $order_field_name = $this
            ->getFieldName($field);

          // Adding default value for every field except for hidden fields (php and constant)
          if (isset($this->order->{$order_field_name}) && $generated_field['#type'] !== 'hidden') {
            $generated_field['#default_value'] = $this->order->{$order_field_name};
          }

          // Add field
          $contents[$order_field_name] = $generated_field;

          // If the field happens to be a hidden field, display value if the user asks
          // This currently applies to value_type of php and constant ONLY
          if ($generated_field['#type'] == 'hidden' && $field
            ->may_display('checkout')) {
            $contents[$order_field_name . '_i'] = array(
              '#type' => 'item',
              '#title' => $field
                ->output('label'),
              '#value' => $generated_field['#value'],
            );
          }
        }
      }
    }
    return array(
      'description' => $description,
      'contents' => $contents,
      'theme' => 'uc_extra_fields_pane_checkout_pane',
    );
  }

  /**
   * Processes filled in values
   * @access public
   * @return protected
   */
  protected function checkout_process() {

    // If there were hidden fields, add them to the values array
    if (isset($this->values['hidden_fields'])) {
      foreach ($this->values['hidden_fields'] as $fieldname => $value) {
        $this->values[$fieldname] = $value;
      }
    }
    foreach ($this->values as $fieldname => $value) {
      $this->order->{$fieldname} = $value;
    }
    return TRUE;
  }

  /**
   * Outputs data for the review page
   * @access protected
   * @return string
   */
  protected function checkout_review() {
    $fields = $this
      ->loadFields();
    if (count($fields)) {
      foreach ($fields as $field) {

        // Display it as data
        $order_field_name = $this
          ->getFieldName($field);
        if ($field
          ->may_display('review')) {
          $data = $field
            ->output_value($this->order->{$order_field_name});
          $review[] = array(
            'title' => $field
              ->output('label'),
            'data' => $data,
          );
        }
      }
      return $review;
    }
  }

  // -----------------------------------------------------------------------------
  // ORDER
  // -----------------------------------------------------------------------------

  /**
   * View the order data for the customer
   * @access protected
   * @return string
   */
  protected function order_customer() {
    return $this
      ->order_view();
  }

  /**
   * View the order data
   * @access protected
   * @return string
   */
  protected function order_view() {
    $fields = $this
      ->loadFields();
    $output = '';

    // Load values (depends on pane type)
    switch ($this->pane_id) {
      case 'delivery':
        $values = uc_extra_fields_pane_value_list_load($this->order->order_id, UCXF_VALUE_ORDER_DELIVERY);
        break;
      case 'billing':
        $values = uc_extra_fields_pane_value_list_load($this->order->order_id, UCXF_VALUE_ORDER_BILLING);
        break;
      default:
        $values = uc_extra_fields_pane_value_list_load($this->order->order_id, UCXF_VALUE_ORDER_INFO);
        break;
    }
    $custom_order_fields = array();
    if (count($fields)) {
      foreach ($fields as $field) {
        if (isset($values[$field->field_id])) {

          // Only display if it may be displayed
          if ($field
            ->may_display('order')) {
            $field_contents = $field
              ->output_value($values[$field->field_id]
              ->getValue());
            $custom_order_fields[] = '<strong>' . $field
              ->output('label') . '</strong>: ' . $field_contents;
          }
        }
      }
    }
    if (count($custom_order_fields)) {
      $output .= '<br />' . implode('<br />', $custom_order_fields);
    }
    return $output;
  }

  /**
   * View the editable form
   * @access protected
   * @return array
   */
  protected function order_edit_form() {
    $fields = $this
      ->loadFields();
    $form['ucxf_' . $this->pane_id] = array(
      '#type' => 'fieldset',
      '#title' => t('Additional order information'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
      '#tree' => TRUE,
    );

    // Dynamically generate form elements
    if (count($fields)) {
      foreach ($fields as $field) {
        if ($field->enabled) {
          $generated_field = $field
            ->generate();
          $order_field_name = $this
            ->getFieldName($field);
          $default = isset($this->order->{$order_field_name}) ? $this->order->{$order_field_name} : NULL;
          if (!is_null($default) || !isset($generated_field['#default_value'])) {
            $generated_field['#default_value'] = $default;
          }

          // On the order edit form, a generated field shouldn't be a hidden field.
          // In this case the field will be set to a normal textfield, so it's editable.
          if ($generated_field['#type'] == 'hidden') {
            $generated_field['#type'] = 'textfield';
            if (is_null($default)) {

              // Set a default value if there is no saved value for.
              $generated_field['#default_value'] = $generated_field['#value'];
            }

            // Unset value, field already has an default value
            unset($generated_field['#value']);

            // Set title and size of field.
            $generated_field['#title'] = $field
              ->output('label');
            $generated_field['#size'] = 32;
          }

          // In case of select fields, add default value as an option if it is not an available option yet.
          if ($generated_field['#type'] == 'select') {
            $default_value = $generated_field['#default_value'];
            if ($default_value != '' && !isset($generated_field['#options'][$default_value])) {
              $generated_field['#options'][$default_value] = t('Deleted option: @option', array(
                '@option' => $default_value,
              ));
            }
          }

          // Do not make any field required on the edit form
          $generated_field['#required'] = FALSE;

          // Add generated field to form
          $form['ucxf_' . $this->pane_id][$order_field_name] = $generated_field;
        }
      }
    }
    return $form;
  }

  /**
   * Theme the editable form
   * @access protected
   * @return string
   */
  protected function order_edit_theme() {
    $fields = $this
      ->loadFields();

    // Remove pane_fields that are not enabled
    foreach ($fields as $fieldname => $field) {
      if (!$field->enabled && isset($this->order['ucxf_' . $this->pane_id][$fieldname])) {
        unset($this->order['ucxf_' . $this->pane_id][$fieldname]);
      }
    }
    $output = theme('uc_extra_fields_pane_order_pane', $this->order['ucxf_' . $this->pane_id]);
    return $output;
  }

  /**
   * Process order data
   * @access protected
   * @return array
   */
  protected function order_edit_process() {
    $fields = $this
      ->loadFields();
    $pane_name = $this
      ->getPaneName();
    $changes = array();
    if (count($fields)) {
      foreach ($fields as $field) {
        $order_field_name = $this
          ->getFieldName($field);
        if (isset($this->order['ucxf_' . $pane_name][$order_field_name])) {
          $changes[$order_field_name] = $this->order['ucxf_' . $pane_name][$order_field_name];
        }
        elseif (isset($this->order[$order_field_name])) {
          $changes[$order_field_name] = $this->order[$order_field_name];
        }
      }
    }
    self::$processed_order_panes[] = 'ucxf_' . $pane_name;
    return $changes;
  }

  // -----------------------------------------------------------------------------
  // STATIC METHODS
  // -----------------------------------------------------------------------------

  /**
   * Returns all order panes processed by order_edit_process
   * This method is used in uc_extra_fields_pane_order().
   * @access public
   * @return array
   */
  public static function getProcessedOrderPanes() {
    return self::$processed_order_panes;
  }

  // -----------------------------------------------------------------------------
  // UTIL
  // -----------------------------------------------------------------------------

  /**
   * Load fields from db
   * @access protected
   * @return array
   */
  protected function loadFields() {
    return UCXF_FieldList::getFieldsFromPane('extra_' . $this->pane_id);
  }

  /**
   * Create key for field
   * @param UCXF_Field $field
   * @access protected
   * @return string
   */
  protected function getFieldName($field) {
    return $this->pane_id . '_' . $field->db_name;
  }

  /**
   * Returns name of original pane
   * @access protected
   * @return string
   */
  protected function getPaneName() {
    return $this->pane_id;
  }

}

Classes

Namesort descending Description
UCXF_Pane Base class for checkout panes and order panes implemented by Extra Fields Pane.