Skip to content
Snippets Groups Projects
Commit 4a0305cb authored by Elber Rodrigues's avatar Elber Rodrigues Committed by Frédéric G. Marand
Browse files

Issue #3378704 by fgm,Wim Leers: Add config schema for formatter settings validation.

parent b692dee4
Branches 8.x-1.x
Tags 8.x-1.3
1 merge request!4Issue #3378704: Module is missing a config schema for validation
field.formatter.settings.image_delta_formatter:
type: mapping
label: 'Image Delta Formatter: image settings'
mapping:
deltas:
type: sequence
label: 'Deltas'
sequence:
type: integer
label: 'deltas'
constraints:
Range:
min: 0
deltas_reversed:
type: boolean
label: 'Reversed'
image_link:
type: string
label: 'Link image to'
image_style:
type: string
label: 'Image style'
image_loading:
type: mapping
label: 'Image loading settings'
mapping:
attribute:
type: string
label: 'Loading attribute'
field.formatter.settings.media_delta_formatter:
type: mapping
label: 'Image Delta Formatter: media settings'
mapping:
deltas:
type: sequence
label: 'Deltas'
sequence:
type: integer
label: 'deltas'
constraints:
Range:
min: 0
deltas_reversed:
type: boolean
label: 'Reversed'
image_style:
type: string
label: 'Image style'
image_link:
type: string
label: 'Image link'
image_loading:
type: mapping
label: 'Image loading'
mapping:
attribute:
type: string
label: 'Attribute: lazy or eager'
......@@ -4,6 +4,8 @@ declare(strict_types = 1);
namespace Drupal\image_delta_formatter\OptionalPlugin\Field\FieldFormatter;
use Drupal\Core\Field\Attribute\FieldFormatter;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\image_delta_formatter\Plugin\Field\FieldFormatter\ImageDeltaTrait;
use Drupal\responsive_image\Plugin\Field\FieldFormatter\ResponsiveImageFormatter;
......
......@@ -4,6 +4,8 @@ declare(strict_types = 1);
namespace Drupal\image_delta_formatter\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\Attribute\FieldFormatter;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\image\Plugin\Field\FieldFormatter\ImageFormatter;
/**
......@@ -18,6 +20,14 @@ use Drupal\image\Plugin\Field\FieldFormatter\ImageFormatter;
* }
* )
*/
#[FieldFormatter(
id: 'image_delta_formatter',
label: new TranslatableMarkup('Image delta'),
description: new TranslatableMarkup('Display specific deltas of an image field.'),
field_types: [
'image',
],
)]
class ImageDeltaFormatter extends ImageFormatter {
use ImageDeltaTrait;
......
......@@ -20,7 +20,7 @@ trait ImageDeltaTrait {
*/
public static function defaultSettings(): array {
return [
'deltas' => '0',
'deltas' => [],
'deltas_reversed' => FALSE,
] + parent::defaultSettings();
}
......@@ -39,20 +39,25 @@ trait ImageDeltaTrait {
public function settingsForm(array $form, FormStateInterface $form_state): array {
$element = parent::settingsForm($form, $form_state);
$deltas = $this->getSetting('deltas');
if (is_array($deltas)) {
$deltas = implode(', ', $deltas);
}
$element['deltas'] = [
'#type' => 'textfield',
'#title' => $this->t('Delta'),
'#default_value' => $deltas,
'#description' => $this->t('Enter a delta, or a comma-separated list of deltas that should be shown. For example: 0, 1, 4.'),
'#size' => 10,
'#default_value' => $this->getSetting('deltas'),
'#element_validate' => [[$this, 'validateDeltas']],
'#required' => TRUE,
'#size' => 10,
'#title' => $this->t('Delta'),
'#type' => 'textfield',
'#weight' => -20,
];
$element['deltas_reversed'] = [
'#title' => $this->t('Reversed'),
'#type' => 'checkbox',
'#default_value' => $this->getSetting('deltas_reversed'),
'#description' => $this->t('Start from the last values.'),
'#title' => $this->t('Reversed'),
'#type' => 'checkbox',
'#weight' => -10,
];
......@@ -66,17 +71,63 @@ trait ImageDeltaTrait {
$settings = $this->getSettings();
$summary = parent::settingsSummary();
$deltas = '' . ($settings['deltas'] ?? '');
$count = count(explode(',', $deltas));
$args = ['@deltas' => trim($deltas)];
$delta_summary = $settings['deltas_reversed']
? $this->formatPlural($count, 'Delta: @deltas (reversed, no effect).', 'Deltas: @deltas (reversed).', $args)
: $this->formatPlural($count, 'Delta: @deltas', 'Deltas: @deltas', $args);
['deltas' => $deltas, 'deltas_reversed' => $reversed] = $settings;
// Handle legacy config format.
if (is_scalar($deltas)) {
$deltas = $this->deltasFromString($deltas);
}
$count = count($deltas);
$args = [
'@deltas' => trim(implode(', ', $deltas)),
];
$delta_summary = $reversed
? $this->formatPlural($count,
'Delta: @deltas (reversed, no effect).', 'Deltas: @deltas (reversed).',
$args)
: $this->formatPlural($count,
'Delta: @deltas', 'Deltas: @deltas',
$args);
$summary[] = $delta_summary;
return $summary;
}
/**
* Convert a deltas string to a clean deltas array.
*
* @param scalar $s
* A scalar describing the list of deltas.
*
* @return int[]
* The deduplicated, unsorted, integer deltas found in the source string.
*/
protected static function deltasFromString($s): array {
$split = explode(',', '' . $s);
$trimmed = array_map(fn($v) => (int) trim($v), $split);
$unique = array_unique($trimmed);
// Avoid non-sequential index keys that could result from input like "0,,1".
$normalized = array_values($unique);
return $normalized;
}
/**
* Element validate handler for deltas.
*
* @param array<string,mixed> $element
* The deltas elements.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
* @param array<string,mixed> $complete_form
* The complete form.
*/
public function validateDeltas(array &$element, FormStateInterface $form_state, array &$complete_form): void {
/** @var string $value */
$value = $element['#value'] ?? '';
$deltas = $this->deltasFromString($value);
$form_state->setValueForElement($element, $deltas);
}
/**
* Returns the referenced entities for display.
*
......@@ -93,18 +144,24 @@ trait ImageDeltaTrait {
protected function getEntitiesToView(EntityReferenceFieldItemListInterface $items, $langcode): array {
$files = parent::getEntitiesToView($items, $langcode);
// Prepare an array of selected deltas from the entered string.
/** @var string $raw_deltas */
$raw_deltas = $this->getSetting('deltas');
if (mb_strpos($raw_deltas, ',')) {
$deltas = explode(',', $raw_deltas);
/** @var string|array $rawDeltas */
$rawDeltas = $this->getSetting('deltas');
if (is_scalar($rawDeltas)) {
$rawDeltas = '' . $rawDeltas;
if (mb_strpos($rawDeltas, ',')) {
$deltas = explode(',', $rawDeltas);
$deltas = array_map('trim', $deltas);
$deltas = array_map('intval', $deltas);
}
else {
/** @var int $delta */
$delta = (int) trim($raw_deltas);
$delta = (int) trim($rawDeltas);
$deltas = [$delta];
}
}
else {
$deltas = $rawDeltas;
}
foreach (array_keys($files) as $delta) {
if (!in_array($delta, $deltas)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment