baseForm($definition)['image_style']; } if (!empty($definition['thumbnail_style'])) { $form['thumbnail_style'] = $this->baseForm($definition)['thumbnail_style']; } if ($is_responsive && !empty($definition['responsive_image'])) { $form['responsive_image_style'] = [ '#type' => 'select', '#title' => $this->t('Responsive image'), '#options' => $this->getResponsiveImageOptions(), '#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.'), '#access' => $this->getResponsiveImageOptions(), '#weight' => -100, ]; if (!empty($definition['background'])) { $form['background']['#states'] = $this->getState(static::STATE_RESPONSIVE_IMAGE_STYLE_DISABLED, $definition); } } if (!empty($definition['thumbnail_effect'])) { $form['thumbnail_effect'] = [ '#type' => 'select', '#title' => $this->t('Thumbnail effect'), '#options' => isset($definition['thumbnail_effect']) ? $definition['thumbnail_effect'] : [], '#weight' => -100, ]; } if ($is_responsive && isset($form['responsive_image_style'])) { $url = Url::fromRoute('entity.responsive_image_style.collection')->toString(); $form['responsive_image_style']['#description'] .= ' ' . $this->t('Manage responsive image styles.', [':url' => $url]); } } /** * Return the field formatter settings summary. */ public function settingsSummary($plugin, $definition = []) { $form = []; $summary = []; $form_state = new FormState(); $settings = isset($definition['settings']) ? $definition['settings'] : $plugin->getSettings(); $elements = $plugin->settingsForm($form, $form_state); $image_styles = image_style_options(TRUE); $breakpoints = isset($settings['breakpoints']) ? array_filter($settings['breakpoints']) : []; $excludes = empty($definition['excludes']) ? $definition : $definition['excludes']; unset($image_styles['']); $extras = ['details', 'fieldset', 'hidden', 'markup', 'item', 'table']; foreach ($settings as $key => $setting) { $type = isset($elements[$key]['#type']) ? $elements[$key]['#type'] : ''; if (!empty($excludes) && in_array($key, $excludes)) { continue; } if (in_array($type, $extras) || empty($type)) { continue; } $access = isset($elements[$key]['#access']) ? $elements[$key]['#access'] : TRUE; $title = !isset($elements[$key]) && isset($settings[$key]) ? Unicode::ucfirst(str_replace('_', ' ', $key)) : ''; $title = isset($elements[$key]['#title']) ? $elements[$key]['#title'] : $title; $options = isset($elements[$key]['#options']) ? $elements[$key]['#options'] : []; $vanilla = !empty($settings['vanilla']) && !isset($elements[$key]['#enforced']); $multiple = isset($elements[$key]['#multiple']) && $elements[$key]['#multiple']; if ($key == 'breakpoints') { $widths = []; if ($breakpoints) { foreach ($breakpoints as $id => $breakpoint) { if (!empty($breakpoint['width'])) { $widths[] = $breakpoint['width']; } } } $title = $this->t('Breakpoints'); $setting = $widths ? implode(', ', $widths) : $this->t('None'); } else { if (empty($title) || $vanilla || !$access) { continue; } if ($key == 'override' && empty($setting)) { unset($settings['overridables']); } if (is_bool($setting) && $setting) { $setting = $this->t('Yes'); } elseif (is_string($setting) && $key != 'cache') { // The value is based on select options. if (!$multiple && $type == 'select' && isset($options[$setting])) { $setting = is_object($options[$setting]) ? $options[$setting]->render() : $options[$setting]; } } elseif (is_array($setting)) { $values = array_filter($setting); if (!empty($values)) { // Combine possible multi-value select, or checkboxes. $multiple_values = array_combine($values, $values); foreach ($multiple_values as $i => $value) { if (isset($options[$i])) { $multiple_values[$i] = is_object($options[$i]) ? $options[$i]->render() : $options[$i]; } } $setting = implode(', ', $multiple_values); } if (is_array($setting)) { $setting = array_filter($setting); if (!empty($setting)) { $setting = implode(', ', $setting); } } } if ($key == 'cache') { $setting = $this->getCacheOptions()[$setting]; } } if (empty($setting)) { continue; } if (isset($settings[$key])) { $summary[] = $this->t('@title: @setting', [ '@title' => $title, '@setting' => $setting, ]); } } return $summary; } /** * Returns available fields for select options. */ public function getFieldOptions($target_bundles = [], $allowed_field_types = [], $entity_type = 'media', $target_type = '') { $options = []; $storage = $this->blazyManager()->getEntityTypeManager()->getStorage('field_config'); // Fix for Views UI not recognizing Media bundles, unlike Formatters. if (empty($target_bundles)) { $bundle_service = \Drupal::service('entity_type.bundle.info'); $target_bundles = $bundle_service->getBundleInfo($entity_type); } // Declutters options from less relevant options. $excludes = $this->getExcludedFieldOptions(); foreach ($target_bundles as $bundle => $label) { if ($fields = $storage->loadByProperties(['entity_type' => $entity_type, 'bundle' => $bundle])) { foreach ((array) $fields as $field_name => $field) { if (in_array($field->getName(), $excludes)) { continue; } if (empty($allowed_field_types)) { $options[$field->getName()] = $field->getLabel(); } elseif (in_array($field->getType(), $allowed_field_types)) { $options[$field->getName()] = $field->getLabel(); } if (!empty($target_type) && ($field->getSetting('target_type') == $target_type)) { $options[$field->getName()] = $field->getLabel(); } } } } return $options; } /** * Declutters options from less relevant options. */ public function getExcludedFieldOptions() { $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'; $excludes = explode(' ', $excludes); $excludes = array_combine($excludes, $excludes); $this->blazyManager->getModuleHandler()->alter('blazy_excluded_field_options', $excludes); return $excludes; } /** * Returns Responsive image for select options. */ public function getResponsiveImageOptions() { $options = []; if ($this->blazyManager()->getModuleHandler()->moduleExists('responsive_image')) { $image_styles = $this->blazyManager()->entityLoadMultiple('responsive_image_style'); if (!empty($image_styles)) { foreach ($image_styles as $name => $image_style) { if ($image_style->hasImageStyleMappings()) { $options[$name] = strip_tags($image_style->label()); } } } } return $options; } }