3 namespace Drupal\blazy\Form;
6 use Drupal\Component\Utility\Unicode;
9 * A base for field formatter admin to have re-usable methods in one place.
11 abstract class BlazyAdminFormatterBase extends BlazyAdminBase {
14 * Returns re-usable image formatter form elements.
16 public function imageStyleForm(array &$form, $definition = []) {
17 $is_responsive = function_exists('responsive_image_get_image_dimensions');
19 if (empty($definition['no_image_style'])) {
20 $form['image_style'] = $this->baseForm($definition)['image_style'];
23 if (!empty($definition['thumbnail_style'])) {
24 $form['thumbnail_style'] = $this->baseForm($definition)['thumbnail_style'];
27 if ($is_responsive && !empty($definition['responsive_image'])) {
28 $url = Url::fromRoute('entity.responsive_image_style.collection')->toString();
29 $form['responsive_image_style'] = [
31 '#title' => $this->t('Responsive image'),
32 '#options' => $this->getResponsiveImageOptions(),
33 '#description' => $this->t('Responsive image style for the main stage image is more reasonable for large images. Works with multi-serving IMG, or PICTURE element. Not compatible with breakpoints and aspect ratio, yet. Leave empty to disable. <a href=":url" target="_blank">Manage responsive image styles</a>.', [':url' => $url]),
34 '#access' => $this->getResponsiveImageOptions(),
38 if (!empty($definition['background'])) {
39 $form['background']['#states'] = $this->getState(static::STATE_RESPONSIVE_IMAGE_STYLE_DISABLED, $definition);
43 if (!empty($definition['thumbnail_effect'])) {
44 $form['thumbnail_effect'] = [
46 '#title' => $this->t('Thumbnail effect'),
47 '#options' => isset($definition['thumbnail_effect']) ? $definition['thumbnail_effect'] : [],
54 * Return the field formatter settings summary.
56 * @deprecated: To remove for self::getSettingsSummary() post full release so
57 * to avoid unpredictable settings, and complication with form elements.
59 public function settingsSummary($plugin, $definition = []) {
60 $definition = isset($definition) ? $definition : $plugin->getScopedFormElements();
61 $definition['settings'] = isset($definition['settings']) ? $definition['settings'] : $plugin->getSettings();
63 return $this->getSettingsSummary($definition);
67 * Return the field formatter settings summary.
69 public function getSettingsSummary($definition = []) {
72 if (empty($definition['settings'])) {
76 $this->getExcludedSettingsSummary($definition);
89 $enforced = isset($definition['enforced']) ? $definition['enforced'] : $enforced;
90 $settings = array_filter($definition['settings']);
91 $breakpoints = isset($settings['breakpoints']) && is_array($settings['breakpoints']) ? array_filter($settings['breakpoints']) : [];
93 foreach ($definition['settings'] as $key => $setting) {
94 $title = Unicode::ucfirst(str_replace('_', ' ', $key));
95 $vanilla = !empty($settings['vanilla']);
97 if ($key == 'breakpoints') {
100 foreach ($breakpoints as $id => $breakpoint) {
101 if (!empty($breakpoint['width'])) {
102 $widths[] = $breakpoint['width'];
107 $title = 'Breakpoints';
108 $setting = $widths ? implode(', ', $widths) : 'none';
111 if ($vanilla && !in_array($key, $enforced)) {
115 if ($key == 'override' && empty($setting)) {
116 unset($settings['overridables']);
119 if (is_bool($setting) && $setting) {
122 elseif (is_array($setting)) {
123 $setting = array_filter($setting);
124 if (!empty($setting)) {
125 $setting = implode(', ', $setting);
129 if ($key == 'cache') {
130 $setting = $this->getCacheOptions()[$setting];
134 if (empty($setting)) {
138 if (isset($settings[$key]) && is_string($setting)) {
139 $summary[] = $this->t('@title: <strong>@setting</strong>', [
141 '@setting' => $setting,
149 * Exclude the field formatter settings summary as required.
151 public function getExcludedSettingsSummary(array &$definition = []) {
152 $settings = &$definition['settings'];
153 $excludes = empty($definition['excludes']) ? [] : $definition['excludes'];
154 $plugin_id = isset($definition['plugin_id']) ? $definition['plugin_id'] : '';
155 $blazy = $plugin_id && strpos($plugin_id, 'blazy') !== FALSE;
156 $image_styles = function_exists('image_style_options') ? image_style_options(TRUE) : [];
157 $media_switch = empty($settings['media_switch']) ? '' : $settings['media_switch'];
159 unset($image_styles['']);
161 $excludes['current_view_mode'] = TRUE;
164 $excludes['optionset'] = TRUE;
167 if ($media_switch != 'media') {
168 $excludes['iframe_lazy'] = TRUE;
171 if (!empty($settings['responsive_image_style'])) {
172 foreach (['ratio', 'breakpoints', 'background', 'sizes'] as $key) {
173 $excludes[$key] = TRUE;
177 if (empty($settings['grid'])) {
178 foreach (['grid', 'grid_medium', 'grid_small', 'visible_items'] as $key) {
179 $excludes[$key] = TRUE;
183 // Remove exluded settings.
184 foreach ($excludes as $key => $value) {
185 if (isset($settings[$key])) {
186 unset($settings[$key]);
190 foreach ($settings as $key => $setting) {
191 if ($key == 'style' || $key == 'responsive_image_style' || empty($settings[$key])) {
194 if (strpos($key, 'style') !== FALSE && isset($image_styles[$settings[$key]])) {
195 $settings[$key] = $image_styles[$settings[$key]];
201 * Returns available fields for select options.
203 public function getFieldOptions($target_bundles = [], $allowed_field_types = [], $entity_type = 'media', $target_type = '') {
205 $storage = $this->blazyManager()->getEntityTypeManager()->getStorage('field_config');
207 // Fix for Views UI not recognizing Media bundles, unlike Formatters.
208 if (empty($target_bundles)) {
209 $bundle_service = \Drupal::service('entity_type.bundle.info');
210 $target_bundles = $bundle_service->getBundleInfo($entity_type);
213 // Declutters options from less relevant options.
214 $excludes = $this->getExcludedFieldOptions();
216 foreach ($target_bundles as $bundle => $label) {
217 if ($fields = $storage->loadByProperties(['entity_type' => $entity_type, 'bundle' => $bundle])) {
218 foreach ((array) $fields as $field_name => $field) {
219 if (in_array($field->getName(), $excludes)) {
222 if (empty($allowed_field_types)) {
223 $options[$field->getName()] = $field->getLabel();
225 elseif (in_array($field->getType(), $allowed_field_types)) {
226 $options[$field->getName()] = $field->getLabel();
229 if (!empty($target_type) && ($field->getSetting('target_type') == $target_type)) {
230 $options[$field->getName()] = $field->getLabel();
240 * Declutters options from less relevant options.
242 public function getExcludedFieldOptions() {
243 $excludes = 'field_document_size field_id field_media_in_library field_mime_type field_source field_tweet_author field_tweet_id field_tweet_url field_media_video_embed_field field_instagram_shortcode field_instagram_url';
244 $excludes = explode(' ', $excludes);
245 $excludes = array_combine($excludes, $excludes);
247 $this->blazyManager->getModuleHandler()->alter('blazy_excluded_field_options', $excludes);
252 * Returns Responsive image for select options.
254 public function getResponsiveImageOptions() {
256 if ($this->blazyManager()->getModuleHandler()->moduleExists('responsive_image')) {
257 $image_styles = $this->blazyManager()->entityLoadMultiple('responsive_image_style');
258 if (!empty($image_styles)) {
259 foreach ($image_styles as $name => $image_style) {
260 if ($image_style->hasImageStyleMappings()) {
261 $options[$name] = strip_tags($image_style->label());