View source
<?php
namespace Drupal\typed_data\Plugin\TypedDataFilter;
use Drupal\Core\Datetime\DateFormatterInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\Core\TypedData\DataDefinitionInterface;
use Drupal\Core\TypedData\Type\DateTimeInterface;
use Drupal\typed_data\Exception\InvalidArgumentException;
use Drupal\typed_data\DataFilterBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
class FormatDateFilter extends DataFilterBase implements ContainerFactoryPluginInterface {
protected $dateFormatter;
protected $dateFormatStorage;
public function __construct(array $configuration, $plugin_id, $plugin_definition, DateFormatterInterface $date_formatter, EntityStorageInterface $date_format_storage) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->dateFormatter = $date_formatter;
$this->dateFormatStorage = $date_format_storage;
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('date.formatter'), $container
->get('entity_type.manager')
->getStorage('date_format'));
}
public function filter(DataDefinitionInterface $definition, $value, array $arguments, BubbleableMetadata $bubbleable_metadata = NULL) {
if ($definition
->getDataType() != 'timestamp') {
$value = $this
->getTypedDataManager()
->create($definition, $value)
->getDateTime()
->getTimestamp();
}
$arguments += [
0 => 'medium',
1 => '',
2 => NULL,
3 => NULL,
];
if ($arguments[0] != 'custom' && $bubbleable_metadata) {
$config = $this->dateFormatStorage
->load($arguments[0]);
if (!$config) {
throw new InvalidArgumentException("Unknown date format {$arguments[0]} given.");
}
$bubbleable_metadata
->addCacheableDependency($config);
}
return $this->dateFormatter
->format($value, $arguments[0], $arguments[1], $arguments[2], $arguments[3]);
}
public function canFilter(DataDefinitionInterface $definition) {
return is_subclass_of($definition
->getClass(), DateTimeInterface::class);
}
public function filtersTo(DataDefinitionInterface $definition, array $arguments) {
return DataDefinition::create('string');
}
public function validateArguments(DataDefinitionInterface $definition, array $arguments) {
$fails = parent::validateArguments($definition, $arguments);
$arguments += [
0 => 'medium',
1 => '',
2 => NULL,
3 => NULL,
];
if ($arguments[0] != 'custom' && $this->dateFormatStorage
->load($arguments[0]) === NULL) {
$fails[] = $this
->t('Unkown date format %format given.', [
'%format' => $arguments[0],
]);
}
if ($arguments[0] != 'custom' && $arguments[1]) {
$fails[] = $this
->t("If a custom date format is supplied, 'custom' must be passed as date format.");
}
elseif ($arguments[0] == 'custom' && !$arguments[1]) {
$fails[] = $this
->t("If 'custom' is given as date type, a custom date formatting string must be provided; e.g., 'Y-m-d H:i:s'.");
}
return $fails;
}
}