public function DisplayOverview::submitForm

Overrides \Drupal\field_ui\OverviewBase::submitForm().

Overrides OverviewBase::submitForm

File

drupal/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php, line 450
Contains \Drupal\field_ui\DisplayOverview.

Class

DisplayOverview
Field UI display overview form.

Namespace

Drupal\field_ui

Code

public function submitForm(array &$form, array &$form_state) {
  $form_values = $form_state['values'];
  $display = entity_get_display($this->entity_type, $this->bundle, $this->mode);

  // Collect data for 'regular' fields.
  foreach ($form['#fields'] as $field_name) {

    // Retrieve the stored instance settings to merge with the incoming
    // values.
    $values = $form_values['fields'][$field_name];
    if ($values['type'] == 'hidden') {
      $display
        ->removeComponent($field_name);
    }
    else {

      // Get formatter settings. They lie either directly in submitted form
      // values (if the whole form was submitted while some formatter
      // settings were being edited), or have been persisted in $form_state.
      $settings = array();
      if (isset($values['settings_edit_form']['settings'])) {
        $settings = $values['settings_edit_form']['settings'];
      }
      elseif (isset($form_state['formatter_settings'][$field_name])) {
        $settings = $form_state['formatter_settings'][$field_name];
      }
      elseif ($current_options = $display
        ->getComponent($field_name)) {
        $settings = $current_options['settings'];
      }

      // Only save settings actually used by the selected formatter.
      $default_settings = field_info_formatter_settings($values['type']);
      $settings = array_intersect_key($settings, $default_settings);
      $display
        ->setComponent($field_name, array(
        'label' => $values['label'],
        'type' => $values['type'],
        'weight' => $values['weight'],
        'settings' => $settings,
      ));
    }
  }

  // Collect data for 'extra' fields.
  foreach ($form['#extra'] as $name) {
    if ($form_values['fields'][$name]['type'] == 'hidden') {
      $display
        ->removeComponent($name);
    }
    else {
      $display
        ->setComponent($name, array(
        'weight' => $form_values['fields'][$name]['weight'],
      ));
    }
  }

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

  // Handle the 'view modes' checkboxes if present.
  if ($this->mode == 'default' && !empty($form_values['view_modes_custom'])) {
    $entity_info = entity_get_info($this->entity_type);
    $view_modes = entity_get_view_modes($this->entity_type);
    $bundle_settings = field_bundle_settings($this->entity_type, $this->bundle);
    $view_mode_settings = field_view_mode_settings($this->entity_type, $this->bundle);
    foreach ($form_values['view_modes_custom'] as $view_mode => $value) {
      if (!empty($value) && empty($view_mode_settings[$view_mode]['status'])) {

        // If no display exists for the newly enabled view mode, initialize
        // it with those from the 'default' view mode, which were used so
        // far.
        if (!entity_load('entity_display', $this->entity_type . '.' . $this->bundle . '.' . $view_mode)) {
          $display = entity_get_display($this->entity_type, $this->bundle, 'default')
            ->createCopy($view_mode);
          $display
            ->save();
        }
        $view_mode_label = $view_modes[$view_mode]['label'];
        $path = $this->entityManager
          ->getAdminPath($this->entity_type, $this->bundle) . "/display/{$view_mode}";
        drupal_set_message(t('The %view_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', array(
          '%view_mode' => $view_mode_label,
          '@url' => url($path),
        )));
      }
      $bundle_settings['view_modes'][$view_mode]['status'] = !empty($value);
    }

    // Save updated bundle settings.
    field_bundle_settings($this->entity_type, $this->bundle, $bundle_settings);
  }
  drupal_set_message(t('Your settings have been saved.'));
}