You are here

function uc_extra_fields_pane_update_6202 in Extra Fields Checkout Pane 6.2

Changes field 'delta' to 'weight', also changes length of field_value_type and field_weight Completely changes values table

File

./uc_extra_fields_pane.install, line 223
Module: uc_extra_fields_pane.module

Code

function uc_extra_fields_pane_update_6202() {
  $ret = array();

  // ------------------------------------------------
  // Rename fields
  // ------------------------------------------------
  db_change_field($ret, 'uc_extra_fields', 'field_name', 'label', array(
    'type' => 'varchar',
    'length' => '100',
    'not null' => TRUE,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_description', 'description', array(
    'type' => 'text',
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_db_name', 'db_name', array(
    'type' => 'varchar',
    'length' => '32',
    'not null' => TRUE,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_pane_type', 'pane_type', array(
    'description' => t('The defined pane type for this field to appear in. If you want more panes, one of the things you will have to do is add another pane type inside uc_extra_fields_pane.module.'),
    'type' => 'varchar',
    'length' => '36',
    'not null' => FALSE,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_delta', 'weight', array(
    'description' => t('The list position of this field on the pane selected for this field.'),
    'type' => 'int',
    'not null' => FALSE,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_value_type', 'value_type', array(
    'description' => t('The type of input to the field_value database field.'),
    'type' => 'int',
    'size' => 'small',
    'not null' => FALSE,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_value', 'value', array(
    'description' => t('A blob that can be used to store anything from php code, to constant values, to select values'),
    'type' => 'blob',
    'not null' => FALSE,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_display', 'display', array(
    'type' => 'int',
    'size' => 'tiny',
    'not null' => TRUE,
    'default' => 0,
  ));
  db_change_field($ret, 'uc_extra_fields', 'field_required', 'required', array(
    'type' => 'int',
    'size' => 'tiny',
    'not null' => TRUE,
    'default' => 0,
  ));

  // Add field 'enabled'
  db_add_field($ret, 'uc_extra_fields', 'enabled', array(
    'type' => 'int',
    'size' => 'tiny',
    'not null' => TRUE,
    'default' => 1,
  ));

  // ------------------------------------------------
  // Update values table
  // ------------------------------------------------
  // Change order_id in element_id
  db_change_field($ret, 'uc_extra_fields_values', 'order_id', 'element_id', array(
    'description' => t('Order id or address id'),
    'type' => 'int',
    'not null' => TRUE,
  ));

  // Add element_type, field_id and value
  db_add_field($ret, 'uc_extra_fields_values', 'element_type', array(
    'description' => t('Type of element: order or address'),
    'type' => 'int',
    'size' => 'tiny',
    'not null' => TRUE,
  ));
  db_add_field($ret, 'uc_extra_fields_values', 'field_id', array(
    'description' => t('ID of field used in uc_extra_fields table'),
    'type' => 'int',
    'not null' => TRUE,
  ));
  db_add_field($ret, 'uc_extra_fields_values', 'value', array(
    'description' => t('The value filled in by the user'),
    'type' => 'varchar',
    'length' => '255',
    'not null' => TRUE,
  ));

  // Set new primary key
  db_drop_primary_key($ret, 'uc_extra_fields_values');
  db_add_primary_key($ret, 'uc_extra_fields_values', array(
    'element_id',
    'element_type',
    'field_id',
  ));

  // Move values
  $orders = array();
  $fieldsresult = db_query('SELECT field_id, db_name, pane_type FROM {uc_extra_fields}');
  while ($field = db_fetch_array($fieldsresult)) {

    // Get element type: info = 11, delivery = 12, billing = 13
    switch ($field['pane_type']) {
      case 'extra_delivery':
        $element_type = 12;
        break;
      case 'extra_billing':
        $element_type = 13;
        break;
      default:
        $element_type = 11;
        break;
    }

    // Get value of column db_name and save it to orders array
    $query = "SELECT element_id AS order_id, %s AS value FROM {uc_extra_fields_values}";
    $orderresult = db_query($query, $field['db_name']);
    while ($order = db_fetch_array($orderresult)) {
      $orders[$order['order_id']][$field['field_id']] = array(
        'element_type' => $element_type,
        'value' => $order['value'],
      );
    }

    // Drop column
    db_drop_field($ret, 'uc_extra_fields_values', $field['db_name']);
  }

  // Remove all rows (all additional order data will be re-added)
  $ret[] = update_sql("TRUNCATE TABLE {uc_extra_fields_values}");

  // Insert new rows
  foreach ($orders as $order_id => $orderfields) {
    $query = "INSERT INTO {uc_extra_fields_values} (element_id, element_type, field_id, value) VALUES ";
    $count = 0;
    foreach ($orderfields as $field_id => $field) {
      if ($count > 0) {

        // After the first insert a comma must be added to the query, because multiple values will be inserted.
        $query .= ",";
      }
      $query .= "(" . $order_id . ", " . $field['element_type'] . ", " . $field_id . ", '" . check_plain($field['value']) . "')";
      $count++;
    }
    $ret[] = update_sql($query);
  }

  // Merge billing fields into delivery fields (needed for nice upgrade from 6.x-1.x)
  $delivery_rows = array();
  $billing_rows = array();
  $result = db_query("SELECT field_id, db_name FROM {uc_extra_fields} WHERE db_name LIKE '%_delivery' OR db_name LIKE '%_billing'");
  while ($row = db_fetch_array($result)) {
    $db_name = $row['db_name'];
    if (preg_match('/\\_delivery$/i', $row['db_name'])) {
      $db_name = substr($db_name, 0, drupal_strlen($db_name) - strlen('_delivery'));
      $delivery_rows[$db_name] = $row;
    }
    if (preg_match('/\\_billing$/i', $row['db_name'])) {
      $db_name = substr($db_name, 0, drupal_strlen($db_name) - strlen('_billing'));
      $billing_rows[$db_name] = $row;
    }
  }
  foreach ($delivery_rows as $db_name => $row) {
    if (isset($billing_rows[$db_name])) {

      // Match found, merge them
      $delivery_field_id = $row['field_id'];
      $billing_field_id = $billing_rows[$db_name]['field_id'];
      $ret[] = update_sql("UPDATE {uc_extra_fields_values} SET field_id=" . $delivery_field_id . " WHERE field_id=" . $billing_field_id);

      // Delete billing field
      $ret[] = update_sql("DELETE FROM {uc_extra_fields} WHERE field_id=" . $billing_field_id);

      // Update delivery field
      $ret[] = update_sql("UPDATE {uc_extra_fields} SET db_name='" . $db_name . "', pane_type='extra_delivery|extra_billing' WHERE field_id=" . $delivery_field_id);
    }
  }
  return $ret;
}