drupal-header

Drupal: Importar y sincronizar desde un JSON local o remoto con Migrate

Con archivos JSON tenemos dos posibles casos:

  1. Un JSON simple
  2. Y proporcionando dos archivos: uno que provea los ID y otro archivo que contenga la información de un item específico. Esta última opcion es especialmente util para atacar API’s que por ejemplo en /posts entrega un listado de ID’s y en /posts/:id proporciona un item especifico.

Primera forma: un JSON simple

Digamos que nuestro archivo json tiene esta pinta:

 

Como se ve no es mas que un array de objetos. De hecho hacer un migrator que lo procese no difiere mucho de lo que hicimos con los XML, CSV y DB’s:

Lo único que cambia en este migrator es obviamente el $this->source (MigrateSourceJSON). El resto se mantiene como en las anteriores implementaciones.

Segunda forma: API style

Para este ejemplo he colgado las siguientes URL:

Obtener el listado de post a importar:
http://ecapy.com/Archivos/API-style/ids.json

Posts individuales:

Mientras este blog exista ahí las voy a dejar para que hagamos pruebas de este tipo de llamadas cuando haga falta.

Bien, entonces tenemos este caso en el que en una URL recibimos todos los ID de los post que queremos importar, y luego tenemos que ir llamando uno a uno los archivos JSON con el contenido de estos.

La gran diferencia con respecto a todos los migrators que hemos creado hasta ahora está en $this>source:

Estamos usando MigrateSourceList() que está justamente indicada para este tipo de casos. Como parametros estan bastante claros asi que no los explico.
Lo unico que si que quiero que presten atención es en $item_url. En este string hay un token (:id) y es porque el migrador a medida que vaya iterando los id que haya encontrado, va a generar la url desde la que se supone que tiene que obtener el contenido, y va a aplicar el ID sobre esa URL base que le hemos dado usando el token :id como placeholder.

La importación de JSON tiene mucho juego. Pueden ver como hacer cosas mas locas en https://drupal.org/node/1152160.

Chau!