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; | |
} | |
} |