123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- <?php
- /**
- * @file
- * Support for comment destinations.
- */
- // TODO:
- // Make sure this works with updates, explicit destination keys
- /**
- * Destination class implementing migration into comments.
- */
- class MigrateDestinationComment extends MigrateDestinationEntity {
- static public function getKeySchema() {
- return array(
- 'cid' => array(
- 'type' => 'int',
- 'unsigned' => TRUE,
- 'description' => 'ID of destination entity',
- ),
- );
- }
- /**
- * Save the original setting of comment_maintain_node_statistics
- * @var boolean
- */
- protected $maintainNodeStatistics;
- /**
- * Return an options array for comment destinations.
- *
- * @param string $language
- * Default language for comments created via this destination class.
- * @param string $text_format
- * Default text format for comments created via this destination class.
- */
- static public function options($language, $text_format) {
- return compact('language', 'text_format');
- }
- /**
- * Basic initialization
- *
- * @param string $bundle
- * A.k.a. the content type (page, article, etc.) of the ... comment?.
- * @param array $options
- * Options applied to comments.
- */
- public function __construct($bundle, array $options = array()) {
- parent::__construct('comment', $bundle, $options);
- }
- /**
- * Returns a list of fields available to be mapped for comments attached to
- * a particular bundle (node type)
- *
- * @param Migration $migration
- * Optionally, the migration containing this destination.
- * @return array
- * Keys: machine names of the fields (to be passed to addFieldMapping)
- * Values: Human-friendly descriptions of the fields.
- */
- public function fields($migration = NULL) {
- $fields = array();
- // First the core (comment table) properties
- $fields['cid'] = t('Comment: <a href="@doc">Existing comment ID</a>',
- array('@doc' => 'http://drupal.org/node/1349714#cid'));
- $fields['nid'] = t('Comment: <a href="@doc">Node (by Drupal ID)</a>',
- array('@doc' => 'http://drupal.org/node/1349714#nid'));
- $fields['uid'] = t('Comment: <a href="@doc">User (by Drupal ID)</a>',
- array('@doc' => 'http://drupal.org/node/1349714#uid'));
- $fields['pid'] = t('Comment: <a href="@doc">Parent (by Drupal ID)</a>',
- array('@doc' => 'http://drupal.org/node/1349714#pid'));
- $fields['subject'] = t('Comment: <a href="@doc">Subject</a>',
- array('@doc' => 'http://drupal.org/node/1349714#subject'));
- $fields['created'] = t('Comment: <a href="@doc">Created timestamp</a>',
- array('@doc' => 'http://drupal.org/node/1349714#created'));
- $fields['changed'] = t('Comment: <a href="@doc">Modified timestamp</a>',
- array('@doc' => 'http://drupal.org/node/1349714#changed'));
- $fields['status'] = t('Comment: <a href="@doc">Status</a>',
- array('@doc' => 'http://drupal.org/node/1349714#status'));
- $fields['hostname'] = t('Comment: <a href="@doc">Hostname/IP address</a>',
- array('@doc' => 'http://drupal.org/node/1349714#hostname'));
- $fields['name'] = t('Comment: <a href="@doc">User name (not username)</a>',
- array('@doc' => 'http://drupal.org/node/1349714#name'));
- $fields['mail'] = t('Comment: <a href="@doc">Email address</a>',
- array('@doc' => 'http://drupal.org/node/1349714#mail'));
- $fields['homepage'] = t('Comment: <a href="@doc">Homepage</a>',
- array('@doc' => 'http://drupal.org/node/1349714#homepage'));
- $fields['language'] = t('Comment: <a href="@doc">Language</a>',
- array('@doc' => 'http://drupal.org/node/1349714#language'));
- $fields['thread'] = t('Comment: <a href="@doc">Thread</a>',
- array('@doc' => 'http://drupal.org/node/1349714#thread'));
- // Then add in anything provided by handlers
- $fields += migrate_handler_invoke_all('Entity', 'fields', $this->entityType, $this->bundle, $migration);
- $fields += migrate_handler_invoke_all('Comment', 'fields', $this->entityType, $this->bundle, $migration);
- return $fields;
- }
- /**
- * Delete a batch of comments at once.
- *
- * @param $cids
- * Array of comment IDs to be deleted.
- */
- public function bulkRollback(array $cids) {
- migrate_instrument_start('comment_delete_multiple');
- $this->prepareRollback($cids);
- $result = comment_delete_multiple($cids);
- $this->completeRollback($cids);
- migrate_instrument_stop('comment_delete_multiple');
- return $result;
- }
- /**
- * Import a single comment.
- *
- * @param $comment
- * Comment object to build. Prefilled with any fields mapped in the Migration.
- * @param $row
- * Raw source data object - passed through to prepare/complete handlers.
- * @return array
- * Array of key fields (cid only in this case) of the comment that was saved if
- * successful. FALSE on failure.
- */
- public function import(stdClass $comment, stdClass $row) {
- $migration = Migration::currentMigration();
- // Updating previously-migrated content?
- if (isset($row->migrate_map_destid1)) {
- if (isset($comment->cid)) {
- if ($comment->cid != $row->migrate_map_destid1) {
- throw new MigrateException(t("Incoming cid !cid and map destination nid !destid1 don't match",
- array('!cid' => $comment->cid, '!destid1' => $row->migrate_map_destid1)));
- }
- }
- else {
- $comment->cid = $row->migrate_map_destid1;
- }
- }
- // Fix up timestamps
- if (isset($comment->created)) {
- $comment->created = MigrationBase::timestamp($comment->created);
- }
- if (isset($comment->changed)) {
- $comment->changed = MigrationBase::timestamp($comment->changed);
- }
- if ($migration->getSystemOfRecord() == Migration::DESTINATION) {
- if (!isset($comment->cid)) {
- throw new MigrateException(t('System-of-record is DESTINATION, but no destination cid provided'));
- }
- $rawcomment = $comment;
- $old_comment = comment_load($comment->cid);
- if (empty($old_comment)) {
- throw new MigrateException(t('System-of-record is DESTINATION, but commend !cid does not exist',
- array('!cid' => $comment->cid)));
- }
- if (!isset($comment->nid)) {
- $comment->nid = $old_comment->nid;
- }
- if (!isset($comment->created)) {
- $comment->created = $old_comment->created;
- }
- if (!isset($comment->changed)) {
- $comment->changed = $old_comment->changed;
- }
- $this->prepare($comment, $row);
- foreach ($rawcomment as $field => $value) {
- $old_comment->$field = $comment->$field;
- }
- $comment = $old_comment;
- }
- else {
- // Set some default properties.
- $defaults = array(
- 'language' => $this->language,
- 'node_type' => $this->bundle,
- 'subject' => '',
- 'status' => COMMENT_PUBLISHED,
- 'uid' => 0,
- 'cid' => 0,
- 'pid' => 0,
- );
- foreach ($defaults as $field => $value) {
- if (!isset($comment->$field)) {
- $comment->$field = $value;
- }
- }
- $this->prepare($comment, $row);
- // Make sure we have a nid
- if (!isset($comment->nid) || !$comment->nid) {
- throw new MigrateException(t('No node ID provided for comment'));
- }
- // comment_save() hardcodes hostname, so if we're trying to set it we
- // need to save it and apply it after
- if (isset($comment->hostname)) {
- $hostname = $comment->hostname;
- }
- }
- if (isset($comment->cid) && $comment->cid) {
- $updating = TRUE;
- }
- else {
- $updating = FALSE;
- }
- migrate_instrument_start('comment_save');
- comment_save($comment);
- migrate_instrument_stop('comment_save');
- if (isset($hostname) && isset($comment->cid) && $comment->cid > 0) {
- db_update('comment')
- ->fields(array('hostname' => $hostname))
- ->condition('cid', $comment->cid)
- ->execute();
- }
- $this->complete($comment, $row);
- if (isset($comment->cid) && $comment->cid > 0) {
- $return = array($comment->cid);
- if ($updating) {
- $this->numUpdated++;
- }
- else {
- $this->numCreated++;
- }
- }
- else {
- $return = FALSE;
- }
- return $return;
- }
- public function preImport() {
- // If maintaining node statistics is enabled, temporarily disable it
- $this->maintainNodeStatistics =
- variable_get('comment_maintain_node_statistics', TRUE);
- if ($this->maintainNodeStatistics) {
- $GLOBALS['conf']['comment_maintain_node_statistics'] = FALSE;
- }
- }
- public function postImport() {
- // If originally enabled, re-enable and rebuild the stats
- if ($this->maintainNodeStatistics) {
- $GLOBALS['conf']['comment_maintain_node_statistics'] = TRUE;
- // Copied from devel_rebuild_node_comment_statistics
- // Empty table
- db_truncate('node_comment_statistics')->execute();
- // TODO: DBTNG. Ignore keyword is Mysql only? Is only used in the rare case when
- // two comments on the same node share same timestamp.
- $sql = "
- INSERT IGNORE INTO {node_comment_statistics} (nid, cid, last_comment_timestamp, last_comment_name, last_comment_uid, comment_count) (
- SELECT c.nid, c.cid, c.created, c.name, c.uid, c2.comment_count FROM {comment} c
- JOIN (
- SELECT c.nid, MAX(c.created) AS created, COUNT(*) AS comment_count FROM {comment} c WHERE status=:published GROUP BY c.nid
- ) AS c2 ON c.nid = c2.nid AND c.created=c2.created
- )";
- db_query($sql, array(':published' => COMMENT_PUBLISHED));
- // Insert records into the node_comment_statistics for nodes that are missing.
- $query = db_select('node', 'n');
- $query->leftJoin('node_comment_statistics', 'ncs', 'ncs.nid = n.nid');
- $query->addField('n', 'changed', 'last_comment_timestamp');
- $query->addField('n', 'uid', 'last_comment_uid');
- $query->addField('n', 'nid');
- $query->addExpression('0', 'comment_count');
- $query->addExpression('NULL', 'last_comment_name');
- $query->isNull('ncs.comment_count');
- db_insert('node_comment_statistics')
- ->from($query)
- ->execute();
- }
- }
- }
- class MigrateCommentNodeHandler extends MigrateDestinationHandler {
- public function __construct() {
- $this->registerTypes(array('node'));
- }
- public function fields($entity_type, $bundle) {
- $fields = array();
- $fields['comment'] = t('Whether comments may be posted to the node');
- return $fields;
- }
- }
|