display_fields-8.x-1.x-dev/includes/display_fields.field_ui.inc

includes/display_fields.field_ui.inc
<?php

/**
 * @file
 * Include file for field UI functions.
 */

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Link;
use Drupal\Core\Url;
use Drupal\display_fields\DisplayFields;

/**
 * Adds the Display fields to the form field_ui_display.
 */
function _display_fields_form_field_ui_display(&$form, FormStateInterface $form_state) {
  _display_fields_form_field_ui_create_vertical_tabs($form);
  _display_fields_form_field_ui_display_fields_tab($form, $form_state);
  _display_fields_form_field_ui_display_fields_add_fields_row($form, $form_state);
}

/**
 * Add The fields row form, retrieving the $form from the DisplayFields Field
 * plugin.
 */
function _display_fields_form_field_ui_display_fields_add_fields_row(&$form, FormStateInterface $form_state) {
  $entity_type = $form['#entity_type'];
  $bundle = $form['#bundle'];
  $view_mode = $form_state->getFormObject()->getEntity()->getMode();

  $display_fields_config = DisplayFields::getDisplayFields($entity_type, $bundle);

  if (empty($display_fields_config->get('display_fields'))) {
    return;
  }

  // And an header for the delete button cell
  $form['fields']['#header'][] = ' ';

  $display_fields_settings = display_fields_get_entity_view_settings($entity_type, $bundle, $view_mode);

  $form['#display_fields'] = $display_fields_config->get('display_fields');

  foreach ($form['#display_fields'] as $key => $field) {
    $field_plugin = DisplayFields::getDisplayFieldsField($field['plugin_id'], $entity_type, $bundle);
    $form['fields']["display_fields_$key"] = $field_plugin->buildFieldFormRow($key, $field, $display_fields_settings->getComponent($key), $view_mode, $form_state, $form);
  }

  $form['actions']['submit']['#submit'][] = '_display_fields_form_field_ui_display_fields_fields_row_submit';
}

/**
 * Submit handler for the DisplayFields rows.
 *
 * @param array $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *
 * @throws \Drupal\Core\Entity\EntityStorageException
 */
function _display_fields_form_field_ui_display_fields_fields_row_submit(array &$form, FormStateInterface $form_state) {
  $form_values = $form_state->getValues();
  $entity_type = $form['#entity_type'];
  $bundle = $form['#bundle'];
  $view_mode = $form_state->getFormObject()->getEntity()->getMode();
  $display_fields_settings = display_fields_get_entity_view_settings($entity_type, $bundle, $view_mode);
  // Collect data for 'regular' fields.
  foreach ($form['#display_fields'] as $field_name => $field) {
    // Retrieve the stored field settings to merge with the incoming
    // values.
    $values = $form_values['fields']["display_fields_$field_name"];
    if ($values['type'] == 'hidden') {
      $display_fields_settings->removeComponent($field_name);
    }
    else {
      // Get plugin settings. They lie either directly in submitted form
      // values (if the whole form was submitted while some plugin settings
      // were being edited), or have been persisted in $form_state.
      $plugin_settings = $form_state->get('plugin_settings');
      $settings = $values['settings_edit_form']['settings'] ?? ($plugin_settings["display_fields_$field_name"]['settings'] ?? []);

      if (empty($settings) && $current_options = $display_fields_settings->getComponent($field_name) && isset($current_options['settings'])) {
        $settings = $current_options['settings'];
      }

      // Default component values.
      $component_values = [
        'type' => $values['type'],
        'weight' => $values['weight'] ?? '',
        'settings' => $settings,
      ];

      // Only formatters have configurable label visibility.
      if (isset($values['label'])) {
        $component_values['label'] = $values['label'];
      }

      $display_fields_settings->setComponent($field_name, $component_values);
    }
  }

  // Save the display.
  $display_fields_settings->save();
}

/**
 * Get the vertical tab UI to create DisplayFields field.
 */
