Json Migrate-How to…

Posted by Juan Santovenia on 8 de Febrero de 2016
Development
Migration & Upgrades
Strategy & Architecture
Support

Para poder realizar de manera correcta una migracion a traves de JSON debemos realizar cambios en la configuracion de este dependiendo de los datos que se desean migrar. Primeramente debemos efectuar cambios sobre los campos:

  1. Id
  2. Source

El Id como contenedor de las referencias o valores y Source como la fuente de los valores que queremos recolectar. Se debe tener cuidado con respecto al plugin de la migracion debido a que una configuracion incorrecta del plugin puede llevar a diversos errores al momento de instalar la migracion en el sitio. Esto se evita delimitando los valores de los terminos de referencia y/o de los contenidos de la migracion. Si los datos que se van a recolectar son un $array se debe establecer en la configuracion de manera especifica los datos que se desean que figuren en la migracion. Puede que existan duplicados de los valores que se recolectan, pero no debe significar un gran problema para Drupal debido a que parte de su configuracion identifica los valores duplicados y los establece como una sola referencia. Para esto debemos catalogar cada uno de estos valores como una fila de igual valor a la del nivel del que se estan extrayendo. Una vez realizadas estas configuraciones deberia de poder realizarse con éxito una migracion de datos a traves de JSON.

class GmapJSONReader extends JSONReader {
  public function getSourceFields($url) {
    $items = parent::getSourceFields($url);
    // Loop over the JSON values, walk the tree and extract as keyed values.
    foreach ($items as &$item) {
      if (isset($item['address_components']) && is_array($item['address_components'])) {
        foreach ($item['address_components'] as $component) {
          if (isset($component['long_name']) && isset($component['types']) && is_array($component['types'])) {
            foreach ($component['types'] as $type) {
              $item[$type] = $component['long_name'];
            }
          }
        }
      }
      if (isset($item['geometry']['location']['lat'])) {
        $item['lat'] = $item['geometry']['location']['lat'];
      }
      if (isset($item['geometry']['location']['lng'])) {
        $item['lng'] = $item['geometry']['location']['lng'];
      }
    }

    return $items;
  }
}
class GmapTypeJSONReader extends JSONReader {
  public function getSourceFields($url) {
    $items = parent::getSourceFields($url);
    $return = [];
    // Loop over the JSON values and extract types
    // as individual rows.
    foreach ($items as &$item) {
      if (isset($item['types']) && is_array($item['types'])) {
        foreach ($item['types'] as $type)
        // We need to use place_id as the identifier for parsing JSON
        // in the parent class.
        // But we are really wanting to import an individual type
        // only once. So over-write the place_id with the type.
        $return[] = [
          'place_id' => $type,
          'type' => $type,
        ];

      }
    }

    return $return;
  }
}
id: gmap
migration_tags: JSON
label: gmap
source:
  plugin: json_source
  path: 'https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452'
  headers:
    Accept: application/json
  identifier: place_id
  identifierDepth: 1
  readerClass: Drupal\d8_json_migrate\Plugin\migrate\GmapJSONReader
  fields:
    - place_id
    - types
    - street_address
    - postal_code
    - country
    - locality
    - administrative_area_level_1
process:
  type:
    plugin: default_value
    default_value: gmaps
  title: country
  field_address_type:
    plugin: migration
    migration: gmap_type
    source: types
  field_city: locality
  field_country: country
  field_postal_code: postal_code
  field_state: administrative_area_level_1
  field_street_address: street_address
destination:
  plugin: 'entity:node'
template: null
migration_dependencies: {}
migration_group: JSON
id: gmap_type
migration_tags: JSON
label: 'gmap type'
source:
  plugin: json_source
  path: 'https://maps.googleapis.com/maps/api/geocode/json?latlng=40.714224,-73.961452'
  headers:
    Accept: application/json
  identifier: place_id
  identifierDepth: 1
  readerClass: Drupal\d8_json_migrate\Plugin\migrate\GmapTypeJSONReader
  fields:
    - type
process:
  name: type
  vid:
    plugin: default_value
    default_value: address_type
destination:
  plugin: 'entity:taxonomy_term'
template: null
migration_dependencies: {  }
migration_group: JSON

 

¿Está buscando ayuda para una migración o actualización de Drupal? Independientemente de la complejidad del sitio o de los datos, MTech puede ayudarle a pasar de un CMS privado o actualizarlo a la última versión: Drupal 8.

Escríbanos sobre su proyecto y nos pondremos en contacto con usted dentro de 48 horas.


Json Migrate-How to…