finished showroom migration batch function

This commit is contained in:
Bachir Soussi Chiadmi 2016-11-27 19:48:58 +01:00
parent 5423f6d3bc
commit 1ec80dc60e
2 changed files with 329 additions and 4 deletions

View File

@ -24,7 +24,7 @@
function materio_showroom_field_schema($field) {
$columns = array(
'showroom_tid' => array('type' => 'int', 'not null' => FALSE),
'location' => array('type' => 'varchar', 'length' => 10, 'not null' => TRUE),
'location' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
);
$indexes = array(
'location' => array('location'),

View File

@ -115,10 +115,11 @@ function materio_showroom_field_formatter_view($entity_type, $entity, $field, $i
// This formatter simply outputs the field as text and with a color.
case 'materio_showroom_location_simple_text':
foreach ($items as $delta => $item) {
$term = taxonomy_term_load($item['showroom_tid']);
$element[$delta] = array(
'#type' => 'html_tag',
'#tag' => 'p',
'#value' => t('@loc', array('@loc' => $item['location'])),
'#value' => t('%showroom : @loc', array('%showroom' => $term->name, '@loc' => $item['location'])),
);
}
break;
@ -196,7 +197,7 @@ function materio_showroom_field_widget_form(&$form, &$form_state, $field, $insta
// Allow a slightly larger size that the field length to allow for some
// configurations where all characters won't fit in input field.
'#size' => 10,
'#maxlength' => 10,
'#maxlength' => 255,
);
$widget['location'] = array(
@ -206,7 +207,7 @@ function materio_showroom_field_widget_form(&$form, &$form_state, $field, $insta
// Allow a slightly larger size that the field length to allow for some
// configurations where all characters won't fit in input field.
'#size' => 10,
'#maxlength' => 10,
'#maxlength' => 255,
);
break;
@ -371,3 +372,327 @@ function _materio_showroom_alter_location_field_form(&$form, &$form_state, $form
}
// TODO: migrate old location field to new one
/**
* Implements hook_permission().
*/
function materio_showroom_permission() {
return array(
'materio showroom migrate fields' => array(
'title' => t('Migrate materio showroom location fields'),
'description' => t('Migrate materio showroom location fields'),
),
);
}
// __ ____ __ _
// / |/ (_)___ __________ _/ /_(_)___ ____
// / /|_/ / / __ `/ ___/ __ `/ __/ / __ \/ __ \
// / / / / / /_/ / / / /_/ / /_/ / /_/ / / / /
// /_/ /_/_/\__, /_/ \__,_/\__/_/\____/_/ /_/
// /____/
/**
* Implements hook_menu().
*/
function materio_showroom_menu() {
$items['admin/config/content/materio_showroom'] = array(
'title' => 'Showrooms location fields migration settings',
'page callback' => 'drupal_get_form',
'page arguments' => array('materio_showroom_migrate_location_fields_settings_form'),
'access arguments' => array('materio showroom migrate fields'),
'type' => MENU_LOCAL_ACTION,
// 'file' => ,
);
// $items['admin/config/content/materio_showroom/migrate'] = array(
// 'title' => 'Migrate showrooms location fields',
// 'page callback' => 'materio_showroom_migrate_location_fields',
// // 'page arguments' => array('materio_showroom_migrate_location_fields'),
// 'access arguments' => array('materio showroom migrate fields'),
// 'type' => MENU_LOCAL_TASK,
// // 'file' => ,
// );
return $items;
}
function materio_showroom_migrate_location_fields_settings_form(){
drupal_set_title('Showroom Migration settings', PASS_THROUGH);
$field_type = 'field_materio_showroom_location';
$types = node_type_get_types();
// dsm($types, 'types');
$nt_options = array();
foreach ($types as $mn => $type) {
$nt_options[$mn] = $type->name;
}
$node_type = variable_get('materio_showroom_migrate_node_type', null);
// source field (must be a text field)
$form['node_type'] = array(
'#type'=>'select',
'#options'=>$nt_options,
'#default_value' => $node_type,
'#title' => t('source field (must be a text field)'),
'#multiple' => false,
);
if($node_type){
$fieldsmap = field_info_field_map();
$src_options = array();
$target_options = array();
foreach ($fieldsmap as $field_name => $field) {
// dsm($field, $field_name);
if ($field['type'] == 'text'
&& isset($field['bundles']['node'])
&& in_array($node_type, $field['bundles']['node'])) {
$src_options[$field_name] = $field_name;
}
if ($field['type'] == $field_type
&& isset($field['bundles']['node'])
&& in_array($node_type, $field['bundles']['node'])) {
$target_options[$field_name] = $field_name;
}
}
// source field (must be a text field)
$form['source_field'] = array(
'#type'=>'select',
'#options'=>$src_options,
'#default_value' => variable_get('materio_showroom_migrate_source_field', null),
'#title' => t('source field (must be a text field)'),
'#multiple' => false,
);
// target field (must be a showroom location field)
$form['target_field'] = array(
'#type'=>'select',
'#options'=>$target_options,
'#default_value' => variable_get('materio_showroom_migrate_target_field', null),
'#title' => t('target field (must be a showroom location field)'),
'#multiple' => false,
);
$vocs = taxonomy_get_vocabularies();
$voc_options = array();
foreach ($vocs as $vid => $voc) {
$voc_options[$vid] = $voc->name;
}
// vocabulary for showrooms
$vid = variable_get('materio_showroom_migrate_vocabulary', null);
$form['vocabulary'] = array(
'#type'=>'select',
'#options'=>$voc_options,
'#default_value' => $vid,
'#title' => t('vocabulary for showrooms'),
'#multiple' => false,
);
// default taxonomy term
if($vid){
$tree = taxonomy_get_tree($vid);
foreach ($tree as $key => $term) {
$terms_options[$term->tid] = $term->name;
}
$term = variable_get('materio_showroom_migrate_default_term', null);
$form['default_term'] = array(
'#type'=>'select',
'#options'=>$terms_options,
'#default_value' => $term,
'#title' => t('default taxonomy term'),
'#multiple' => false,
);
if($term){
$form['migrate'] = array(
'#type' => 'submit',
'#value' => 'Migrate',
// '#submit' => array('materio_showroom_migrate_location_fields_migrate'),
);
}
}
}
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Save',
// '#submit' => array('materio_showroom_migrate_location_fields_migrate'),
);
return $form;
}
function materio_showroom_migrate_location_fields_settings_form_submit($form, &$form_state){
// dsm($form_state, 'form_state');
$node_type = $form_state['values']['node_type'];
$src_field = $form_state['values']['source_field'];
$target_field = $form_state['values']['target_field'];
$vid = $form_state['values']['vocabulary'];
$default_term = $form_state['values']['default_term'];
variable_set('materio_showroom_migrate_node_type', $node_type);
variable_set('materio_showroom_migrate_source_field', $src_field);
variable_set('materio_showroom_migrate_target_field', $target_field);
variable_set('materio_showroom_migrate_vocabulary', $vid);
variable_set('materio_showroom_migrate_default_term', $default_term);
// dsm($node_type, 'node_type');
// dsm($src_field,"src_field");
// dsm($target_field,"target_field");
// dsm($vid,"vid");
// dsm($default_term,"default_term");
if ($form_state['values']['op'] == 'Migrate'){
_materio_showroom_batch_migration($node_type, $src_field, $target_field, $vid, $default_term);
}
// $query = "INSERT INTO field_data_field_screenshot SELECT a.* FROM field_data_field_image a LEFT JOIN field_data_field_screenshot b ON a.entity_id = b.entity_id AND a.entity_type = b.entity_type WHERE b.entity_id IS NULL";
//
// $query2 = "INSERT INTO field_revision_field_screenshot SELECT a.* FROM field_revision_field_image a LEFT JOIN field_revision_field_screenshot b ON a.entity_id = b.entity_id AND a.entity_type = b.entity_type WHERE b.entity_id IS NULL";
}
function _materio_showroom_batch_migration($node_type, $src_field, $target_field, $vid, $tid){
// Reset counter for debug information.
$_SESSION['http_request_count'] = 0;
$batch = array(
'title' => t('Migrating Showroom fields ...'),
'operations' => array(),
'init_message' => t('Commencing'),
'progress_message' => t('Processed @current out of @total.'),
'error_message' => t('An error occurred during processing'),
'finished' => '_materio_showroom_batch_migration_finished',
);
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', $node_type)
->fieldCondition($src_field, 'value', '', '!=');
$result = $query->execute();
// dsm($result, 'result');
if (isset($result['node'])) {
$voc = taxonomy_vocabulary_load($vid);
$tree = taxonomy_get_tree($vid);
foreach ($tree as $key => $term) {
$terms[$term->tid] = $term->name;
}
if(!empty($terms)){
foreach ($result['node'] as $nid => $value) {
$batch['operations'][] = array(
'_materio_showroom_batch_migration_op',
array(
$nid,
$src_field, $target_field,
$terms, $tid,
)
);
}
}
}
batch_set($batch);
}
function _materio_showroom_batch_migration_op($nid, $src_field, $target_field, $terms, $default_tid, &$context){
$context['results']['field_migrated']++;
$node = node_load($nid);
$src_items = field_get_items('node', $node, $src_field);
$src_value = $src_items ? $src_items[0]['value'] : '';
// $src_value = str_replace('/', '-', $src_value);
//
// build new item list
$items = array(LANGUAGE_NONE => array());
foreach ($terms as $tid => $name) {
$items[LANGUAGE_NONE][] = array(
'showroom_tid' => $tid,
'location' => $default_tid == $tid ? $src_value : '',
);
}
$node->$target_field = $items;
node_save($node);
//Simply show the import row count.
$context['message'] = t('Migrating node !c : %title (%nid)', array(
'!c' => $context['results']['field_migrated'],
'%title'=>$node->title,
'%nid'=>$nid ));
// In order to slow importing and debug better,
// we can uncomment this line to make each import slightly slower.
// usleep(2500);
if ( false ) {
$context['results']['failed_nodes'][] = $nid ;
}
_materio_showroom_update_http_requests();
}
function _materio_showroom_batch_migration_finished($success, $results, $operations){
// dsm($success, 'success');
// dsm($results, 'results');
// dsm($operations, 'operations');
if ($success) {
// Here we could do something meaningful with the results.
// We just display the number of nodes we processed...
drupal_set_message(t('@count results processed in @requests HTTP requests.', array('@count' => count($results), '@requests' => _materio_showroom_get_http_requests())));
drupal_set_message(t('The final result was "%final"', array('%final' => end($results))));
}
else {
// An error occurred.
// $operations contains the operations that remained unprocessed.
drupal_set_message(
t('operations : @args',
array(
'@args' => print_r(current($operations), TRUE),
)
),
'error'
);
$error_operation = reset($operations);
drupal_set_message(
t('An error occurred while processing @operation with arguments : @args',
array(
'@operation' => $error_operation[0],
'@args' => print_r($error_operation[0], TRUE),
)
),
'error'
);
}
}
/**
* Utility function to increment HTTP requests in a session variable.
*/
function _materio_showroom_update_http_requests() {
$_SESSION['http_request_count']++;
}
/**
* Utility function to count the HTTP requests in a session variable.
*
* @return int
* Number of requests.
*/
function _materio_showroom_get_http_requests() {
return !empty($_SESSION['http_request_count']) ? $_SESSION['http_request_count'] : 0;
}