function _display_fields_form_field_ui_display_fields_tab(&$form, FormStateInterface $form_state) {
  // Get the entity_type, bundle and view mode.
  $entity_type = $form['#entity_type'];
  $bundle = $form['#bundle'];
  $view_mode = $form_state->getFormObject()->getEntity()->getMode();
  $form_state->set('entity_type', $entity_type);
  $form_state->set('bundle', $bundle);
  $plugin_id = $form_state->getValue(['display_fields', 'create', 'field_type']);
  $plugin_id_selected = $form_state->getValue([
    'display_fields',
    'create',
    'plugin_id',
  ]);

  // Add layouts form.
  $form['display_fields'] = [
    '#type' => 'details',
    '#title' => t('Display fields'),
    '#collapsible' => TRUE,
    '#group' => 'additional_settings',
    '#collapsed' => FALSE,
    '#weight' => 10,
    '#tree' => TRUE,
  ];

  $form['display_fields']['create'] = [
    '#type' => 'fieldset',
    '#prefix' => '<div id="display-fields-create-wrapper">',
    '#suffix' => '</div>',
    '#title' => t('Create a new display field'),
    '#collapsible' => TRUE,
    '#collapsed' => TRUE,
  ];

  $field_type_options = display_fields_get_field_types($entity_type);
  if (empty($plugin_id) && empty($plugin_id_selected)) {
    $form['display_fields']['create']['field_type'] = [
      '#type' => 'select',
      '#title' => t('Select the type'),
      '#options' => [0 => '- ' . t('Select the type') . ' -'] + $field_type_options,
      // @todo Set the default value; $display_field_type hasn't been yet
      // initialized and it cannot be used for that.
      // '#default_value' => $display_field_type ?? NULL,
      '#weight' => -1,
      '#ajax' => [
        'callback' => '_display_fields_form_field_ui_create_display_fields_callback',
        'wrapper' => 'display-fields-create-wrapper',
      ],
      '#description' => t('Select a field type to see more options.'),
      '#attributes' => [
        'autocomplete' => 'off',
      ],
    ];
  }
  else {
    // Get an instance of the field plugin.
    if (empty($plugin_id)) {
      $plugin_id = $plugin_id_selected;
    }

    $plugin = DisplayFields::getDisplayFieldsField($plugin_id, $entity_type, $bundle);

    $form['display_fields']['create']['#title'] = $field_type_options[$plugin_id];
    $form['display_fields']['create']['plugin_form'] = [];
    $form['display_fields']['create']['plugin_form'] = $plugin->createForm($form['display_fields']['create']['plugin_form'], $form_state, [
      'display_fields',
      'create',
      'plugin_form',
    ]);
    $form['display_fields']['create']['plugin_form']['#tree'] = TRUE;
    $form['display_fields']['create']['plugin_id'] = [
      '#type' => 'value',
      '#value' => $plugin_id,
    ];
    $form['display_fields']['create']['display_field_name'] = [
      '#type' => 'textfield',
      '#title' => t('Name'),
      '#maxlength' => 255,
      '#description' => t('A label to display this on the field overview.'),
      '#required' => TRUE,
      '#weight' => -100,
    ];
    $form['display_fields']['create']['display_field_machine_name'] = [
      '#type' => 'machine_name',
      '#title' => t('Display field machine-name'),
      '#maxlength' => 160,
      '#description' => t('A unique name to save the display field. It must only contain lowercase letters, numbers and hyphens.'),
      '#machine_name' => [
        'exists' => '_display_fields_field_machine_name_exists',
        'source' => ['display_fields', 'create', 'display_field_name'],
        'label' => t('Machine name'),
      ],
      '#required' => TRUE,
      '#weight' => -99,
    ];
    $form['display_fields']['create']['submit'] = [
      '#type' => 'submit',
      '#value' => t('Save'),
      '#submit' => ['_display_fields_form_field_ui_create_display_fields_submit'],
    ];
    $form['display_fields']['create']['cancel'] = [
      '#type' => 'submit',
      '#value' => t('Cancel'),
      '#op' => 'cancel',
      '#limit_validation_errors' => [],
      '#ajax' => [
        'callback' => '_display_fields_form_field_ui_create_display_fields_callback',
        'wrapper' => 'display-fields-create-wrapper',
      ],
      '#submit' => ['_display_fields_form_field_ui_create_display_fields_cancel'],
    ];
  }
}

