/** * Test MatrixConverter::convertMatrixColumns() method * * @dataProvider columnDataProvider */ public function testColumnConversion($expected, $columns, $field_id, $description) { $grid_fieldtypes = array('checkboxes', 'date', 'file', 'multi_select', 'radio', 'select', 'text', 'textarea', 'rte'); $new_columns = MatrixConverter::convertMatrixColumns($columns, $grid_fieldtypes, $field_id); foreach ($new_columns as $col_id => $value) { unset($new_columns[$col_id]['col_settings']); } $this->assertEquals($expected, $new_columns, $description); }
/** * Performs the full import of all Matrix channel fields into native Grid fields * * @return array Array of new Grid field IDs */ public function do_import() { ee()->load->library('pm_import_common'); $matricies = $this->get_matrix_fields(); $columns = $this->get_matrix_columns(); // Load Grid package so we can get a list of Grid compatible fieldtypes ee()->load->add_package_path(PATH_FT . 'grid/'); ee()->load->library('grid_lib'); $grid_fieldtypes = array_keys(ee()->grid_lib->get_grid_fieldtypes()); ee()->load->remove_package_path(PATH_FT . 'grid/'); ee()->load->library('api'); ee()->api->instantiate('channel_fields'); ee()->load->model('grid_model'); ee()->load->model('addons_model'); $original_site_id = ee()->config->item('site_id'); // We'll keep track of the mapping of Matrix fields and columns to their // corresponding new Grid fields and columns here $matrix_to_grid_fields = array(); $matrix_to_grid_cols = array(); foreach ($matricies as $matrix) { // Let's be explicit about what's making up this new field $new_grid_field = array('site_id' => $matrix['site_id'], 'group_id' => $matrix['group_id'], 'field_label' => $matrix['field_label'], 'field_name' => ee()->pm_import_common->get_unique_field_name($matrix['field_name'], '_grid', $matrix['site_id']), 'field_type' => 'grid', 'field_instructions' => $matrix['field_instructions'], 'field_required' => $matrix['field_required'], 'field_search' => $matrix['field_search'], 'field_order' => 0); // Hack to prevent errors from showing from Grid_lib when we create the field $_POST['grid']['cols'] = array(); // Hack to prevent site ID mismatch error in API channel fields ee()->config->config['site_id'] = $new_grid_field['site_id']; $field_id = ee()->api_channel_fields->update_field($new_grid_field); // Reset the hack ee()->config->config['site_id'] = $original_site_id; $new_field_settings = MatrixConverter::convertSettings(unserialize(base64_decode($matrix['field_settings']))); // Set new field settings from converted Matrix settings ee()->db->set('field_settings', base64_encode(serialize($new_field_settings)))->where('field_id', $field_id)->update('channel_fields'); $new_columns = MatrixConverter::convertMatrixColumns($columns[$matrix['field_id']], $grid_fieldtypes, $field_id); // Create new columns and gather new column IDs to map to old columns $new_column_ids = array(); $playa_columns = array(); foreach ($new_columns as $matrix_col_id => $column) { $col_id = ee()->grid_model->save_col_settings($column); // Create mapping from old columns to new $matrix_to_grid_cols[$matrix_col_id] = $col_id; $new_column_ids[$matrix_col_id] = $col_id; // Collect Playa cell IDs so we know not to import the data in those, // we don't need to store anything about relationships in the Grid // field table if ($column['col_type'] == 'relationship') { $playa_columns[] = $matrix_col_id; } } $matrix_data = $this->get_matrix_data($new_column_ids, $matrix['field_id'], $playa_columns); $new_data = MatrixConverter::convertMatrixData($matrix_data, $new_column_ids, $columns[$matrix['field_id']]); // Add Publisher fields if installed if (ee()->addons_model->module_installed('publisher')) { ee()->pm_import_common->add_publisher_columns('channel_grid_field_' . $field_id); } // Fill Grid field with new data if (!empty($new_data)) { ee()->db->insert_batch('channel_grid_field_' . $field_id, $new_data); } $matrix_to_grid_fields[$matrix['field_id']] = $field_id; } // Import Playa data for Grid columns $this->import_playa_data($matrix_to_grid_fields, $matrix_to_grid_cols); // Import Assets data $this->import_assets_data($matrix_to_grid_fields, $matrix_to_grid_cols); // For columns marked as searchable, copy their searchable text over // to the new Grid fields= $this->import_searchable_data($matrix_to_grid_fields); return array_values($matrix_to_grid_fields); }