/** * {@inheritdoc} */ protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state) { $form_values = $form_state->getValues(); if ($this->entity instanceof EntityWithPluginCollectionInterface) { // Do not manually update values represented by plugin collections. $form_values = array_diff_key($form_values, $this->entity->getPluginCollections()); } // Collect data for 'regular' fields. foreach ($form['#fields'] as $field_name) { // Retrieve the stored field settings to merge with the incoming // values. $values = $form_values['fields'][$field_name]; if ($values['type'] == 'hidden') { $entity->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 = array(); if (isset($values['settings_edit_form']['settings'])) { $settings = $values['settings_edit_form']['settings']; } elseif (isset($plugin_settings[$field_name]['settings'])) { $settings = $plugin_settings[$field_name]['settings']; } elseif ($current_options = $entity->getComponent($field_name)) { $settings = $current_options['settings']; } $third_party_settings = array(); if (isset($values['settings_edit_form']['third_party_settings'])) { $third_party_settings = $values['settings_edit_form']['third_party_settings']; } elseif (isset($plugin_settings[$field_name]['third_party_settings'])) { $third_party_settings = $plugin_settings[$field_name]['third_party_settings']; } elseif (($current_options = $entity->getComponent($field_name)) && isset($current_options['third_party_settings'])) { $third_party_settings = $current_options['third_party_settings']; } // Only save settings actually used by the selected plugin. $default_settings = $this->pluginManager->getDefaultSettings($values['type']); $settings = array_intersect_key($settings, $default_settings); // Default component values. $component_values = array('type' => $values['type'], 'weight' => $values['weight'], 'settings' => $settings, 'third_party_settings' => $third_party_settings); // Only formatters have configurable label visibility. if (isset($values['label'])) { $component_values['label'] = $values['label']; } $entity->setComponent($field_name, $component_values); } } // Collect data for 'extra' fields. foreach ($form['#extra'] as $name) { if ($form_values['fields'][$name]['type'] == 'hidden') { $entity->removeComponent($name); } else { $entity->setComponent($name, array('weight' => $form_values['fields'][$name]['weight'])); } } }
/** * {@inheritdoc} */ protected function copyFormValuesToEntity(EntityInterface $entity, array $form, FormStateInterface $form_state) { $form_values = $form_state->getValues(); if ($this->entity instanceof EntityWithPluginCollectionInterface) { // Do not manually update values represented by plugin collections. $form_values = array_diff_key($form_values, $this->entity->getPluginCollections()); } // Collect data for 'regular' fields. foreach ($form['#fields'] as $field_name) { $values = $form_values['fields'][$field_name]; if ($values['type'] == 'hidden') { $entity->removeComponent($field_name); } else { $options = $entity->getComponent($field_name); // Update field settings only if the submit handler told us to. if ($form_state->get('plugin_settings_update') === $field_name) { // Only store settings actually used by the selected plugin. $default_settings = $this->pluginManager->getDefaultSettings($options['type']); $options['settings'] = isset($values['settings_edit_form']['settings']) ? array_intersect_key($values['settings_edit_form']['settings'], $default_settings) : []; $options['third_party_settings'] = isset($values['settings_edit_form']['third_party_settings']) ? $values['settings_edit_form']['third_party_settings'] : []; $form_state->set('plugin_settings_update', NULL); } $options['type'] = $values['type']; $options['weight'] = $values['weight']; // Only formatters have configurable label visibility. if (isset($values['label'])) { $options['label'] = $values['label']; } $entity->setComponent($field_name, $options); } } // Collect data for 'extra' fields. foreach ($form['#extra'] as $name) { if ($form_values['fields'][$name]['type'] == 'hidden') { $entity->removeComponent($name); } else { $entity->setComponent($name, array('weight' => $form_values['fields'][$name]['weight'])); } } }
/** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $form_values = $form_state->getValues(); $display = $this->getEntityDisplay($this->mode); // Collect data for 'regular' fields. foreach ($form['#fields'] as $field_name) { // Retrieve the stored field settings to merge with the incoming // values. $values = $form_values['fields'][$field_name]; if ($values['type'] == 'hidden') { $display->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 = array(); if (isset($values['settings_edit_form']['settings'])) { $settings = $values['settings_edit_form']['settings']; } elseif (isset($plugin_settings[$field_name]['settings'])) { $settings = $plugin_settings[$field_name]['settings']; } elseif ($current_options = $display->getComponent($field_name)) { $settings = $current_options['settings']; } $third_party_settings = array(); if (isset($values['settings_edit_form']['third_party_settings'])) { $third_party_settings = $values['settings_edit_form']['third_party_settings']; } elseif (isset($plugin_settings[$field_name]['third_party_settings'])) { $third_party_settings = $plugin_settings[$field_name]['third_party_settings']; } elseif (($current_options = $display->getComponent($field_name)) && isset($current_options['third_party_settings'])) { $third_party_settings = $current_options['third_party_settings']; } // Only save settings actually used by the selected plugin. $default_settings = $this->pluginManager->getDefaultSettings($values['type']); $settings = array_intersect_key($settings, $default_settings); // Default component values. $component_values = array('type' => $values['type'], 'weight' => $values['weight'], 'settings' => $settings, 'third_party_settings' => $third_party_settings); // Only formatters have configurable label visibility. if (isset($values['label'])) { $component_values['label'] = $values['label']; } $display->setComponent($field_name, $component_values); } } // 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 'display modes' checkboxes if present. if ($this->mode == 'default' && !empty($form_values['display_modes_custom'])) { $display_modes = $this->getDisplayModes(); $current_statuses = $this->getDisplayStatuses(); $statuses = array(); foreach ($form_values['display_modes_custom'] as $mode => $value) { if (!empty($value) && empty($current_statuses[$mode])) { // 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($this->getEntityDisplay('default')->getEntityTypeId(), $this->entity_type . '.' . $this->bundle . '.' . $mode)) { $display = $this->getEntityDisplay('default')->createCopy($mode); $display->save(); } $display_mode_label = $display_modes[$mode]['label']; $url = $this->getOverviewRoute($mode); drupal_set_message($this->t('The %display_mode mode now uses custom display settings. You might want to <a href="@url">configure them</a>.', ['%display_mode' => $display_mode_label, '@url' => $url->toString()])); } $statuses[$mode] = !empty($value); } $this->saveDisplayStatuses($statuses); } drupal_set_message($this->t('Your settings have been saved.')); }