Provide CSV export actions for asset and log entities via new farm_export_csv module.
This commit is contained in:
parent
07882e177a
commit
60d2357fbc
|
@ -0,0 +1,11 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- asset
|
||||
- farm_export_csv
|
||||
id: asset_csv_action
|
||||
label: 'Export CSV'
|
||||
type: asset
|
||||
plugin: entity:csv_action:asset
|
||||
configuration: { }
|
|
@ -0,0 +1,11 @@
|
|||
langcode: en
|
||||
status: true
|
||||
dependencies:
|
||||
module:
|
||||
- farm_export_csv
|
||||
- log
|
||||
id: log_csv_action
|
||||
label: 'Export CSV'
|
||||
type: log
|
||||
plugin: entity:csv_action:log
|
||||
configuration: { }
|
|
@ -0,0 +1,8 @@
|
|||
name: farmOS Export CSV
|
||||
description: Provides a CSV export action for farmOS.
|
||||
type: module
|
||||
package: farmOS
|
||||
core_version_requirement: ^10
|
||||
dependencies:
|
||||
- farm:farm_export
|
||||
- farm:farm_csv
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\farm_export_csv\Plugin\Action\Derivative;
|
||||
|
||||
use Drupal\Core\Action\Plugin\Action\Derivative\EntityActionDeriverBase;
|
||||
use Drupal\Core\Entity\EntityTypeInterface;
|
||||
|
||||
/**
|
||||
* Provides an action deriver for the CSV action.
|
||||
*
|
||||
* @see \Drupal\farm_export_csv\Plugin\Action\EntityCsv
|
||||
*/
|
||||
class EntityCsvDeriver extends EntityActionDeriverBase {
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getDerivativeDefinitions($base_plugin_definition) {
|
||||
if (empty($this->derivatives)) {
|
||||
$definitions = [];
|
||||
foreach ($this->getApplicableEntityTypes() as $entity_type_id => $entity_type) {
|
||||
$definition = $base_plugin_definition;
|
||||
$definition['type'] = $entity_type_id;
|
||||
$definition['label'] = $this->t('Export @entity_type CSV', ['@entity_type' => $entity_type->getSingularLabel()]);
|
||||
$definitions[$entity_type_id] = $definition;
|
||||
}
|
||||
$this->derivatives = $definitions;
|
||||
}
|
||||
|
||||
return parent::getDerivativeDefinitions($base_plugin_definition);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function isApplicable(EntityTypeInterface $entity_type) {
|
||||
return in_array($entity_type->id(), ['log', 'asset']);
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,160 @@
|
|||
<?php
|
||||
|
||||
namespace Drupal\farm_export_csv\Plugin\Action;
|
||||
|
||||
use Drupal\Core\Action\Plugin\Action\EntityActionBase;
|
||||
use Drupal\Core\Config\ConfigFactoryInterface;
|
||||
use Drupal\Core\Entity\EntityTypeManagerInterface;
|
||||
use Drupal\Core\File\FileSystemInterface;
|
||||
use Drupal\Core\File\FileUrlGeneratorInterface;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
use Drupal\file\FileRepositoryInterface;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Component\Serializer\SerializerInterface;
|
||||
|
||||
/**
|
||||
* Action that exports a CSV file of entities.
|
||||
*
|
||||
* @Action(
|
||||
* id = "entity:csv_action",
|
||||
* action_label = @Translation("Export entity as CSV"),
|
||||
* deriver = "Drupal\farm_export_csv\Plugin\Action\Derivative\EntityCsvDeriver",
|
||||
* )
|
||||
*/
|
||||
class EntityCsv extends EntityActionBase {
|
||||
|
||||
/**
|
||||
* The serializer service.
|
||||
*
|
||||
* @var \Symfony\Component\Serializer\SerializerInterface
|
||||
*/
|
||||
protected $serializer;
|
||||
|
||||
/**
|
||||
* The file system service.
|
||||
*
|
||||
* @var \Drupal\Core\File\FileSystemInterface
|
||||
*/
|
||||
protected $fileSystem;
|
||||
|
||||
/**
|
||||
* The default file scheme.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $defaultFileScheme;
|
||||
|
||||
/**
|
||||
* The file repository service.
|
||||
*
|
||||
* @var \Drupal\file\FileRepositoryInterface
|
||||
*/
|
||||
protected $fileRepository;
|
||||
|
||||
/**
|
||||
* The file URL generator.
|
||||
*
|
||||
* @var \Drupal\Core\File\FileUrlGeneratorInterface
|
||||
*/
|
||||
protected $fileUrlGenerator;
|
||||
|
||||
/**
|
||||
* Constructs a new EntityCsv object.
|
||||
*
|
||||
* @param array $configuration
|
||||
* A configuration array containing information about the plugin instance.
|
||||
* @param string $plugin_id
|
||||
* The plugin ID for the plugin instance.
|
||||
* @param mixed $plugin_definition
|
||||
* The plugin implementation definition.
|
||||
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
|
||||
* The entity type manager service.
|
||||
* @param \Symfony\Component\Serializer\SerializerInterface $serializer
|
||||
* The serializer service.
|
||||
* @param \Drupal\Core\File\FileSystemInterface $file_system
|
||||
* The file system service.
|
||||
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
|
||||
* The config factory service.
|
||||
* @param \Drupal\file\FileRepositoryInterface $file_repository
|
||||
* The file repository service.
|
||||
* @param \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator
|
||||
* The file URL generator.
|
||||
*/
|
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, SerializerInterface $serializer, FileSystemInterface $file_system, ConfigFactoryInterface $config_factory, FileRepositoryInterface $file_repository, FileUrlGeneratorInterface $file_url_generator) {
|
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager);
|
||||
$this->serializer = $serializer;
|
||||
$this->fileSystem = $file_system;
|
||||
$this->defaultFileScheme = $config_factory->get('system.file')->get('default_scheme') ?? 'public';
|
||||
$this->fileRepository = $file_repository;
|
||||
$this->fileUrlGenerator = $file_url_generator;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
|
||||
return new static(
|
||||
$configuration,
|
||||
$plugin_id,
|
||||
$plugin_definition,
|
||||
$container->get('entity_type.manager'),
|
||||
$container->get('serializer'),
|
||||
$container->get('file_system'),
|
||||
$container->get('config.factory'),
|
||||
$container->get('file.repository'),
|
||||
$container->get('file_url_generator'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function executeMultiple(array $entities) {
|
||||
|
||||
// Serialize the entities.
|
||||
$output = $this->serializer->serialize($entities, 'csv');
|
||||
|
||||
// Prepare the file directory.
|
||||
$directory = $this->defaultFileScheme . '://csv';
|
||||
$this->fileSystem->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY);
|
||||
|
||||
// Create the file.
|
||||
$filename = 'csv_export-' . date('c') . '.csv';
|
||||
$destination = "$directory/$filename";
|
||||
try {
|
||||
$file = $this->fileRepository->writeData($output, $destination);
|
||||
}
|
||||
|
||||
// If file creation failed, bail with a warning.
|
||||
catch (\Exception $e) {
|
||||
$this->messenger()->addWarning($this->t('Could not create file.'));
|
||||
return;
|
||||
}
|
||||
|
||||
// Make the file temporary.
|
||||
$file->status = 0;
|
||||
$file->save();
|
||||
|
||||
// Show a link to the file.
|
||||
$url = $this->fileUrlGenerator->generateAbsoluteString($file->getFileUri());
|
||||
$this->messenger()->addMessage($this->t('CSV file created: <a href=":url">%filename</a>', [
|
||||
':url' => $url,
|
||||
'%filename' => $file->label(),
|
||||
]));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function execute($object = NULL) {
|
||||
$this->executeMultiple([$object]);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) {
|
||||
return $object->access('view', $account, $return_as_object);
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue