View source
<?php
namespace Drupal\disqus\Plugin\migrate\source;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\migrate\Plugin\migrate\source\SourcePluginBase;
use Drupal\migrate\Row;
use Drupal\migrate\Plugin\MigrationInterface;
use Psr\Log\LoggerInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class DisqusComment extends SourcePluginBase implements ContainerFactoryPluginInterface {
protected $iterator;
protected $logger;
protected $config;
protected $entityTypeManager;
public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, LoggerInterface $logger, ConfigFactoryInterface $config_factory, EntityTypeManagerInterface $entity_type_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $migration);
$this->logger = $logger;
$this->config = $config_factory
->get('disqus.settings');
$this->entityTypeManager = $entity_type_manager;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration = NULL) {
return new static($configuration, $plugin_id, $plugin_definition, $migration, $container
->get('logger.factory')
->get('disqus'), $container
->get('config.factory'), $container
->get('entity_type.manager'));
}
public function getIds() {
$ids['id']['type'] = 'integer';
return $ids;
}
public function fields() {
return [
'id' => $this
->t('Comment ID.'),
'pid' => $this
->t('Parent comment ID. If set to null, this comment is not a reply to an existing comment.'),
'identifier' => $this
->t("The disqus identifier to look up the corrent thread."),
'name' => $this
->t("The comment author's name."),
'user_id' => $this
->t('The disqus user-id of the author who commented.'),
'email' => $this
->t("The comment author's email address."),
'url' => $this
->t("The author's home page address."),
'ipAddress' => $this
->t("The author's IP address."),
'isAnonymous' => $this
->t('If true, this comments has been posted by an anonymous user.'),
'isApproved' => $this
->t('If the comment is approved or not.'),
'createdAt' => $this
->t('The time that the comment was created.'),
'comment' => $this
->t('The comment body.'),
'isEdited' => $this
->t('Boolean value indicating if the comment has been edited or not.'),
];
}
public function prepareRow(Row $row) {
$row
->setSourceProperty('uid', 0);
$email = $row
->getSourceProperty('email');
$user = $this->entityTypeManager
->getStorage('user')
->getQuery()
->condition('mail', $email)
->execute();
if ($user) {
$row
->setSourceProperty('uid', key($user));
}
return parent::prepareRow($row);
}
public function __toString() {
return 'Disqus comments';
}
public function initializeIterator() {
$items = [];
if ($disqus = disqus_api()) {
$items = [];
try {
$posts = $disqus->forums
->listPosts([
'forum' => $this->config
->get('disqus_domain'),
]);
} catch (\Exception $exception) {
$this
->messenger()
->addMessage($this
->t('There was an error loading the forum details. Please check you API keys and try again.'), MessengerInterface::TYPE_ERROR);
$this->logger
->error('Error loading the Disqus PHP API. Check your forum name.', []);
return new \ArrayIterator($items);
}
foreach ($posts as $post) {
$id = $post->id;
$items[$id]['id'] = $id;
$items[$id]['pid'] = $post->parent;
$thread = $disqus->threads
->details([
'thread' => $post->thread,
]);
$items[$id]['identifier'] = $thread->identifier;
$items[$id]['name'] = $post->author->name;
$items[$id]['email'] = $post->author->email;
$items[$id]['user_id'] = $post->author->id;
$items[$id]['url'] = $post->author->url;
$items[$id]['ipAddress'] = $post->ipAddress;
$items[$id]['isAnonymous'] = $post->author->isAnonymous;
$items[$id]['createdAt'] = $post->createdAt;
$items[$id]['comment'] = $post->message;
$items[$id]['isEdited'] = $post->isEdited;
}
}
return new \ArrayIterator($items);
}
}