Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      85.71%  | 
      6 / 7  | 
      CRAP |         | 
      98.21%  | 
      55 / 56  | 
     
| Node |         | 
      0.00%  | 
      0 / 1  | 
              | 
      87.50%  | 
      7 / 8  | 
      27 |         | 
      98.21%  | 
      55 / 56  | 
     
| query |         | 
      100.00%  | 
      1 / 1  | 
      2 |         | 
      100.00%  | 
      11 / 11  | 
     |||
| initializeIterator |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      2 / 2  | 
     |||
| fields |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      0 / 0  | 
     |||
| prepareRow |         | 
      0.00%  | 
      0 / 1  | 
      5.12 |         | 
      83.33%  | 
      5 / 6  | 
     |||
| getFieldValues |         | 
      100.00%  | 
      1 / 1  | 
      2 |         | 
      100.00%  | 
      4 / 4  | 
     |||
| getFieldInfo |         | 
      100.00%  | 
      1 / 1  | 
      9 |         | 
      100.00%  | 
      14 / 14  | 
     |||
| getCckData |         | 
      100.00%  | 
      1 / 1  | 
      6 |         | 
      100.00%  | 
      16 / 16  | 
     |||
| getIds |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      3 / 3  | 
     |||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\node\Plugin\migrate\source\d6\Node. | |
