123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- <?php
- namespace Drupal\migrate_example\Plugin\migrate\source;
- use Drupal\migrate\Plugin\migrate\source\SqlBase;
- use Drupal\migrate\Row;
- /**
- * Source plugin for beer content.
- *
- * @MigrateSource(
- * id = "beer_node"
- * )
- */
- class BeerNode extends SqlBase {
- /**
- * {@inheritdoc}
- */
- public function query() {
- /**
- * An important point to note is that your query *must* return a single row
- * for each item to be imported. Here we might be tempted to add a join to
- * migrate_example_beer_topic_node in our query, to pull in the
- * relationships to our categories. Doing this would cause the query to
- * return multiple rows for a given node, once per related value, thus
- * processing the same node multiple times, each time with only one of the
- * multiple values that should be imported. To avoid that, we simply query
- * the base node data here, and pull in the relationships in prepareRow()
- * below.
- */
- $query = $this->select('migrate_example_beer_node', 'b')
- ->fields('b', ['bid', 'name', 'body', 'excerpt', 'aid',
- 'countries', 'image', 'image_alt', 'image_title',
- 'image_description']);
- return $query;
- }
- /**
- * {@inheritdoc}
- */
- public function fields() {
- $fields = [
- 'bid' => $this->t('Beer ID'),
- 'name' => $this->t('Name of beer'),
- 'body' => $this->t('Full description of the beer'),
- 'excerpt' => $this->t('Abstract for this beer'),
- 'aid' => $this->t('Account ID of the author'),
- 'countries' => $this->t('Countries of origin. Multiple values, delimited by pipe'),
- 'image' => $this->t('Image path'),
- 'image_alt' => $this->t('Image ALT'),
- 'image_title' => $this->t('Image title'),
- 'image_description' => $this->t('Image description'),
- // Note that this field is not part of the query above - it is populated
- // by prepareRow() below. You should document all source properties that
- // are available for mapping after prepareRow() is called.
- 'terms' => $this->t('Applicable styles'),
- ];
- return $fields;
- }
- /**
- * {@inheritdoc}
- */
- public function getIds() {
- return [
- 'bid' => [
- 'type' => 'integer',
- 'alias' => 'b',
- ],
- ];
- }
- /**
- * {@inheritdoc}
- */
- public function prepareRow(Row $row) {
- /**
- * As explained above, we need to pull the style relationships into our
- * source row here, as an array of 'style' values (the unique ID for
- * the beer_term migration).
- */
- $terms = $this->select('migrate_example_beer_topic_node', 'bt')
- ->fields('bt', ['style'])
- ->condition('bid', $row->getSourceProperty('bid'))
- ->execute()
- ->fetchCol();
- $row->setSourceProperty('terms', $terms);
- // As we did for favorite beers in the user migration, we need to explode
- // the multi-value country names.
- if ($value = $row->getSourceProperty('countries')) {
- $row->setSourceProperty('countries', explode('|', $value));
- }
- return parent::prepareRow($row);
- }
- }
|