/**
 * Submit handler that cancel the creation of a DisplayFields.
 */
function _display_fields_form_field_ui_create_display_fields_cancel($form, FormStateInterface $form_state) {
  $triggering_element = $form_state->getTriggeringElement();
  if ($triggering_element['#op'] == 'cancel') {
    $form_state->unsetValue(['display_fields', 'create', 'field_type']);
    $form_state->unsetValue(['display_fields', 'create', 'plugin_id']);
  }
  $form_state->setRebuild();
}

/**
 * Submit handler for the DisplayFields fields rows plugins settings.
 *
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *
 * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
 * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
 * @throws \Drupal\Core\Entity\EntityStorageException
 */
function _display_fields_form_field_ui_create_display_fields_submit($form, FormStateInterface $form_state) {
  $plugin_id = $form['display_fields']['create']['plugin_id']['#value'];
  // Get the entity_type, bundle and view mode.
  $entity_type = $form['#entity_type'];
  $bundle = $form['#bundle'];
  $plugin = DisplayFields::getDisplayFieldsField($plugin_id, $entity_type, $bundle);
  $plugin->createFormSubmit($form, $form_state, [
    'display_fields',
    'create',
    'plugin_form',
  ]);

  $values = $form_state->getValue(['display_fields', 'create']);

  // Try to load the existing config for this entity_type / bundle
  $display_fields_config = DisplayFields::getDisplayFields($entity_type, $bundle);

  $display_fields = $display_fields_config->get('display_fields');

  $display_fields[$values['display_field_machine_name']] = [
    'field_name' => $values['display_field_machine_name'],
    'label' => $values['display_field_name'],
    'plugin_id' => $plugin_id,
    'settings' => $values['plugin_form'],
  ];

  $display_fields_config->set('display_fields', $display_fields);
  $display_fields_config->set('id', "$entity_type.$bundle");
  $display_fields_config->set('label', "$entity_type $bundle");

  $display_fields_config->save();
}

/**
 * Element validate callback for machine_name Element ($value already exists ?).
 */
function _display_fields_field_machine_name_exists($value, $element, $form_state) {
  $entity_type = $form_state->get('entity_type');
  $bundle = $form_state->get('bundle');
  // Try to load the existing config for this entity_type / bundle
  $display_fields_config = DisplayFields::getDisplayFields($entity_type, $bundle);
  $display_fields = $display_fields_config->get('display_fields');
  return isset($display_fields[$value]);
}

/**
 * Ajax callback for the display fields vertical tab UI (creation of
 * DisplayFields).
 */
function _display_fields_form_field_ui_create_display_fields_callback($form, FormStateInterface $form_state) {
  return $form['display_fields']['create'];
}

/**
 * Create or merge vertical tabs.
 */
function _display_fields_form_field_ui_create_vertical_tabs(&$form) {
  // Add additional settings vertical tab.
  if (!isset($form['additional_settings'])) {
    $form['additional_settings'] = [
      '#type' => 'vertical_tabs',
      '#theme_wrappers' => ['vertical_tabs'],
      '#prefix' => '<div>',
      '#suffix' => '</div>',
      '#tree' => TRUE,
    ];
  }

  // Add the view modes statuses settings to the vertical tabs, if exists.
  $view_mode_admin_access = \Drupal::currentUser()->hasPermission('admin_view_modes') && \Drupal::moduleHandler()->moduleExists('ds_ui');
  if (isset($form['modes'])) {
    $form['modes']['#group'] = 'additional_settings';
    $form['modes']['#weight'] = -10;
    if ($view_mode_admin_access) {
      $url = Url::fromRoute('field_ui.display_mode');
      $form['modes']['view_modes_custom']['#description'] = Link::fromTextAndUrl(t('Manage display modes'), $url);
    }
  }
}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc