acquia_dam-1.0.0-rc1/src/Plugin/views/argument/AssetTypeArgument.php
src/Plugin/views/argument/AssetTypeArgument.php
<?php
declare(strict_types=1);
namespace Drupal\acquia_dam\Plugin\views\argument;
use Drupal\acquia_dam\Plugin\media\Source\Asset;
use Drupal\media\MediaTypeInterface;
use Drupal\views\Plugin\views\argument\ArgumentPluginBase;
use Drupal\views_remote_data\Plugin\views\query\RemoteDataQuery;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Views argument for the asset type from a media type in media library.
*
* @ViewsArgument("acquia_dam_asset_type")
*/
final class AssetTypeArgument extends ArgumentPluginBase {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
private $entityTypeManager;
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): self {
$instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
$instance->entityTypeManager = $container->get('entity_type.manager');
return $instance;
}
/**
* {@inheritdoc}
*/
public function query($group_by = FALSE): void {
assert($this->query instanceof RemoteDataQuery);
$media_type_storage = $this->entityTypeManager->getStorage('media_type');
$media_type = $media_type_storage->load($this->argument);
if ($media_type instanceof MediaTypeInterface) {
$source = $media_type->getSource();
$definition = $source->getPluginDefinition();
if ($source instanceof Asset) {
// Remap the argument value from the media type ID to file type value
// that is the derivative ID from the plugin.
$this->argument = $definition['asset_search_value'];
}
}
// Remap the property value based on the asset_search_key.
$this->query->addWhere(
'0',
$definition['asset_search_key'] ?? 'ft',
$this->argument,
'='
);
}
}
