View source
<?php
namespace Drupal\social_user_export\Plugin\Action;
use Drupal\Core\Messenger\MessengerTrait;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\views_bulk_operations\Action\ViewsBulkOperationsActionBase;
use Drupal\Core\Session\AccountInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Plugin\PluginFormInterface;
use Drupal\Core\Form\FormStateInterface;
use Psr\Log\LoggerInterface;
use Drupal\Core\Url;
use Drupal\csv_serialization\Encoder\CsvEncoder;
use League\Csv\Writer;
use Drupal\Core\Link;
use Drupal\social_user_export\Plugin\UserExportPluginManager;
class ExportUser extends ViewsBulkOperationsActionBase implements ContainerFactoryPluginInterface, PluginFormInterface {
use MessengerTrait;
protected $userExportPlugin;
protected $pluginDefinitions;
protected $logger;
public function __construct(array $configuration, $plugin_id, $plugin_definition, UserExportPluginManager $userExportPlugin, LoggerInterface $logger) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->userExportPlugin = $userExportPlugin;
$this->pluginDefinitions = $this->userExportPlugin
->getDefinitions();
$this->logger = $logger;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('plugin.manager.user_export_plugin'), $container
->get('logger.factory')
->get('action'));
}
public function executeMultiple(array $entities) {
if (empty($this->context['sandbox']['results']['headers'])) {
$headers = [];
foreach ($this->pluginDefinitions as $plugin_id => $plugin_definition) {
$instance = $this->userExportPlugin
->createInstance($plugin_id);
$headers[] = $instance
->getHeader();
}
$this->context['sandbox']['results']['headers'] = $headers;
}
if (empty($this->context['sandbox']['results']['file_path'])) {
$this->context['sandbox']['results']['file_path'] = $this
->getFileTemporaryPath();
$csv = Writer::createFromPath($this->context['sandbox']['results']['file_path'], 'w');
$csv
->setDelimiter(',');
$csv
->setEnclosure('"');
$csv
->setEscape('\\');
$csv
->insertOne($this->context['sandbox']['results']['headers']);
}
else {
$csv = Writer::createFromPath($this->context['sandbox']['results']['file_path'], 'a');
}
$csv
->addFormatter([
new CsvEncoder(),
'formatRow',
]);
foreach ($entities as $entity_id => $entity) {
$row = [];
foreach ($this->pluginDefinitions as $plugin_id => $plugin_definition) {
$configuration = $this
->getPluginConfiguration($plugin_id, $entity_id);
$instance = $this->userExportPlugin
->createInstance($plugin_id, $configuration);
$row[] = $instance
->getValue($entity);
}
$csv
->insertOne($row);
}
if ($this->context['sandbox']['current_batch'] * $this->context['sandbox']['batch_size'] >= $this->context['sandbox']['total']) {
$data = @file_get_contents($this->context['sandbox']['results']['file_path']);
$name = basename($this->context['sandbox']['results']['file_path']);
$path = 'private://csv';
if (file_prepare_directory($path, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS) && file_save_data($data, $path . '/' . $name)) {
$url = Url::fromUri(file_create_url($path . '/' . $name));
$link = Link::fromTextAndUrl($this
->t('Download file'), $url);
$this
->messenger()
->addMessage($this
->t('Export is complete. @link', [
'@link' => $link
->toString(),
]));
}
else {
$this
->messenger()
->addMessage($this
->t('Could not save the export file.'), 'error');
$this->logger
->error('Could not save the export file on: %name.', [
'%name' => $name,
]);
}
}
}
public function execute($object = NULL) {
$this
->executeMultiple([
$object,
]);
}
public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
return $object
->access('view', $account, $return_as_object);
}
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
return $form;
}
public function getFileTemporaryPath() {
$hash = md5(microtime(TRUE));
$filename = 'export-users-' . substr($hash, 20, 12) . '.csv';
return file_directory_temp() . '/' . $filename;
}
public function getPluginConfiguration($plugin_id, $entity_id) {
return [];
}
}