'
',
'#markup' => migrate_overview(),
'#suffix' => '
',
);
$header = array(
array('data' => t('Status')),
array('data' => t('Migration')),
array('data' => t('Total rows')),
array('data' => t('Imported')),
array('data' => t('Unimported')),
array('data' => t('Messages')),
array('data' => t('Throughput')),
array('data' => t('Last imported')),
);
$migrations = migrate_migrations();
$rows = array();
foreach ($migrations as $migration) {
$row = array();
$has_counts = TRUE;
if (method_exists($migration, 'sourceCount')) {
$total = $migration->sourceCount();
}
else {
$has_counts = FALSE;
$total = t('N/A');
}
if (method_exists($migration, 'importedCount')) {
$imported = $migration->importedCount();
}
else {
$has_counts = FALSE;
$imported = t('N/A');
}
if ($has_counts) {
$unimported = $total - $imported;
}
else {
$unimported = t('N/A');
}
$status = $migration->getStatus();
switch ($status) {
case MigrationBase::STATUS_IDLE:
$status = t('Idle');
break;
case MigrationBase::STATUS_IMPORTING:
$status = t('Importing');
break;
case MigrationBase::STATUS_ROLLING_BACK:
$status = t('Rolling back');
break;
case MigrationBase::STATUS_STOPPING:
$status = t('Stopping');
break;
case MigrationBase::STATUS_DISABLED:
$status = t('Disabled');
break;
default:
$status = t('Unknown');
break;
}
$row['status'] = $status;
$machine_name = $migration->getMachineName();
$row['machinename'] =
l($machine_name, 'admin/content/migrate/' . $machine_name);
$row['importrows'] = $total;
$row['imported'] = $imported;
$row['unimported'] = $unimported;
if (is_subclass_of($migration, 'Migration')) {
$num_messages = $migration->messageCount();
$row['messages'] = $num_messages ? l($num_messages, 'admin/content/migrate/messages/' . $machine_name) : 0;
}
else {
$row['messages'] = t('N/A');
}
if (method_exists($migration, 'getLastThroughput')) {
$rate = $migration->getLastThroughput();
if ($rate == '') {
$row['lastthroughput'] = t('Unknown');
}
elseif ($status == MigrationBase::STATUS_IDLE) {
$row['lastthroughput'] = t('!rate/min', array('!rate' => $rate));
}
else {
if ($rate > 0) {
$row['lastthroughput'] = t('!rate/min, !time remaining', array('!rate' => $rate, '!time' => format_interval((60*$unimported) / $rate)));
}
else {
$row['lastthroughput'] = t('!rate/min, unknown time remaining', array('!rate' => $rate));
}
}
}
else {
$row['lastthroughput'] = t('N/A');
}
$row['lastimported'] = $migration->getLastImported();
$rows[] = $row;
}
$build['dashboard'] = array(
'#prefix' => '',
'#value' => theme_table($header, $rows),
'#suffix' => '
',
);
return $build;
}
/**
* Menu callback for messages page
*/
function migrate_ui_messages($migration) {
drupal_add_css(drupal_get_path('module', 'migrate_ui') . '/migrate_ui.css');
$build = $rows = array();
$header = array(t('Source ID'), t('Level'), t('Message'));
if (is_string($migration)) {
$migration = migration_load($migration);
}
// TODO: need a general MigrateMap API
$messages = db_select($migration->getMap()->getMessageTable(), 'msg')
->extend('PagerDefault')
->limit(500)
->fields('msg')
->execute();
foreach ($messages as $message) {
$class = $message->level <= MigrationBase::MESSAGE_WARNING ? 'migrate-error' : '';
$rows[] = array(
array('data' => $message->sourceid1, 'class' => $class), // TODO: deal with compound keys
array('data' => $migration->getMessageLevelName($message->level), 'class' => $class),
array('data' => $message->message, 'class' => $class),
);
unset($classes);
}
$build['messages'] = array(
'#prefix' => '',
'#value' => theme_table($header, $rows),
'#suffix' => '
',
);
$build['migrate_ui_pager'] = array('#theme' => 'pager');
return drupal_render($build);
}
/**
* Menu callback function for migration view page.
*/
function migrate_migration_info($form_state, $migration) {
drupal_add_css(drupal_get_path('module', 'migrate_ui') . '/migrate_ui.css');
if (is_string($migration)) {
$migration = migration_load($migration);
}
$has_mappings = method_exists($migration, 'getFieldMappings');
$form = array();
$form['detail'] = array(
'#type' => 'fieldset',
);
// Add vertical tabs display if available.
$form['detail']['#pre_render'][] = 'vertical_tabs_form_pre_render';
// Despite docs (http://drupal.org/handbook/modules/vertical-tabs), line below isn't working.
// $form['detail']['#attached']['js']['vertical-tabs'] = drupal_get_path('module', 'migrate_ui') . '/migrate_ui.js';
// Here is easy workarund.
drupal_add_js(drupal_get_path('module', 'migrate_ui') . '/migrate_ui.js');
if ($has_mappings) {
$field_mappings = $migration->getFieldMappings();
// Identify what destination and source fields are mapped
foreach ($field_mappings as $mapping) {
$source_field = $mapping->getSourceField();
$destination_field = $mapping->getDestinationField();
$sourceFields[$source_field] = $source_field;
$destinationFields[$destination_field] = $destination_field;
}
}
$form['detail']['overview'] = array(
'#type' => 'fieldset',
'#title' => t('Overview'),
'#group' => 'detail',
);
$team = array();
foreach ($migration->getTeam() as $member) {
$email_address = $member->getEmailAddress();
$team[$member->getGroup()][] =
$member->getName() . ' <' . l($email_address, 'mailto:' .$email_address) . '>';
}
foreach ($team as $group => $list) {
$form['detail']['overview'][$group] = array(
'#prefix' => '',
'#value' => theme_item_list($list, $group, 'ul', array('id' => 'team')),
'#suffix' => '
',
);
}
$dependencies = $migration->getHardDependencies();
if (count($dependencies) > 0) {
$form['detail']['overview']['dependencies'] = array(
'#prefix' => '',
'#value' => '' . t('Dependencies: ') . '' .
implode(', ', $dependencies),
'#suffix' => '
',
);
}
$soft_dependencies = $migration->getSoftDependencies();
if (count($soft_dependencies) > 0) {
$form['detail']['overview']['soft_dependencies'] = array(
'#prefix' => '',
'#value' => '' . t('Soft Dependencies: ') . '' .
implode(', ', $soft_dependencies),
'#suffix' => '
',
);
}
if ($has_mappings) {
switch ($migration->getSystemOfRecord()) {
case Migration::SOURCE:
$system_of_record = t('Source data');
break;
case Migration::DESTINATION:
$system_of_record = t('Destination data');
break;
default:
$system_of_record = t('Unknown');
break;
}
$form['detail']['overview']['system_of_record'] = array(
'#prefix' => '',
'#value' => '' . t('System of record: ') . '' . $system_of_record,
'#suffix' => '
',
);
}
$form['detail']['overview']['description'] = array(
'#prefix' => '',
'#value' => $migration->getDescription(),
'#suffix' => '
',
);
if ($has_mappings) {
// Destination field information
$form['detail']['destination'] = array(
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#title' => t('Destination'),
'#group' => 'detail',
'#description' =>
t('These are the fields available in the destination of this
migration. The machine names listed here are those available to be used
as the first parameter to $this->addFieldMapping() in your Migration
class constructor. Unmapped fields are red.
'),
);
$destination = $migration->getDestination();
$form['detail']['destination']['type'] = array(
'#type' => 'item',
'#title' => t('Type'),
'#value' => (string)$destination,
);
$destKey = $destination->getKeySchema();
$header = array(t('Machine name'), t('Description'));
$rows = array();
foreach ($destination->fields() as $machine_name => $description) {
$class = '';
if (isset($destKey[$machine_name])) {
// Identify primary key
$machine_name .= t(' (PK)');
}
else {
// Add class for mapped/unmapped. Used in summary.
if (!isset($destinationFields[$machine_name])) {
$class = 'migrate-error';
}
}
$rows[] = array(array('data' => $machine_name, 'class' => $class), array('data' => $description, 'class' => $class));
}
$form['detail']['destination']['fields'] = array(
'#prefix' => '',
'#value' => theme_table($header, $rows),
'#suffix' => '
',
);
// TODO: Get source_fields from arguments
$form['detail']['source'] = array(
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#title' => t('Source'),
'#group' => 'detail',
'#description' =>
t('These are the fields available from the source of this
migration. The machine names listed here are those available to be used
as the second parameter to $this->addFieldMapping() in your Migration
class constructor. Unmapped fields are red.
'),
);
$source = $migration->getSource();
$form['detail']['source']['query'] = array(
'#type' => 'item',
'#title' => t('Query'),
'#value' => '' . $source . '
',
);
$sourceKey = $migration->getMap()->getSourceKey();
$header = array(t('Machine name'), t('Description'));
$rows = array();
foreach ($source->fields() as $machine_name => $description) {
$class = '';
if (isset($sourceKey[$machine_name])) {
// Identify primary key
$machine_name .= t(' (PK)');
}
else {
// Add class for mapped/unmapped. Used in summary.
if (!isset($sourceFields[$machine_name])) {
$class = 'migrate-error';
}
}
$rows[] = array(array('data' => $machine_name, 'class' => $class), array('data' => $description, 'class' => $class));
}
$form['detail']['source']['fields'] = array(
'#prefix' => '',
'#value' => theme_table($header, $rows),
'#suffix' => '
',
);
$header = array(t('Destination'), t('Source'), t('Default'), t('Description'), t('Priority'));
// First group the mappings
$descriptions = array();
$source_fields = $source->fields();
$destination_fields = $destination->fields();
foreach ($field_mappings as $mapping) {
// Validate source and destination fields actually exist
$source_field = $mapping->getSourceField();
$destination_field = $mapping->getDestinationField();
if (!is_null($source_field) && !isset($source_fields[$source_field])) {
drupal_set_message(t('!source used as source field in mapping but not in
list of source fields', array('!source' => $source_field)),
'warning');
}
if (!is_null($destination_field) && !isset($destination_fields[$destination_field])) {
drupal_set_message(t('!destination used as destination field in mapping but not in
list of destination fields', array('!destination' => $destination_field)),
'warning');
}
$descriptions[$mapping->getIssueGroup()][] = $mapping;
}
// Put out each group header
$rows = array();
$count = 0;
foreach ($descriptions as $group => $mappings) {
$form['detail'][$group] = array(
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#title' => t('Mapping: ') . $group,
'#group' => 'detail',
'#attributes' => array('class' => 'migrate-mapping'),
);
$rows = array();
foreach ($mappings as $mapping) {
$default = $mapping->getDefaultValue();
if (is_array($default)) {
$default = implode(',', $default);
}
$issue_priority = $mapping->getIssuePriority();
if (!is_null($issue_priority)) {
$class = 'migrate-priority-' . $issue_priority;
$priority = MigrateFieldMapping::$priorities[$issue_priority];
$issue_pattern = $migration->getIssuePattern();
$issue_number = $mapping->getIssueNumber();
if (!is_null($issue_pattern) && !is_null($issue_number)) {
$priority .= ' (' . l('#' . $issue_number, str_replace(':id:', $issue_number,
$issue_pattern)) . ')';
}
if ($issue_priority != MigrateFieldMapping::ISSUE_PRIORITY_OK) {
$class .= ' migrate-error';
}
}
else {
$priority = t('OK');
$class .= ' migrate-priority-' . 1;
}
$row = array(
array('data' => $mapping->getDestinationField(), 'class' => $class),
array('data' => $mapping->getSourceField(), 'class' => $class),
array('data' => $default, 'class' => $class),
array('data' => $mapping->getDescription(), 'class' => $class),
array('data' => $priority, 'class' => $class),
);
$rows[] = $row;
$class = '';
}
$form['detail'][$group]['table'] = array(
'#prefix' => '',
'#value' => theme_table($header, $rows),
'#suffix' => '
',
);
}
}
return $form;
}