You are here

function optionwidgets_update_1 in Content Construction Kit (CCK) 5

Reformat allowed values settings into new key|label format

File

./optionwidgets.install, line 12

Code

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

  // find distinct values already stored in the database
  $result = db_query("SELECT * FROM {node_field_instance} fi LEFT JOIN {node_field} f ON fi.field_name=f.field_name WHERE widget_type IN ('options_select', 'options_buttons')");
  while ($field_instance = db_fetch_array($result)) {
    $db_info = content_database_info($field_instance);
    $result2 = db_query("SELECT DISTINCT " . $db_info['columns']['value']['column'] . " FROM {" . $db_info['table'] . "}");
    while ($value = db_fetch_array($result2)) {
      $values[$field_instance['field_name']][$value[$db_info['columns']['value']['column']]] = $value[$db_info['columns']['value']['column']];
    }
  }

  // find all field instances that use the optionwidgets widget
  $result = db_query("SELECT DISTINCT f.field_name, f.type, global_settings FROM {node_field} f LEFT JOIN {node_field_instance} fi ON fi.field_name=f.field_name WHERE widget_type IN ('options_select', 'options_buttons') AND type IN ('text', 'number_integer', 'number_decimal')");
  while ($field = db_fetch_object($result)) {
    $updated = FALSE;
    $used_keys = $used_deltas = $keys = $deltas = $delta_values = $key_values = $allowed_values = array();

    // get the current allowed values settings
    $global_settings = array();
    if ($field->global_settings) {
      $global_settings = unserialize($field->global_settings);
    }
    $start_values = $global_settings['allowed_values'];
    $list = explode("\n", $start_values);
    $list = array_map('trim', $list);
    $list = array_filter($list, 'strlen');
    $delta = 1;
    foreach ($list as $opt) {
      list($key, $label) = explode('|', $opt);
      $delta_values[] = $delta . '|' . $key;
      $key_values[] = $key . '|' . $key;
      if ($label) {

        // this field has already been updated to use keys and labels, no change needed
        $updated = TRUE;
      }
      else {
        $keys[] = $key;
        $deltas[] = $delta;
        $delta++;
      }
    }
    if (!$updated && $global_settings['allowed_values']) {

      // see if current data is storing the delta or the allowed values value
      if (is_array($values[$field->field_name])) {
        $used_keys = array_intersect($keys, $values[$field->field_name]);
        $used_deltas = array_intersect($deltas, $values[$field->field_name]);
      }
      if (!$used_keys || sizeof($used_deltas) > sizeof($used_keys)) {
        $allowed_values = $delta_values;
      }
      else {
        $allowed_values = $key_values;
      }

      // update the allowed values setting to use the correct key|label combination
      $global_settings['allowed_values'] = implode("\n", $allowed_values);
      db_query("UPDATE {node_field} SET type = '%s', global_settings = '%s' WHERE field_name = '%s'", $field->type, serialize($global_settings), $field->field_name);
      drupal_set_message(t('<div>The allowed values list for %field was updated from </div><pre>%start</pre><div> to </div><pre>%end</pre><div>You can go to the field settings page to give each option a more user-friendly label.', array(
        '%field' => $field->field_name,
        '%start' => $start_values,
        '%end' => $global_settings['allowed_values'],
      )));
    }
    else {
      drupal_set_message(t('<div>The allowed values list for %field was not changed from </div><pre>%start</pre>', array(
        '%field' => $field->field_name,
        '%start' => $start_values,
      )));
    }
  }
  db_query('DELETE FROM {cache}');
  return $ret;
}