From 1ec80dc60ea601a3a517028172d14d679cd1aa46 Mon Sep 17 00:00:00 2001 From: Bachir Soussi Chiadmi Date: Sun, 27 Nov 2016 19:48:58 +0100 Subject: [PATCH] finished showroom migration batch function --- .../materiobasemod/materio_showroom.install | 2 +- .../materiobasemod/materio_showroom.module | 331 +++++++++++++++++- 2 files changed, 329 insertions(+), 4 deletions(-) diff --git a/sites/all/modules/gui/materiobasemod/materio_showroom.install b/sites/all/modules/gui/materiobasemod/materio_showroom.install index e37c238e..a87366ca 100644 --- a/sites/all/modules/gui/materiobasemod/materio_showroom.install +++ b/sites/all/modules/gui/materiobasemod/materio_showroom.install @@ -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'), diff --git a/sites/all/modules/gui/materiobasemod/materio_showroom.module b/sites/all/modules/gui/materiobasemod/materio_showroom.module index b65540cf..69809f68 100644 --- a/sites/all/modules/gui/materiobasemod/materio_showroom.module +++ b/sites/all/modules/gui/materiobasemod/materio_showroom.module @@ -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; +}