You are here

function tablefield_update_7003 in TableField 7.3

Same name and namespace in other branches
  1. 7.2 tablefield.install \tablefield_update_7003()

Re-save the default existing table fields and all entities containing them.

File

./tablefield.install, line 114
Installation options for TableField.

Code

function tablefield_update_7003() {

  // Change the default field for each content type.
  $instances = field_info_instances();
  $field_names = array();
  foreach ($instances as $entity_type => $entities) {
    foreach ($entities as $bundle => $fields) {
      foreach ($fields as $field_name => $instance) {
        if (in_array($instance['widget']['type'], array(
          'tablefield',
        ))) {

          // Uniquely store the field names in an array for later use.
          if (!in_array($instance['field_name'], $field_names)) {
            array_push($field_names, $instance['field_name']);
          }

          // Rationalize the table data.
          if (!empty($instance['default_value'][0]['tablefield'])) {

            // Remove extraneous data.
            $count_cols = $instance['default_value'][0]['tablefield']['rebuild']['count_cols'];
            $count_rows = $instance['default_value'][0]['tablefield']['rebuild']['count_rows'];
            $caption = $instance['default_value'][0]['tablefield']['caption'];
            $rebuild = $instance['default_value'][0]['tablefield']['rebuild'];
            $import = $instance['default_value'][0]['tablefield']['import'];
            $paste = $instance['default_value'][0]['tablefield']['paste'];
            unset($instance['default_value'][0]['tablefield']['caption']);
            unset($instance['default_value'][0]['tablefield']['rebuild']);
            unset($instance['default_value'][0]['tablefield']['import']);
            unset($instance['default_value'][0]['tablefield']['paste']);
            foreach ($instance['default_value'][0]['tablefield'] as $key => $value) {
              if (preg_match('/cell_(.*)_(.*)/', $key, $cell)) {

                // $cell[1] is row count $cell[2] is col count.
                if ((int) $cell[1] < $count_rows && (int) $cell[2] < $count_cols) {
                  $cel = explode('_', ltrim($key, 'cell_'));
                  if ($cel[1] === 'weight') {
                    $instance['default_value'][0]['tablefield']['tabledata']['row_' . $cel[0]]['weight'] = $value;
                  }
                  else {
                    $instance['default_value'][0]['tablefield']['tabledata']['row_' . $cel[0]]['col_' . $cel[1]] = $value;
                  }
                  unset($instance['default_value'][0]['tablefield'][$key]);
                }
              }
            }
          }

          // Recreate previous removed data.
          $instance['default_value'][0]['tablefield']['caption'] = $caption;
          $instance['default_value'][0]['tablefield']['rebuild'] = $rebuild;
          $instance['default_value'][0]['tablefield']['import'] = $import;
          $instance['default_value'][0]['tablefield']['paste'] = $paste;
          field_update_instance($instance);
        }
      }
    }
  }

  // Change all existing fields to store the data with the new format.
  foreach ($field_names as $field_name) {
    $tables = array(
      'field_data_' . $field_name,
      'field_revision_' . $field_name,
    );
    foreach ($tables as $table) {
      $field = $field_name . '_value';
      $query = db_select($table, 'n')
        ->fields('n')
        ->execute()
        ->fetchAll();
      foreach ($query as $record) {
        $instance = unserialize($record->{$field});

        // Rationalize the table data.
        if (!empty($instance)) {

          // Remove extraneous data.
          $count_cols = $instance['rebuild']['count_cols'];
          $count_rows = $instance['rebuild']['count_rows'];
          $caption = $instance['caption'];
          $rebuild = $instance['rebuild'];
          $import = $instance['import'];
          $paste = $instance['paste'];
          unset($instance['caption']);
          unset($instance['rebuild']);
          unset($instance['import']);
          unset($instance['paste']);
          foreach ($instance as $key => $value) {
            if (preg_match('/cell_(.*)_(.*)/', $key, $cell)) {

              // $cell[1] is row count $cell[2] is col count.
              if ((int) $cell[1] < $count_rows && (int) $cell[2] < $count_cols) {
                $cel = explode('_', ltrim($key, 'cell_'));
                if ($cel[1] === 'weight') {
                  $instance['tabledata']['row_' . $cel[0]]['weight'] = $value;
                }
                else {
                  $instance['tabledata']['row_' . $cel[0]]['col_' . $cel[1]] = $value;
                }
                unset($instance[$key]);
              }
            }
          }
        }

        // Recreate previous removed data.
        $instance['caption'] = $caption;
        $instance['rebuild'] = $rebuild;
        $instance['import'] = $import;
        $instance['paste'] = $paste;

        // Change the stored data by a per record unique column key combination.
        db_update($table)
          ->fields(array(
          $field => serialize($instance),
        ))
          ->condition('entity_id', $record->entity_id)
          ->condition('revision_id', $record->revision_id)
          ->condition('delta', $record->delta)
          ->condition('entity_type', $record->entity_type)
          ->condition('bundle', $record->bundle)
          ->execute();
      }
    }
  }
  field_cache_clear();
  drupal_set_message(t('All Table Field fields are now stored with a new data format.'), 'warning');
}