View source  
  <?php
namespace Drupal\bg_img_field\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\TypedData\DataDefinition;
use Drupal\image\Plugin\Field\FieldType\ImageItem;
use Robo\State\Data;
class BgImgItem extends ImageItem {
  
  public static function defaultStorageSettings() {
    $settings = parent::defaultStorageSettings();
    $settings['css_settings']['css_selector'] = '';
    $settings['css_settings']['css_repeat'] = 'inherit';
    $settings['css_settings']['css_background_size'] = 'inherit';
    $settings['css_settings']['css_background_position'] = 'inherit';
    return $settings;
  }
  
  public function storageSettingsForm(array &$form, FormStateInterface $form_state, $has_data) {
    $elements = parent::storageSettingsForm($form, $form_state, $has_data);
    
    unset($elements['default_image']['alt']);
    unset($elements['default_image']['title']);
    return $elements;
  }
  
  public static function defaultFieldSettings() {
    $settings = parent::defaultFieldSettings();
    
    $settings['file_extensions'] = "png jpg jpeg svg";
    $settings['alt_field'] = 0;
    $settings['alt_field_required'] = 0;
    
    $settings['css_settings']['css_selector'] = '';
    $settings['css_settings']['css_repeat'] = 'inherit';
    $settings['css_settings']['css_background_size'] = 'inherit';
    $settings['css_settings']['css_background_position'] = 'inherit';
    return $settings;
  }
  
  public static function schema(FieldStorageDefinitionInterface $field_definition) {
    $schema = parent::schema($field_definition);
    $schema['columns']['css_selector'] = [
      'description' => t("CSS selector to target the background image placement."),
      'type' => 'text',
    ];
    $schema['columns']['css_repeat'] = [
      'description' => t("CSS property that determines the repeat attribute."),
      'type' => 'varchar',
      'length' => 255,
    ];
    $schema['columns']['css_background_size'] = [
      'description' => t("CSS property that determines the background size attribute."),
      'type' => 'varchar',
      'length' => 255,
    ];
    $schema['columns']['css_background_position'] = [
      'description' => t("CSS property that determines the background position attribute."),
      'type' => 'varchar',
      'length' => 255,
    ];
    return $schema;
  }
  
  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties = parent::propertyDefinitions($field_definition);
    $properties['css_selector'] = DataDefinition::create('string')
      ->setLabel(t('CSS Selector'))
      ->setDescription(t("CSS selector that will be used to place the background image. attribute."));
    $properties['css_repeat'] = DataDefinition::create('string')
      ->setLabel(t('CSS Repeat Property'))
      ->setDescription(t("CSS attribute that set the repeating value of the background image."));
    $properties['css_background_size'] = DataDefinition::create('string')
      ->setLabel(t('CSS Background Size Property'))
      ->setDescription(t("CSS attribute that set the background size value of the background image."));
    $properties['css_background_position'] = DataDefinition::create('string')
      ->setLabel(t('CSS Background Position Property'))
      ->setDescription(t("CSS attribute that set the background position value of the background image."));
    $properties['hide_css_Settings'] = DataDefinition::create('boolean')
      ->setLabel(t("Hide CSS Settings"))
      ->setDescription(t("Hides CSS settings on edit screens of the background image field type"));
    return $properties;
  }
  
  public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
    $parentElements = parent::fieldSettingsForm($form, $form_state);
    
    unset($parentElements['alt_field']);
    unset($parentElements['alt_field_required']);
    unset($parentElements['title_field']);
    unset($parentElements['title_field_required']);
    
    unset($parentElements['default_image']['alt']);
    unset($parentElements['default_image']['title']);
    $elements['css_settings'] = [
      '#type' => 'details',
      '#title' => $this
        ->t('CSS Settings'),
      '#description' => $this
        ->t('Set default CSS properties for the background image.'),
      '#open' => FALSE,
    ];
    
    $token_types = [
      $this
        ->getFieldDefinition()
        ->getTargetEntityTypeId(),
    ];
    
    $css_option_settings = $this
      ->getSetting('css_settings');
    
    $elements['css_settings']['css_selector'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Selector'),
      '#description' => $this
        ->t('CSS Selector for background image.'),
      '#default_value' => $css_option_settings['css_selector'],
      '#token_types' => $token_types,
    ];
    
    $elements['css_settings']['tokens'] = [
      '#theme' => 'token_tree_link',
      '#token_types' => $token_types,
      '#global_types' => TRUE,
      '#show_nested' => FALSE,
    ];
    
    $elements['css_settings']['css_repeat'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('Repeat Options'),
      '#description' => $this
        ->t('Add the css no repeat value to the background image.'),
      '#default_value' => $css_option_settings['css_repeat'],
      '#options' => [
        "inherit" => $this
          ->t("inherit"),
        "no-repeat" => $this
          ->t("no-repeat"),
        "repeat" => $this
          ->t('repeat'),
      ],
    ];
    
    $elements['css_settings']['css_background_size'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('Background Size'),
      '#description' => $this
        ->t("Add the background size setting you would like for the image, use inherit for default."),
      '#default_value' => $css_option_settings['css_background_size'],
      '#options' => [
        'inherit' => $this
          ->t('inherit'),
        'auto' => $this
          ->t('auto'),
        'cover' => $this
          ->t('cover'),
        'contain' => $this
          ->t('contain'),
        'initial' => $this
          ->t('initial'),
      ],
    ];
    
    $elements['css_settings']['css_background_position'] = [
      '#type' => 'radios',
      '#title' => $this
        ->t('Background Position'),
      '#description' => $this
        ->t('Set a background position'),
      '#default_value' => $css_option_settings['css_background_position'],
      '#options' => [
        "inherit" => $this
          ->t("inherit"),
        "left top" => $this
          ->t("left top"),
        "left center" => $this
          ->t("left center"),
        "left bottom" => $this
          ->t("left bottom"),
        "right top" => $this
          ->t("right bottom"),
        "right center" => $this
          ->t("right center"),
        "right bottom" => $this
          ->t("right bottom"),
        "center top" => $this
          ->t("center top"),
        "center center" => $this
          ->t("center center"),
        "center bottom" => $this
          ->t("center bottom"),
      ],
      '#tree' => TRUE,
    ];
    $elements['file_settings'] = [
      '#type' => 'details',
      '#title' => $this
        ->t("File Settings"),
      '#open' => FALSE,
    ] + $parentElements;
    return $elements;
  }
}