class BgImgFieldFormatter in Background Image Field 8
Plugin implementation of the 'image' formatter.
Plugin annotation
@FieldFormatter(
id = "bg_img_field_formatter",
label = @Translation("Background Image Field Widget"),
field_types = {
"bg_img_field"
},
quickedit = {
"editor" = "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\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase
- class \Drupal\file\Plugin\Field\FieldFormatter\FileFormatterBase
- class \Drupal\image\Plugin\Field\FieldFormatter\ImageFormatterBase
- class \Drupal\responsive_image\Plugin\Field\FieldFormatter\ResponsiveImageFormatter implements ContainerFactoryPluginInterface
- class \Drupal\bg_img_field\Plugin\Field\FieldFormatter\BgImgFieldFormatter implements ContainerFactoryPluginInterface uses LoggerChannelTrait
- class \Drupal\responsive_image\Plugin\Field\FieldFormatter\ResponsiveImageFormatter implements ContainerFactoryPluginInterface
- class \Drupal\image\Plugin\Field\FieldFormatter\ImageFormatterBase
- class \Drupal\file\Plugin\Field\FieldFormatter\FileFormatterBase
- class \Drupal\Core\Field\Plugin\Field\FieldFormatter\EntityReferenceFormatterBase
- 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 BgImgFieldFormatter
File
- src/
Plugin/ Field/ FieldFormatter/ BgImgFieldFormatter.php, line 36
Namespace
Drupal\bg_img_field\Plugin\Field\FieldFormatterView source
class BgImgFieldFormatter extends ResponsiveImageFormatter implements ContainerFactoryPluginInterface {
// @var Drupal\Core\Logger\LoggerChannelTrait
use LoggerChannelTrait;
/**
* Constructor for the Background Image Formatter.
*
* @param string $plugin_id
* The plugin unique id.
* @param string $plugin_definition
* The plugin definition.
* @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
* The field definition.
* @param array $settings
* The stored setting for the formatter.
* @param string $label
* The formatters label.
* @param string $view_mode
* Which view mode the formatter is in.
* @param array $third_party_settings
* Any third party setting that might change how the formatter render the
* css.
* @param \Drupal\Core\Entity\EntityStorageInterface $responsive_image_style_storage
* The responsive image styles created in the system.
* @param \Drupal\Core\Entity\EntityStorageInterface $image_style_storage
* The image styles that have been created int eh system.
* @param \Drupal\Core\Utility\LinkGeneratorInterface $link_generator
* Help generate links.
* @param \Drupal\Core\Session\AccountInterface $current_user
* The current user.
*/
public function __construct($plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings, EntityStorageInterface $responsive_image_style_storage, EntityStorageInterface $image_style_storage, LinkGeneratorInterface $link_generator, AccountInterface $current_user) {
parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings, $responsive_image_style_storage, $image_style_storage, $link_generator, $current_user);
$this->logger = $this
->getLogger('bg_img_field');
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
$container = parent::create($container, $configuration, $plugin_id, $plugin_definition);
return $container;
}
/**
* {@inheritdoc}
*/
public function settingsForm(array $form, FormStateInterface $form_state) {
$elements = parent::settingsForm($form, $form_state);
// Get the options for responsive image styles.
$options = $elements['responsive_image_style']['#options'];
// New options array for storing new option values.
$new_options = [];
// Loop through the options to locate only the ones that are labeled
// image styles. This will eliminate any by size styles.
foreach ($options as $key => $option) {
$storage = $this->responsiveImageStyleStorage
->load($key);
$image_style_mappings = $storage
->get('image_style_mappings');
if (isset($image_style_mappings[0]) && $image_style_mappings[0]['image_mapping_type'] === 'image_style') {
$new_options += [
$key => $option,
];
}
}
$elements['responsive_image_style']['#options'] = $new_options;
// Remove the image link element.
unset($elements['image_link']);
return $elements;
}
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = [];
$responsive_image_style = $this->responsiveImageStyleStorage
->load($this
->getSetting('responsive_image_style'));
if ($responsive_image_style) {
$summary[] = $this
->t('Responsive image style: @responsive_image_style', [
'@responsive_image_style' => $responsive_image_style
->label(),
]);
}
else {
$summary[] = $this
->t('Select a responsive image style.');
}
return $summary;
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
$entity = $items
->getEntity();
// Load the files to render.
$files = [];
foreach ($items
->getValue() as $item) {
$files[] = [
'file' => File::load($item['target_id']),
'item' => $item,
];
}
// Early opt-out if the field is empty.
if (empty($files)) {
return $elements;
}
return $this
->buildElement($files, $entity);
}
/**
* Build the inline css style based on a set of files and a selector.
*
* @param array $files
* An array of image files.
* @param \Drupal\Core\Entity\EntityInterface $entity
* The parent entity the field belongs to. Used for token replacement in the
* selector.
*
* @return array
* Returns the built image with the prepared css in the html_head of
* render array
*/
protected function buildElement(array $files, EntityInterface $entity) {
$elements = [];
$css = "";
$image_link_setting = $this
->getSetting('image_link');
$cache_contexts = [];
if ($image_link_setting == 'file') {
$cache_contexts[] = 'url.site';
}
// Collect cache tags to be added for each item in the field.
$responsive_image_style = $this->responsiveImageStyleStorage
->load($this
->getSetting('responsive_image_style'));
$image_styles_to_load = [];
$cache_tags = [];
if ($responsive_image_style) {
$cache_tags = Cache::mergeTags($cache_tags, $responsive_image_style
->getCacheTags());
$image_styles_to_load = $responsive_image_style
->getImageStyleIds();
}
// Get image styles.
$image_styles = $this->imageStyleStorage
->loadMultiple($image_styles_to_load);
foreach ($image_styles as $image_style) {
$cache_tags = Cache::mergeTags($cache_tags, $image_style
->getCacheTags());
}
// Process the files to get the css markup.
foreach ($files as $file) {
$selector = $file['item']['css_selector'];
$selector = \Drupal::token()
->replace($selector, [
$entity
->getEntityTypeId() => $entity,
], [
'clear' => TRUE,
]);
$css .= $this
->generateBackgroundCss($file['file'], $responsive_image_style, $selector, $file['item']);
// Attach to head on element to create style tag in the html head.
if (!empty($css)) {
$current_path = \Drupal::request()
->getRequestUri();
if (preg_match('/node\\/(\\d+)\\/layout/', $current_path, $matches)) {
$elements = [
'#theme' => 'background_style',
'#css' => $css,
'#cache' => [
'tags' => $cache_tags,
'contexts' => $cache_contexts,
],
];
}
else {
// Use the selector in the id to avoid collisions with multiple
// background formatters on the same page.
$id = 'picture-background-formatter-' . $selector;
$elements['#attached']['html_head'][] = [
[
'#tag' => 'style',
'#value' => new CSSSnippet($css),
'#cache' => [
'tags' => $cache_tags,
'contexts' => $cache_contexts,
],
],
$id,
];
}
}
}
return $elements;
}
/**
* CSS Generator Helper Function.
*
* @param object $image
* URI of the field image.
* @param string $responsive_image_style
* Desired picture mapping to generate CSS.
* @param string $selector
* CSS selector to target.
* @param array $options
* CSS options.
*
* @return string
* Generated background image CSS.
*/
protected function generateBackgroundCss($image, $responsive_image_style, $selector, array $options) {
$css = "";
$css .= $selector . '{';
$css .= "background-repeat: " . $options['css_repeat'] . ";";
$css .= "background-size: " . $options['css_background_size'] . ";";
$css .= "background-position: " . $options['css_background_position'] . ";";
$css .= '}';
// $responsive_image_style holds the configuration from the responsive_image
// module for a given responsive style
// We need to check that this exists or else we get a WSOD.
if (!$responsive_image_style) {
$field_definition = $this->fieldDefinition
->getFieldStorageDefinition();
$this->logger
->error('
There is no responsive image style set for the {field_name} field on the {entity_type} entity. Please ensure
that the responsive image style is configured at <a href="{link}">{link}</a>. Then set the correct style on the
formatter for the entity display.
', [
'field_name' => $field_definition
->get('field_name'),
'entity_type' => $field_definition
->get('entity_type'),
'link' => Url::fromRoute('entity.responsive_image_style.collection')
->toString(),
]);
}
else {
$breakpoints = \Drupal::service('breakpoint.manager')
->getBreakpointsByGroup($responsive_image_style
->getBreakpointGroup());
foreach (array_reverse($responsive_image_style
->getKeyedImageStyleMappings()) as $breakpoint_id => $multipliers) {
if (isset($breakpoints[$breakpoint_id])) {
$multipliers = array_reverse($multipliers);
$query = $breakpoints[$breakpoint_id]
->getMediaQuery();
if ($query != "") {
$css .= ' @media ' . $query . ' {';
}
foreach ($multipliers as $multiplier => $mapping) {
$multiplier = rtrim($multiplier, "x");
if ($mapping['image_mapping_type'] != 'image_style') {
continue;
}
if ($mapping['image_mapping'] == "_original image_") {
$url = file_create_url($image
->getFileUri());
}
else {
$url = ImageStyle::load($mapping['image_mapping'])
->buildUrl($image
->getFileUri());
}
if ($multiplier != 1) {
$css .= ' @media (-webkit-min-device-pixel-ratio: ' . $multiplier . '), (min-resolution: ' . $multiplier * 96 . 'dpi), (min-resolution: ' . $multiplier . 'dppx) {';
}
$css .= $selector . ' {background-image: url(' . $url . ');}';
if ($multiplier != 1) {
$css .= '}';
}
}
if ($query != "") {
$css .= '}';
}
}
}
}
return $css;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
BgImgFieldFormatter:: |
protected | function | Build the inline css style based on a set of files and a selector. | |
BgImgFieldFormatter:: |
public static | function |
Creates an instance of the plugin. Overrides ResponsiveImageFormatter:: |
|
BgImgFieldFormatter:: |
protected | function | CSS Generator Helper Function. | |
BgImgFieldFormatter:: |
public | function |
Returns a form to configure settings for the formatter. Overrides ResponsiveImageFormatter:: |
|
BgImgFieldFormatter:: |
public | function |
Returns a short summary for the current formatter settings. Overrides ResponsiveImageFormatter:: |
|
BgImgFieldFormatter:: |
public | function |
Builds a renderable array for a field value. Overrides ResponsiveImageFormatter:: |
|
BgImgFieldFormatter:: |
public | function |
Constructor for the Background Image Formatter. Overrides ResponsiveImageFormatter:: |
|
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 | |
EntityReferenceFormatterBase:: |
public | function |
Loads the entities referenced in that field across all the entities being
viewed. Overrides FormatterBase:: |
|
EntityReferenceFormatterBase:: |
public | function |
Overrides FormatterBase:: |
|
FileFormatterBase:: |
protected | function |
Checks access to the given entity. Overrides EntityReferenceFormatterBase:: |
|
FileFormatterBase:: |
protected | function |
Returns whether the entity referenced by an item needs to be loaded. Overrides EntityReferenceFormatterBase:: |
1 |
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 static | function |
Returns if the formatter can be used for the provided field. Overrides FormatterInterface:: |
14 |
ImageFormatterBase:: |
protected | function |
Returns the referenced entities for display. Overrides EntityReferenceFormatterBase:: |
|
LoggerChannelTrait:: |
protected | property | The logger channel factory service. | |
LoggerChannelTrait:: |
protected | function | Gets the logger for a specific channel. | |
LoggerChannelTrait:: |
public | function | Injects the logger channel factory. | |
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 |
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:: |
|
ResponsiveImageFormatter:: |
protected | property | The current user. | |
ResponsiveImageFormatter:: |
protected | property | ||
ResponsiveImageFormatter:: |
protected | property | The link generator. | |
ResponsiveImageFormatter:: |
protected | property | ||
ResponsiveImageFormatter:: |
public | function |
Calculates dependencies for the configured plugin. Overrides PluginSettingsBase:: |
|
ResponsiveImageFormatter:: |
public static | function |
Defines the default settings for this plugin. Overrides PluginSettingsBase:: |
|
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. |