| */ | |
| namespace Drupal\node\Plugin\migrate\source\d6; | |
| use Drupal\migrate\Row; | |
| use Drupal\migrate_drupal\Plugin\migrate\source\DrupalSqlBase; | |
| /** | |
| * Drupal 6 node source from database. | |
| * | |
| * @MigrateSource( | |
| * id = "d6_node" | |
| * ) | |
| */ | |
| class Node extends DrupalSqlBase { | |
| /** | |
| * The join options between the node and the node_revisions table. | |
| */ | |
| const JOIN = 'n.vid = nr.vid'; | |
| /** | |
| * The default filter format. | |
| * | |
| * @var string | |
| */ | |
| protected $filterDefaultFormat; | |
| /** | |
| * Cached field and field instance definitions. | |
| * | |
| * @var array | |
| */ | |
| protected $fieldInfo; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function query() { | |
| // Select node in its last revision. | |
| $query = $this->select('node_revisions', 'nr') | |
| ->fields('n', array( | |
| 'nid', | |
| 'type', | |
| 'language', | |
| 'status', | |
| 'created', | |
| 'changed', | |
| 'comment', | |
| 'promote', | |
| 'moderate', | |
| 'sticky', | |
| 'tnid', | |
| 'translate', | |
| )) | |
| ->fields('nr', array( | |
| 'vid', | |
| 'title', | |
| 'body', | |
| 'teaser', | |
| 'log', | |
| 'timestamp', | |
| 'format', | |
| )); | |
| $query->addField('n', 'uid', 'node_uid'); | |
| $query->addField('nr', 'uid', 'revision_uid'); | |
| $query->innerJoin('node', 'n', static::JOIN); | |
| if (isset($this->configuration['node_type'])) { | |
| $query->condition('type', $this->configuration['node_type']); | |
| } | |
| return $query; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected function initializeIterator() { | |
| $this->filterDefaultFormat = $this->variableGet('filter_default_format', '1'); | |
| return parent::initializeIterator(); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function fields() { | |
| $fields = array( | |
| 'nid' => $this->t('Node ID'), | |
| 'type' => $this->t('Type'), | |
| 'title' => $this->t('Title'), | |
| 'body' => $this->t('Body'), | |
| 'format' => $this->t('Format'), | |
| 'teaser' => $this->t('Teaser'), | |
| 'node_uid' => $this->t('Node authored by (uid)'), | |
| 'revision_uid' => $this->t('Revision authored by (uid)'), | |
| 'created' => $this->t('Created timestamp'), | |
| 'changed' => $this->t('Modified timestamp'), | |
| 'status' => $this->t('Published'), | |
| 'promote' => $this->t('Promoted to front page'), | |
| 'sticky' => $this->t('Sticky at top of lists'), | |
| 'revision' => $this->t('Create new revision'), | |
| 'language' => $this->t('Language (fr, en, ...)'), | |
| 'tnid' => $this->t('The translation set id for this node'), | |
| 'timestamp' => $this->t('The timestamp the latest revision of this node was created.'), | |
| ); | |
| return $fields; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function prepareRow(Row $row) { | |
| // format = 0 can happen when the body field is hidden. Set the format to 1 | |
| // to avoid migration map issues (since the body field isn't used anyway). | |
| if ($row->getSourceProperty('format') === '0') { | |
| $row->setSourceProperty('format', $this->filterDefaultFormat); | |
| } | |
| if ($this->moduleExists('content') && $this->getModuleSchemaVersion('content') >= 6001) { | |
| foreach ($this->getFieldValues($row) as $field => $values) { | |
| $row->setSourceProperty($field, $values); | |
| } | |
| } | |
| return parent::prepareRow($row); | |
| } | |
| /** | |
| * Gets CCK field values for a node. | |
| * | |
| * @param \Drupal\migrate\Row $node | |
| * The node. | |
| * | |
| * @return array | |
| * CCK field values, keyed by field name. | |
| */ | |
| protected function getFieldValues(Row $node) { | |
| $values = []; | |
| foreach ($this->getFieldInfo($node->getSourceProperty('type')) as $field => $info) { | |
| $values[$field] = $this->getCckData($info, $node); | |
| } | |
| return $values; | |
| } | |
| /** | |
| * Gets CCK field and instance definitions from the database. | |
| * | |
| * @param string $node_type | |
| * The node type for which to get field info. | |
| * | |
| * @return array | |
| * Field and instance information for the node type, keyed by field name. | |
| */ | |
| protected function getFieldInfo($node_type) { | |
| if (!isset($this->fieldInfo)) { | |
| $this->fieldInfo = []; | |
| // Query the database directly for all CCK field info. | |
| $query = $this->select('content_node_field_instance', 'cnfi'); | |
| $query->join('content_node_field', 'cnf', 'cnf.field_name = cnfi.field_name'); | |
| $query->fields('cnfi'); | |
| $query->fields('cnf'); | |
| foreach ($query->execute() as $field) { | |
| $this->fieldInfo[ $field['type_name'] ][ $field['field_name'] ] = $field; | |
| } | |
| foreach ($this->fieldInfo as $type => $fields) { | |
| foreach ($fields as $field => $info) { | |
| foreach ($info as $property => $value) { | |
| if ($property == 'db_columns' || preg_match('/_settings$/', $property)) { | |
| $this->fieldInfo[$type][$field][$property] = unserialize($value); | |
| } | |
| } | |
| } | |
| } | |
| } | |
| return isset($this->fieldInfo[$node_type]) ? $this->fieldInfo[$node_type] : []; | |
| } | |
| /** | |
| * Retrieves raw CCK field data for a node. | |
| * | |
| * @param array $field | |
| * A field and instance definition from getFieldInfo(). | |
| * @param \Drupal\migrate\Row $node | |
| * The node. | |
| * | |
| * @return array | |
| * The field values, keyed by delta. | |
| */ | |
| protected function getCckData(array $field, Row $node) { | |
| $field_table = 'content_' . $field['field_name']; | |
| $node_table = 'content_type_' . $node->getSourceProperty('type'); | |
| /** @var \Drupal\Core\Database\Schema $db */ | |
| $db = $this->getDatabase()->schema(); | |
| if ($db->tableExists($field_table)) { | |
| $query = $this->select($field_table, 't'); | |
| // If the delta column does not exist, add it as an expression to | |
| // normalize the query results. | |
| if ($db->fieldExists($field_table, 'delta')) { | |
| $query->addField('t', 'delta'); | |
| } | |
| else { | |
| $query->addExpression(0, 'delta'); | |
| } | |
| } | |
| elseif ($db->tableExists($node_table)) { | |
| $query = $this->select($node_table, 't'); | |
| // Every row should have a delta of 0. | |
| $query->addExpression(0, 'delta'); | |
| } | |
| if (isset($query)) { | |
| $columns = array_keys($field['db_columns']); | |
| // Add every column in the field's schema. | |
| foreach ($columns as $column) { | |
| $query->addField('t', $field['field_name'] . '_' . $column, $column); | |
| } | |
| return $query | |
| // This call to isNotNull() is a kludge which relies on the convention | |
| // that CCK field schemas usually define their most important | |
| // column first. A better way would be to allow cckfield plugins to | |
| // alter the query directly before it's run, but this will do for | |
| // the time being. | |
| ->isNotNull($field['field_name'] . '_' . $columns[0]) | |
| ->condition('nid', $node->getSourceProperty('nid')) | |
| ->condition('vid', $node->getSourceProperty('vid')) | |
| ->execute() | |
| ->fetchAllAssoc('delta'); | |
| } | |
| else { | |
| return []; | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getIds() { | |
| $ids['nid']['type'] = 'integer'; | |
| $ids['nid']['alias'] = 'n'; | |
| return $ids; | |
| } | |
| } |