Druplicon

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

Continuando con Migrate, hoy toca importar XML’s de forma local y remota. Para la forma remota he colocado un XML de ejemplo con un solo item que pueden usar para probar que todo funcione.

Ok sin más dilación esta es la clase para importar de forma remota:

<?php
class WPMigrationFromXML extends XMLMigration {
  public function __construct($arguments) {
    parent::__construct($arguments);
    $items_url = 'http://ecapy.com/wp-content/uploads/2013/06/wordpress.xml_.txt';
    $item_xpath = '/rss/channel/item';
    $item_ID_xpath = 'wp:post_id';
    $this->source = new MigrateSourceXML($items_url, $item_xpath, $item_ID_xpath);
    $this->destination = new MigrateDestinationNode('page');
    $this->map = new MigrateSQLMap($this->machineName,
      array(
        'wp:post_id' => array(
          'type' => 'int',
          'unsigned' => TRUE,
          'not null' => TRUE,
        )
      ),
      MigrateDestinationNode::getKeySchema()
    );
    $this->addFieldMapping('uid')->defaultValue(1);
    $this->addFieldMapping('created', 'wp:post_date')->xpath('wp:post_date');
    $this->addFieldMapping('title', 'title')->xpath('title');
    $this->addFieldMapping('body', 'content:encoded')->xpath('content:encoded');
  }
}

La primer diferencia y que es única para la importación de XML es que no extiende de la clase Migration como vimos en la importación desde DB’s, sino que lo hace de XMLMigration() ya que los XML son un poco especiales a la hora de tratarlos.

Otra cosa que cambia obviamente es el source, que esta vez es MigrateSourceXML() y que requiere 3 cosas como mínimo: la ubicación del archivo ya sea local o remota la ruta, el path que representa un item y por ultimo el identificador único del item. Si revisan el xml que adjunté van a poder verle mas sentido.

Y la última cosa que es única de los XML, es el mapeo de los fields. Pueden ver que MigrateSourceXML() añade un método ->xpath() para que le digamos de donde sacar la información.

Y para la importación local solo hay que cambiar $items_url por algo como:

<? $items_url = DRUPAL_ROOT . '/' . drupal_get_path('module', 'mimodulo') . '/sources/wordpress.xml';

Chau!

Comentarios

  1. Pingback: Drupal: Importar y sincronizar desde un CSV con Migrate | Capy

  2. Pingback: Combo: Importar y sincronizar productos con Migrate + Drupal commerce + product display desde CSV/XML/JSON | Capy

  3. Alberto

    Hola Marcelo,
    Eh leido vuestros post con respecto a migrate, tengo que hacer algo similar pero no se si migrate es el camino correcto pues entre otras alternativas que me an sugerido esta commerce_feeds.
    el asunto es que deseo integrar los productos (nombre, descripción, precio, foto, cantidad….) de un sistema contable que esta en un servidor en local hacia una implementación de Drupal Commerce. El sistema contable hace uso de una base de datos en Firebird y tengo la consulta para extraer los datos.

    Lo ideal seria poder programar una tarea en el cliente y se conecte al servidor enviando la información nueva o que a cambiado.
    en vuestra experiencia como lo arias
    saludos

    Responder

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>