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