Drupal Migrate: Establecer id automático en importaciones CSV

El módulo "Migrate" en el núcleo es una de mis partes favoritas de Drupal 8 y 9. Es súper flexible y hace que la migración de contenido desde cualquier fuente que puedas imaginar sea bastante sencilla. Hoy quiero mostrar un truco que uso cuando recibo un csv (o archivo de Excel) de clientes, donde quieren que todo el contenido migre a Drupal. Un ejemplo muy simple sería una lista de categorías.

Por lo general, el archivo vendrá con un término en cada línea. Sin embargo, el módulo migrate querría que establezcamos una ID para todos los términos, que actualmente ninguna de las filas tiene. Una solución a esto es colocar una ID en todas las filas manualmente con algún tipo de software de hoja de cálculo, y luego configurar nuestra migración a la nueva columna para detectar los IDs. Pero dado que ambos implican las palabras "manual" y "software de hoja de cálculo", inmediatamente me dan ganas de encontrar otra solución. ¿Hay alguna manera de que podamos establecer el id de la fila programáticamente en función del número de fila? ¡Por supuesto que sí!

Entonces, aquí hay un truco que utilizo para establecer el ID del número de línea:

La configuración de migración se ve así:

id: my_module_categories_csv
label: My module categories
migration_group: my_module
source:
  # We will use a custom source plugin, so we can set the 
  # ID from there.
  plugin: my_module_categories_csv
  track_changes: TRUE
  header_row_count: 1
  keys:
    - id
  delimiter: ';'
  # ... And the rest of the file 

Como se indica en el archivo yaml, utilizaremos un complemento fuente personalizado para esto. Digamos que tenemos un módulo personalizado llamado "my_module". Dentro de esa carpeta del módulo, creamos un archivo llamado Categories Csv.php dentro de la carpeta src/Plugin/migrate/source/CategoriesCsv.php . Y en ese archivo ponemos algo como esto:

<?php

namespace Drupal\my_module\Plugin\Migrate\source;

use Drupal\migrate\Plugin\MigrationInterface;
use Drupal\migrate\Row;
use Drupal\migrate_source_csv\Plugin\migrate\source\CSV;

/**
 * Source plugin for Categories in csv.
 *
 * @MigrateSource(
 *   id = "my_module_categories_csv"
 * )
 */
class CategoriesCsv extends CSV {

  /**
   * {@inheritdoc}
   */
  public function prepareRow(Row $row) {
    // Delta is here the row number.
    $delta = $this->file->key();
    $row->setSourceProperty('id', $delta);
    return parent::prepareRow($row);
  }

}

En el código anterior, establecemos la propiedad de origen de id en el delta (el número de fila). Lo que significa que puedes tener una fuente como esta:

Name
Category1
Category2
Category3

En lugar de esto

id;Name
1;Category1
2;Category2
3;Category3

La mejor parte de esto es que cuando tu cliente cambia de opinión, puedes actualizar el archivo en lugar de editarlo antes de actualizarlo. Y con la edición, me refiero a "manualmente" y con "software de hoja de cálculo".