class SvgFormatter in SVG Formatter 8
Plugin implementation of the 'svg_formatter' formatter.
Plugin annotation
@FieldFormatter(
id = "svg_formatter",
label = @Translation("SVG Formatter"),
field_types = {
"file",
"image"
}
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
- class \Drupal\Core\Field\FormatterBase implements FormatterInterface, ContainerFactoryPluginInterface
- class \Drupal\svg_formatter\Plugin\Field\FieldFormatter\SvgFormatter implements ContainerFactoryPluginInterface
- class \Drupal\Core\Field\FormatterBase implements FormatterInterface, ContainerFactoryPluginInterface
- class \Drupal\Core\Field\PluginSettingsBase implements DependentPluginInterface, PluginSettingsInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of SvgFormatter
File
- src/
Plugin/ Field/ FieldFormatter/ SvgFormatter.php, line 28
Namespace
Drupal\svg_formatter\Plugin\Field\FieldFormatterView source
class SvgFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
/**
* The name of the field to which the formatter is associated.
*
* @var string
*/
protected $fieldName;
/**
* Module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Token service.
*
* @var \Drupal\Core\Utility\Token
*/
protected $token;
/**
* The entity repository.
*
* @var \Drupal\Core\Entity\EntityRepositoryInterface
*/
protected $entityRepository;
/**
* {@inheritdoc}
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, ModuleHandlerInterface $module_handler, Token $token, EntityRepositoryInterface $entity_repository) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
$this->fieldName = $field_definition
->getName();
$this->moduleHandler = $module_handler;
$this->token = $token;
$this->entityRepository = $entity_repository;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($plugin_id, $plugin_definition, $configuration['field_definition'], $configuration['settings'], $configuration['label'], $configuration['view_mode'], $configuration['third_party_settings'], $container
->get('module_handler'), $container
->get('token'), $container
->get('entity.repository'));
}
/**
* {@inheritdoc}
*/
public static function defaultSettings() {
return [
'inline' => FALSE,
'sanitize' => TRUE,
'apply_dimensions' => TRUE,
'width' => 100,
'height' => 100,
'enable_alt' => TRUE,
'alt_string' => '',
'enable_title' => TRUE,
'title_string' => '',
] + parent::defaultSettings();
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$form = parent::settingsForm($form, $form_state);
$token_module = $this->moduleHandler
->moduleExists('token');
$form['inline'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Output SVG inline'),
'#default_value' => $this
->getSetting('inline'),
'#description' => $this
->t('Check this option if you want to manipulate the SVG image with CSS and Javascript.'),
];
$sanitize_attributes = $this
->isSanitizerInstalled() ? [] : [
'disabled' => 'disabled',
];
$form['sanitize'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Sanitize inline SVG'),
'#default_value' => $this
->getSetting('sanitize'),
'#description' => $this
->t('For this to work you must install "enshrined/svg-sanitize" library with composer.'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][inline]"]' => [
'checked' => TRUE,
],
],
],
'#attributes' => $sanitize_attributes,
];
$form['apply_dimensions'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Set image dimensions.'),
'#default_value' => $this
->getSetting('apply_dimensions'),
];
$form['width'] = [
'#type' => 'number',
'#title' => $this
->t('Image width.'),
'#default_value' => $this
->getSetting('width'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][apply_dimensions]"]' => [
'checked' => TRUE,
],
],
],
];
$form['height'] = [
'#type' => 'number',
'#title' => $this
->t('Image height.'),
'#default_value' => $this
->getSetting('height'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][apply_dimensions]"]' => [
'checked' => TRUE,
],
],
],
];
$form['enable_alt'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Enable alt attribute.'),
'#default_value' => $this
->getSetting('enable_alt'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][inline]"]' => [
'checked' => FALSE,
],
],
],
];
$form['alt_string'] = [
'#type' => 'textfield',
'#title' => $this
->t('Token with alt value'),
'#description' => $token_module ? $this
->t('Use the token help link below to select the token.') : $this
->t('Install token module to see available tokens.'),
'#default_value' => $this
->getSetting('alt_string'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][enable_alt]"]' => [
'checked' => TRUE,
],
],
],
];
$form['enable_title'] = [
'#type' => 'checkbox',
'#title' => $this
->t('Enable title attribute.'),
'#default_value' => $this
->getSetting('enable_title'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][inline]"]' => [
'checked' => FALSE,
],
],
],
];
$form['title_string'] = [
'#type' => 'textfield',
'#title' => $this
->t('Token with title value'),
'#description' => $token_module ? $this
->t('Use the token help link below to select the token.') : $this
->t('Install token module to see available tokens.'),
'#default_value' => $this
->getSetting('title_string'),
'#states' => [
'visible' => [
':input[name="fields[' . $this->fieldName . '][settings_edit_form][settings][enable_title]"]' => [
'checked' => TRUE,
],
],
],
];
if ($token_module) {
$form['token_help'] = [
'#theme' => 'token_tree_link',
'#token_types' => [
$this->fieldDefinition
->getTargetEntityTypeId(),
'file',
],
];
}
return $form;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = [];
// Implement settings summary.
if ($this
->getSetting('inline')) {
$summary[] = $this
->t('Inline SVG');
}
if ($this
->getSetting('sanitize')) {
$summary[] = $this
->t('Sanitize inline SVG');
}
if ($this
->getSetting('apply_dimensions') && $this
->getSetting('width')) {
$summary[] = $this
->t('Image width:') . ' ' . $this
->getSetting('width');
}
if ($this
->getSetting('apply_dimensions') && $this
->getSetting('height')) {
$summary[] = $this
->t('Image height:') . ' ' . $this
->getSetting('height');
}
if ($this
->getSetting('enable_alt') && !$this
->getSetting('inline')) {
$summary[] = $this
->t('Alt enabled');
if ($this
->getSetting('alt_string')) {
$summary[] = $this
->t('Alt token:') . ' ' . $this
->getSetting('alt_string');
}
}
if ($this
->getSetting('enable_title') && !$this
->getSetting('inline')) {
$summary[] = $this
->t('Title enabled');
if ($this
->getSetting('title_string')) {
$summary[] = $this
->t('Title token:') . ' ' . $this
->getSetting('title_string');
}
}
return $summary;
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
$attributes = [];
if ($this
->getSetting('apply_dimensions')) {
$attributes['width'] = $this
->getSetting('width');
$attributes['height'] = $this
->getSetting('height');
}
foreach ($items as $delta => $item) {
if ($item->entity) {
$file = $item->entity;
$parent = $items
->getParent()
->getEntity();
// Skip if this is not a SVG image.
if ($item->entity
->getMimeType() !== 'image/svg+xml') {
continue;
}
$filename = $item->entity
->getFilename();
$default_alt = $this
->generateAltAttribute($filename);
$token_data = [
'file' => $this->entityRepository
->getTranslationFromContext($file),
$parent
->getEntityTypeId() => $this->entityRepository
->getTranslationFromContext($parent),
];
$replace_options = [
'clear' => TRUE,
];
if ($this
->getSetting('enable_alt')) {
if ($this
->getSetting('alt_string')) {
if ($alt = $this->token
->replace($this
->getSetting('alt_string'), $token_data, $replace_options)) {
$attributes['alt'] = $alt;
}
}
else {
$attributes['alt'] = $default_alt;
}
}
if ($this
->getSetting('enable_title')) {
if ($this
->getSetting('title_string')) {
if ($title = $this->token
->replace($this
->getSetting('title_string'), $token_data, $replace_options)) {
$attributes['title'] = $title;
}
}
else {
$attributes['title'] = $default_alt;
}
}
$uri = $item->entity
->getFileUri();
$svg_data = NULL;
if ($this
->getSetting('inline')) {
$svg_file = file_exists($uri) ? file_get_contents($uri) : NULL;
// Sanitize inline SVG if sanitizing library is installed.
if ($svg_file && $this
->isSanitizerInstalled() && $this
->getSetting('sanitize')) {
$sanitizer = new Sanitizer();
$svg_file = $sanitizer
->sanitize($svg_file);
}
if ($svg_file) {
$dom = new \DOMDocument();
libxml_use_internal_errors(TRUE);
$dom
->loadXML($svg_file);
if ($this
->getSetting('apply_dimensions') && isset($dom->documentElement)) {
$dom->documentElement
->setAttribute('height', $attributes['height']);
$dom->documentElement
->setAttribute('width', $attributes['width']);
}
if ($this
->getSetting('enable_title') && isset($dom->documentElement)) {
$title = $dom
->createElement('title', $attributes['title']);
$title_id = $this->fieldName . '__title-' . $delta;
$title
->setAttribute('id', $title_id);
$dom->documentElement
->insertBefore($title, $dom->documentElement->firstChild);
$dom->documentElement
->setAttribute('aria-labelledby', $title_id);
}
$svg_data = $dom
->saveXML($dom->documentElement);
}
}
$elements[$delta] = [
'#theme' => 'svg_formatter',
'#inline' => $this
->getSetting('inline') ? TRUE : FALSE,
'#attributes' => $attributes,
'#uri' => $this
->getSetting('inline') ? NULL : $uri,
'#svg_data' => $this
->getSetting('inline') ? $svg_data : NULL,
];
}
}
return $elements;
}
/**
* Generates alt attribute from an image filename.
*/
protected function generateAltAttribute($filename) {
$alt = str_replace([
'.svg',
'-',
'_',
], [
'',
' ',
' ',
], $filename);
$alt = ucfirst($alt);
return $alt;
}
/**
* Checks if "enshrined/svg-sanitize" library is installed.
*/
protected function isSanitizerInstalled() {
return class_exists('\\enshrined\\svgSanitize\\Sanitizer');
}
/**
* {@inheritdoc}
*/
public static function isApplicable(FieldDefinitionInterface $field_definition) {
if ($field_definition
->getType() == 'image') {
$module_handler = \Drupal::service('module_handler');
if ($module_handler
->moduleExists('svg_image')) {
return TRUE;
}
else {
return FALSE;
}
}
return TRUE;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
FormatterBase:: |
protected | property | The field definition. | |
FormatterBase:: |
protected | property | The label display setting. | |
FormatterBase:: |
protected | property |
The formatter settings. Overrides PluginSettingsBase:: |
|
FormatterBase:: |
protected | property | The view mode. | |
FormatterBase:: |
protected | function | Returns the value of a field setting. | |
FormatterBase:: |
protected | function | Returns the array of field settings. | |
FormatterBase:: |
public | function |
Allows formatters to load information for field values being displayed. Overrides FormatterInterface:: |
2 |
FormatterBase:: |
public | function |
Builds a renderable array for a fully themed field. Overrides FormatterInterface:: |
1 |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
PluginSettingsBase:: |
protected | property | Whether default settings have been merged into the current $settings. | |
PluginSettingsBase:: |
protected | property | The plugin settings injected by third party modules. | |
PluginSettingsBase:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
6 |
PluginSettingsBase:: |
public | function |
Returns the value of a setting, or its default value if absent. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Returns the array of settings, including defaults for missing settings. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Gets the list of third parties that store information. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Gets the value of a third-party setting. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Gets all third-party settings of a given module. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
protected | function | Merges default settings values into $settings. | |
PluginSettingsBase:: |
public | function |
Informs the plugin that some configuration it depends on will be deleted. Overrides PluginSettingsInterface:: |
3 |
PluginSettingsBase:: |
public | function |
Sets the value of a setting for the plugin. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Sets the settings for the plugin. Overrides PluginSettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Sets the value of a third-party setting. Overrides ThirdPartySettingsInterface:: |
|
PluginSettingsBase:: |
public | function |
Unsets a third-party setting. Overrides ThirdPartySettingsInterface:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. | |
SvgFormatter:: |
protected | property | The entity repository. | |
SvgFormatter:: |
protected | property | The name of the field to which the formatter is associated. | |
SvgFormatter:: |
protected | property | Module handler. | |
SvgFormatter:: |
protected | property | Token service. | |
SvgFormatter:: |
public static | function |
Creates an instance of the plugin. Overrides FormatterBase:: |
|
SvgFormatter:: |
public static | function |
Defines the default settings for this plugin. Overrides PluginSettingsBase:: |
|
SvgFormatter:: |
protected | function | Generates alt attribute from an image filename. | |
SvgFormatter:: |
public static | function |
Returns if the formatter can be used for the provided field. Overrides FormatterBase:: |
|
SvgFormatter:: |
protected | function | Checks if "enshrined/svg-sanitize" library is installed. | |
SvgFormatter:: |
public | function |
Returns a form to configure settings for the formatter. Overrides FormatterBase:: |
|
SvgFormatter:: |
public | function |
Returns a short summary for the current formatter settings. Overrides FormatterBase:: |
|
SvgFormatter:: |
public | function |
Builds a renderable array for a field value. Overrides FormatterInterface:: |
|
SvgFormatter:: |
public | function |
Constructs a FormatterBase object. Overrides FormatterBase:: |