diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php index 2260610..70aa871 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Formatter/FormatterPluginManager.php @@ -20,6 +20,13 @@ class FormatterPluginManager extends PluginManagerBase { /** + * An array of formatter options for each field type. + * + * @var array + */ + protected $formatterOptions; + + /** * Overrides Drupal\Component\Plugin\PluginManagerBase:$defaults. */ protected $defaults = array( @@ -125,4 +132,34 @@ public function prepareConfiguration($field_type, array $configuration) { return $configuration; } + /** + * Returns an array of formatter options for a field type. + * + * @param string|null $field_type + * (optional) The name of a field type, or NULL to retrieve all formatters. + * + * @return array + * If no field type is provided, returns a nested array of all formatters, + * keyed by field type. + */ + public function getFormatterOptions($field_type = NULL) { + if (!isset($this->formatterOptions)) { + $field_types = field_info_field_types(); + $options = array(); + foreach ($this->getDefinitions() as $name => $formatter) { + foreach ($formatter['field_types'] as $formatter_field_type) { + // Check that the field type exists. + if (isset($field_types[$formatter_field_type])) { + $options[$formatter_field_type][$name] = $formatter['label']; + } + } + } + $this->formatterOptions = $options; + } + if ($field_type) { + return !empty($this->formatterOptions[$field_type]) ? $this->formatterOptions[$field_type] : array(); + } + return $this->formatterOptions; + } + } diff --git a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php index c8ea1f9..247a496 100644 --- a/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php +++ b/core/modules/field/lib/Drupal/field/Plugin/Type/Widget/WidgetPluginManager.php @@ -19,6 +19,13 @@ class WidgetPluginManager extends PluginManagerBase { /** + * An array of widget options for each field type. + * + * @var array + */ + protected $widgetOptions; + + /** * Overrides Drupal\Component\Plugin\PluginManagerBase:$defaults. */ protected $defaults = array( @@ -71,4 +78,38 @@ public function getInstance(array $options) { return $this->createInstance($type, $configuration); } + /** + * Returns an array of widget type options for a field type. + * + * @param string|null $field_type + * (optional) The name of a field type, or NULL to retrieve all widget + * options. Defaults to NULL. + * + * @return array + * If no field type is provided, returns a nested array of all widget types, + * keyed by field type human name. + */ + public function getWidgetOptions($field_type = NULL) { + if (!isset($this->widgetOptions)) { + $options = array(); + $field_types = field_info_field_types(); + $widget_types = $this->getDefinitions(); + uasort($widget_types, 'drupal_sort_weight'); + foreach ($widget_types as $name => $widget_type) { + foreach ($widget_type['field_types'] as $widget_field_type) { + // Check that the field type exists. + if (isset($field_types[$widget_field_type])) { + $options[$widget_field_type][$name] = $widget_type['label']; + } + } + } + $this->widgetOptions = $options; + } + if (isset($field_type)) { + return !empty($this->widgetOptions[$field_type]) ? $this->widgetOptions[$field_type] : array(); + } + + return $this->widgetOptions; + } + } diff --git a/core/modules/field_ui/field_ui.admin.inc b/core/modules/field_ui/field_ui.admin.inc index e419063..58aee91 100644 --- a/core/modules/field_ui/field_ui.admin.inc +++ b/core/modules/field_ui/field_ui.admin.inc @@ -58,27 +58,6 @@ function field_ui_fields_list() { } /** - * Displays a message listing the inactive fields of a given bundle. - */ -function field_ui_inactive_message($entity_type, $bundle) { - $inactive_instances = field_ui_inactive_instances($entity_type, $bundle); - if (!empty($inactive_instances)) { - $field_types = field_info_field_types(); - - foreach ($inactive_instances as $field_name => $instance) { - $field = field_info_field($instance['field_name']); - $list[] = t('%field (@field_name) field requires the %field_type field type provided by %field_type_module module', array( - '%field' => $instance['label'], - '@field_name' => $instance['field_name'], - '%field_type' => isset($field_types[$field['type']]) ? $field_types[$field['type']]['label'] : $field['type'], - '%field_type_module' => $field['module'], - )); - } - drupal_set_message(t('Inactive fields are not shown unless their providing modules are enabled. The following fields are not enabled: !list', array('!list' => theme('item_list', array('items' => $list)))), 'error'); - } -} - -/** * Determines the rendering order of an array representing a tree. * * Callback for array_reduce() within field_ui_table_pre_render(). @@ -96,40 +75,6 @@ function _field_ui_reduce_order($array, $a) { } /** - * Returns the region to which a row in the 'Manage fields' screen belongs. - * - * This function is used as a #region_callback in - * Drupal\field_ui\DisplayOverview::form(). It is called during - * field_ui_table_pre_render(). - */ -function field_ui_field_overview_row_region($row) { - switch ($row['#row_type']) { - case 'field': - case 'extra_field': - return 'content'; - case 'add_new_field': - // If no input in 'label', assume the row has not been dragged out of the - // 'add new' section. - return (!empty($row['label']['#value']) ? 'content' : 'hidden'); - } -} - -/** - * Returns the region to which a row in the 'Manage display' screen belongs. - * - * This function is used as a #region_callback in - * Drupal\field_ui\FieldOverview::form(), and is called during - * field_ui_table_pre_render(). - */ -function field_ui_display_overview_row_region($row) { - switch ($row['#row_type']) { - case 'field': - case 'extra_field': - return ($row['format']['type']['#value'] == 'hidden' ? 'hidden' : 'content'); - } -} - -/** * Render API callback: Performs pre-render tasks on field_ui_table elements. * * This function is assigned as a #pre_render callback in @@ -162,8 +107,7 @@ function field_ui_table_pre_render($elements) { unset($list[$name]); // Determine the region for the row. - $function = $row['#region_callback']; - $region_name = $function($row); + $region_name = call_user_func($row['#region_callback'], $row); // Add the element in the tree. $target = &$trees[$region_name]['']; @@ -305,156 +249,3 @@ function _field_ui_field_name_exists($value) { // field_info_fields(). return (bool) field_read_fields(array('field_name' => $field_name), array('include_inactive' => TRUE)); } - -/** - * Returns an array of field_type options. - */ -function field_ui_field_type_options() { - $options = &drupal_static(__FUNCTION__); - - if (!isset($options)) { - $options = array(); - $field_types = field_info_field_types(); - $field_type_options = array(); - foreach ($field_types as $name => $field_type) { - // Skip field types which have no widget types, or should not be add via - // uesr interface. - if (field_ui_widget_type_options($name) && empty($field_type['no_ui'])) { - $options[$name] = $field_type['label']; - } - } - asort($options); - } - return $options; -} - -/** - * Returns an array of widget type options for a field type. - * - * If no field type is provided, returns a nested array of all widget types, - * keyed by field type human name. - */ -function field_ui_widget_type_options($field_type = NULL, $by_label = FALSE) { - $options = &drupal_static(__FUNCTION__); - - if (!isset($options)) { - $options = array(); - $field_types = field_info_field_types(); - $widget_types = field_info_widget_types(); - uasort($widget_types, 'drupal_sort_weight'); - foreach ($widget_types as $name => $widget_type) { - foreach ($widget_type['field_types'] as $widget_field_type) { - // Check that the field type exists. - if (isset($field_types[$widget_field_type])) { - $options[$widget_field_type][$name] = $widget_type['label']; - } - } - } - } - - if (isset($field_type)) { - return !empty($options[$field_type]) ? $options[$field_type] : array(); - } - if ($by_label) { - $field_types = field_info_field_types(); - $options_by_label = array(); - foreach ($options as $field_type => $widgets) { - $options_by_label[$field_types[$field_type]['label']] = $widgets; - } - return $options_by_label; - } - return $options; -} - -/** - * Returns an array of formatter options for a field type. - * - * If no field type is provided, returns a nested array of all formatters, keyed - * by field type. - */ -function field_ui_formatter_options($field_type = NULL) { - $options = &drupal_static(__FUNCTION__); - - if (!isset($options)) { - $field_types = field_info_field_types(); - $options = array(); - foreach (field_info_formatter_types() as $name => $formatter) { - foreach ($formatter['field_types'] as $formatter_field_type) { - // Check that the field type exists. - if (isset($field_types[$formatter_field_type])) { - $options[$formatter_field_type][$name] = $formatter['label']; - } - } - } - } - - if ($field_type) { - return !empty($options[$field_type]) ? $options[$field_type] : array(); - } - return $options; -} - -/** - * Returns an array of existing fields to be added to a bundle. - */ -function field_ui_existing_field_options($entity_type, $bundle) { - $info = array(); - $field_types = field_info_field_types(); - - foreach (field_info_instances() as $existing_entity_type => $bundles) { - foreach ($bundles as $existing_bundle => $instances) { - // No need to look in the current bundle. - if (!($existing_bundle == $bundle && $existing_entity_type == $entity_type)) { - foreach ($instances as $instance) { - $field = field_info_field($instance['field_name']); - // Don't show - // - locked fields, - // - fields already in the current bundle, - // - fields that cannot be added to the entity type, - // - fields that should not be added via user interface. - - if (empty($field['locked']) - && !field_info_instance($entity_type, $field['field_name'], $bundle) - && (empty($field['entity_types']) || in_array($entity_type, $field['entity_types'])) - && empty($field_types[$field['type']]['no_ui'])) { - $info[$instance['field_name']] = array( - 'type' => $field['type'], - 'type_label' => $field_types[$field['type']]['label'], - 'field' => $field['field_name'], - 'label' => $instance['label'], - 'widget_type' => $instance['widget']['type'], - ); - } - } - } - } - } - return $info; -} - -/** - * Extracts next redirect path from an array of multiple destinations. - * - * @see field_ui_next_destination() - */ -function field_ui_get_destinations($destinations) { - $path = array_shift($destinations); - $options = drupal_parse_url($path); - if ($destinations) { - $options['query']['destinations'] = $destinations; - } - return array($options['path'], $options); -} - -/** - * Returns the next redirect path in a multipage sequence. - */ -function field_ui_next_destination($entity_type, $bundle) { - $destinations = !empty($_REQUEST['destinations']) ? $_REQUEST['destinations'] : array(); - if (!empty($destinations)) { - unset($_REQUEST['destinations']); - return field_ui_get_destinations($destinations); - } - $admin_path = Drupal::entityManager()->getAdminPath($entity_type, $bundle); - return $admin_path . '/fields'; -} diff --git a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php index cf4f6de..a1391b4 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/DisplayOverview.php @@ -8,6 +8,9 @@ namespace Drupal\field_ui; use Drupal\field_ui\OverviewBase; +use Drupal\Core\Entity\EntityManager; +use Drupal\field\Plugin\Type\Formatter\FormatterPluginManager; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Field UI display overview form. @@ -15,6 +18,37 @@ class DisplayOverview extends OverviewBase { /** + * The formatter plugin manager. + * + * @var \Drupal\field\Plugin\Type\Formatter\FormatterPluginManager + */ + protected $formatterManager; + + /** + * Constructs a new DisplayOverview. + * + * @param \Drupal\Core\Entity\EntityManager $entity_manager + * The entity manager. + * @param \Drupal\field\Plugin\Type\Formatter\FormatterPluginManager $formatter_manager + * The formatter plugin manager. + */ + public function __construct(EntityManager $entity_manager, FormatterPluginManager $formatter_manager) { + parent::__construct($entity_manager); + + $this->formatterManager = $formatter_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.entity'), + $container->get('plugin.manager.field.formatter') + ); + } + + /** * Implements Drupal\field_ui\OverviewBase::getRegions(). */ public function getRegions() { @@ -107,7 +141,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')), '#row_type' => 'field', - '#region_callback' => 'field_ui_display_overview_row_region', + '#region_callback' => array($this, 'getRowRegion'), '#js_settings' => array( 'rowHandler' => 'field', 'defaultFormatter' => $field_types[$field['type']]['default_formatter'], @@ -148,7 +182,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, ), ); - $formatter_options = field_ui_formatter_options($field['type']); + $formatter_options = $this->formatterManager->getFormatterOptions($field['type']); $formatter_options['hidden'] = '<' . t('Hidden') . '>'; $table[$name]['format'] = array( 'type' => array( @@ -174,7 +208,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, // Get the corresponding formatter object. if ($display_options && $display_options['type'] != 'hidden') { - $formatter = drupal_container()->get('plugin.manager.field.formatter')->getInstance(array( + $formatter = $this->formatterManager->getInstance(array( 'instance' => $instance, 'view_mode' => $this->view_mode, 'configuration' => $display_options @@ -294,7 +328,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')), '#row_type' => 'extra_field', - '#region_callback' => 'field_ui_display_overview_row_region', + '#region_callback' => array($this, 'getRowRegion'), '#js_settings' => array('rowHandler' => 'field'), 'human_name' => array( '#markup' => check_plain($extra_field['label']), @@ -576,4 +610,16 @@ public function multistepAjax($form, &$form_state) { // Return the whole table. return $form['fields']; } + + /** + * {@inheritdoc} + */ + public function getRowRegion($row) { + switch ($row['#row_type']) { + case 'field': + case 'extra_field': + return ($row['format']['type']['#value'] == 'hidden' ? 'hidden' : 'content'); + } + } + } diff --git a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php index f02e2eb..bf0c3a3 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/FieldOverview.php @@ -8,6 +8,9 @@ namespace Drupal\field_ui; use Drupal\field_ui\OverviewBase; +use Drupal\Core\Entity\EntityManager; +use Drupal\field\Plugin\Type\Widget\WidgetPluginManager; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Field UI field overview form. @@ -15,6 +18,37 @@ class FieldOverview extends OverviewBase { /** + * The widget plugin manager. + * + * @var \Drupal\field\Plugin\Type\Widget\WidgetPluginManager + */ + protected $widgetManager; + + /** + * Constructs a new DisplayOverview. + * + * @param \Drupal\Core\Entity\EntityManager $entity_manager + * The entity manager. + * @param \Drupal\field\Plugin\Type\Widget\WidgetPluginManager $widget_manager + * The widget plugin manager. + */ + public function __construct(EntityManager $entity_manager, WidgetPluginManager $widget_manager) { + parent::__construct($entity_manager); + + $this->widgetManager = $widget_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.entity'), + $container->get('plugin.manager.field.widget') + ); + } + + /** * Implements Drupal\field_ui\OverviewBase::getRegions(). */ public function getRegions() { @@ -91,7 +125,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')), '#row_type' => 'field', - '#region_callback' => 'field_ui_field_overview_row_region', + '#region_callback' => array($this, 'getRowRegion'), 'label' => array( '#markup' => check_plain($instance['label']), ), @@ -163,7 +197,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf')), '#row_type' => 'extra_field', - '#region_callback' => 'field_ui_field_overview_row_region', + '#region_callback' => array($this, 'getRowRegion'), 'label' => array( '#markup' => check_plain($extra_field['label']), ), @@ -206,14 +240,31 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, // Additional row: add new field. $max_weight = field_info_max_weight($this->entity_type, $this->bundle, 'form'); - $field_type_options = field_ui_field_type_options(); - $widget_type_options = field_ui_widget_type_options(NULL, TRUE); + $widget_options = $this->widgetManager->getWidgetOptions(); + + // Gather valid field types. + $field_type_options = array(); + foreach ($field_types as $name => $field_type) { + // Skip field types which have no widget types, or should not be add via + // uesr interface. + if (isset($widget_options[$name]) && empty($field_type['no_ui'])) { + $field_type_options[$name] = $field_type['label']; + } + } + asort($field_type_options); + + // Prepare the widget types to be display as options. + $widget_type_options = array(); + foreach ($widget_options as $field_type => $widgets) { + $widget_type_options[$field_types[$field_type]['label']] = $widgets; + } + if ($field_type_options && $widget_type_options) { $name = '_add_new_field'; $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf', 'add-new')), '#row_type' => 'add_new_field', - '#region_callback' => 'field_ui_field_overview_row_region', + '#region_callback' => array($this, 'getRowRegion'), 'label' => array( '#type' => 'textfield', '#title' => t('New field label'), @@ -300,7 +351,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, } // Additional row: re-use existing field. - $existing_fields = field_ui_existing_field_options($this->entity_type, $this->bundle); + $existing_fields = $this->getExistingFieldOptions(); if ($existing_fields && $widget_type_options) { // Build list of options. $existing_field_options = array(); @@ -317,7 +368,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $table[$name] = array( '#attributes' => array('class' => array('draggable', 'tabledrag-leaf', 'add-new')), '#row_type' => 'add_new_field', - '#region_callback' => 'field_ui_field_overview_row_region', + '#region_callback' => array($this, 'getRowRegion'), 'label' => array( '#type' => 'textfield', '#title' => t('Existing field label'), @@ -402,7 +453,7 @@ public function buildForm(array $form, array &$form_state, $entity_type = NULL, $form['#attached']['js'][] = array( 'type' => 'setting', - 'data' => array('fields' => $js_fields, 'fieldWidgetTypes' => field_ui_widget_type_options()), + 'data' => array('fields' => $js_fields, 'fieldWidgetTypes' => $this->widgetManager->getWidgetOptions()), ); // Add tabledrag behavior. @@ -464,7 +515,7 @@ protected function validateAddNew(array $form, array &$form_state) { } // Wrong widget type. elseif ($field['type']) { - $widget_types = field_ui_widget_type_options($field['type']); + $widget_types = $this->widgetManager->getWidgetOptions($field['type']); if (!isset($widget_types[$field['widget_type']])) { form_set_error('fields][_add_new_field][widget_type', t('Add new field: invalid widget.')); } @@ -507,7 +558,7 @@ protected function validateAddExisting(array $form, array &$form_state) { } // Wrong widget type. elseif ($field['field_name'] && ($existing_field = field_info_field($field['field_name']))) { - $widget_types = field_ui_widget_type_options($existing_field['type']); + $widget_types = $this->widgetManager->getWidgetOptions($existing_field['type']); if (!isset($widget_types[$field['widget_type']])) { form_set_error('fields][_add_existing_field][widget_type', t('Re-use existing field: invalid widget.')); } @@ -631,10 +682,71 @@ public function submitForm(array &$form, array &$form_state) { $destination = drupal_get_destination(); $destinations[] = $destination['destination']; unset($_GET['destination']); - $form_state['redirect'] = field_ui_get_destinations($destinations); + $path = array_shift($destinations); + $options = drupal_parse_url($path); + $options['query']['destinations'] = $destinations; + $form_state['redirect'] = array($options['path'], $options); } else { drupal_set_message(t('Your settings have been saved.')); } } + + /** + * {@inheritdoc} + */ + public function getRowRegion($row) { + switch ($row['#row_type']) { + case 'field': + case 'extra_field': + return 'content'; + case 'add_new_field': + // If no input in 'label', assume the row has not been dragged out of the + // 'add new' section. + return (!empty($row['label']['#value']) ? 'content' : 'hidden'); + } + } + + /** + * Returns an array of existing fields to be added to a bundle. + * + * @return array + * An array of existing fields keyed by field name. + */ + protected function getExistingFieldOptions() { + $info = array(); + $field_types = field_info_field_types(); + + foreach (field_info_instances() as $existing_entity_type => $bundles) { + foreach ($bundles as $existing_bundle => $instances) { + // No need to look in the current bundle. + if (!($existing_bundle == $this->bundle && $existing_entity_type == $this->entity_type)) { + foreach ($instances as $instance) { + $field = field_info_field($instance['field_name']); + // Don't show + // - locked fields, + // - fields already in the current bundle, + // - fields that cannot be added to the entity type, + // - fields that should not be added via user interface. + + if (empty($field['locked']) + && !field_info_instance($this->entity_type, $field['field_name'], $this->bundle) + && (empty($field['entity_types']) || in_array($this->entity_type, $field['entity_types'])) + && empty($field_types[$field['type']]['no_ui'])) { + $info[$instance['field_name']] = array( + 'type' => $field['type'], + 'type_label' => $field_types[$field['type']]['label'], + 'field' => $field['field_name'], + 'label' => $instance['label'], + 'widget_type' => $instance['widget']['type'], + ); + } + } + } + } + } + + return $info; + } + } diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php index ec13c50..a35be7f 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php @@ -107,7 +107,7 @@ public function submitForm(array &$form, array &$form_state) { } $admin_path = $this->entityManager->getAdminPath($this->instance->entity_type, $this->instance->bundle); - $form_state['redirect'] = field_ui_get_destinations(array($admin_path . '/fields')); + $form_state['redirect'] = "$admin_path/fields"; // Fields are purged on cron. However field module prevents disabling modules // when field types they provided are used in a field until it is fully diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php index 8e8d890..1ff80ad 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldEditForm.php @@ -7,21 +7,13 @@ namespace Drupal\field_ui\Form; -use Drupal\Core\Form\FormInterface; -use Drupal\field\Plugin\Core\Entity\FieldInstance; +use Drupal\field\FieldInstanceInterface; use Drupal\field\Field; /** * Provides a form for the field settings edit page. */ -class FieldEditForm implements FormInterface { - - /** - * The field instance being edited. - * - * @var \Drupal\field\Plugin\Core\Entity\FieldInstance - */ - protected $instance; +class FieldEditForm extends FieldInstanceFormBase { /** * {@inheritdoc} @@ -33,8 +25,9 @@ public function getFormID() { /** * {@inheritdoc} */ - public function buildForm(array $form, array &$form_state, FieldInstance $field_instance = NULL) { - $this->instance = $form_state['instance'] = $field_instance; + public function buildForm(array $form, array &$form_state, FieldInstanceInterface $field_instance = NULL) { + parent::buildForm($form, $form_state, $field_instance); + $field = $this->instance->getField(); $form['#field'] = $field; @@ -128,7 +121,6 @@ public function validateForm(array &$form, array &$form_state) { * {@inheritdoc} */ public function submitForm(array &$form, array &$form_state) { - form_load_include($form_state, 'inc', 'field_ui', 'field_ui.admin'); $form_values = $form_state['values']; $field_values = $form_values['field']; @@ -152,7 +144,7 @@ public function submitForm(array &$form, array &$form_state) { try { $field->save(); drupal_set_message(t('Updated field %label field settings.', array('%label' => $this->instance->label()))); - $form_state['redirect'] = field_ui_next_destination($this->instance->entity_type, $this->instance->bundle); + $form_state['redirect'] = $this->getNextDestination(); } catch (Exception $e) { drupal_set_message(t('Attempt to update field %label failed: %message.', array('%label' => $this->instance->label(), '%message' => $e->getMessage())), 'error'); diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php index 4803701..d8cc38f 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceEditForm.php @@ -7,49 +7,12 @@ namespace Drupal\field_ui\Form; -use Drupal\Core\Form\FormInterface; -use Drupal\Core\ControllerInterface; -use Drupal\field\Plugin\Core\Entity\FieldInstance; -use Drupal\field\Plugin\Type\Widget\WidgetPluginManager; -use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\field\FieldInstanceInterface; /** * Provides a form for the field instance settings form. */ -class FieldInstanceEditForm implements FormInterface, ControllerInterface { - - /** - * The field instance being edited. - * - * @var \Drupal\field\Plugin\Core\Entity\FieldInstance - */ - protected $instance; - - /** - * The field widget plugin manager. - * - * @var \Drupal\field\Plugin\Type\Widget\WidgetPluginManager - */ - protected $widgetManager; - - /** - * Constructs a new FieldInstanceEditForm object. - * - * @param \Drupal\field\Plugin\Type\Widget\WidgetPluginManager $widget_manager - * The field widget plugin manager. - */ - public function __construct(WidgetPluginManager $widget_manager) { - $this->widgetManager = $widget_manager; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('plugin.manager.field.widget') - ); - } +class FieldInstanceEditForm extends FieldInstanceFormBase { /** * {@inheritdoc} @@ -61,8 +24,8 @@ public function getFormID() { /** * {@inheritdoc} */ - public function buildForm(array $form, array &$form_state, FieldInstance $field_instance = NULL) { - $this->instance = $form_state['instance'] = $field_instance; + public function buildForm(array $form, array &$form_state, FieldInstanceInterface $field_instance = NULL) { + parent::buildForm($form, $form_state, $field_instance); $bundle = $this->instance['bundle']; $entity_type = $this->instance['entity_type']; @@ -216,7 +179,6 @@ public function validateForm(array &$form, array &$form_state) { * {@inheritdoc} */ public function submitForm(array &$form, array &$form_state) { - form_load_include($form_state, 'inc', 'field_ui', 'field_ui.admin'); $field = $form['#field']; $entity = $form['#entity']; @@ -243,7 +205,7 @@ public function submitForm(array &$form, array &$form_state) { drupal_set_message(t('Field %label is required and uses the "hidden" widget. You might want to configure a default value.', array('%label' => $this->instance['label'])), 'warning'); } - $form_state['redirect'] = field_ui_next_destination($this->instance['entity_type'], $this->instance['bundle']); + $form_state['redirect'] = $this->getNextDestination(); } /** diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceFormBase.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceFormBase.php new file mode 100644 index 0000000..a967781 --- /dev/null +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldInstanceFormBase.php @@ -0,0 +1,92 @@ +entityManager = $entity_manager; + $this->widgetManager = $widget_manager; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('plugin.manager.entity'), + $container->get('plugin.manager.field.widget') + ); + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, array &$form_state, FieldInstanceInterface $field_instance = NULL) { + $this->instance = $form_state['instance'] = $field_instance; + form_load_include($form_state, 'inc', 'field_ui', 'field_ui.admin'); + } + + /** + * Returns the next redirect path in a multipage sequence. + * + * @return string|array + * Either the next path, or an array of redirect paths. + */ + protected function getNextDestination() { + $destinations = !empty($_REQUEST['destinations']) ? $_REQUEST['destinations'] : array(); + if (!empty($destinations)) { + unset($_REQUEST['destinations']); + $path = array_shift($destinations); + $options = drupal_parse_url($path); + if ($destinations) { + $options['query']['destinations'] = $destinations; + } + return array($options['path'], $options); + } + $admin_path = $this->entityManager->getAdminPath($this->instance->entity_type, $this->instance->bundle); + return $admin_path . '/fields'; + } + +} diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php index b28083a..18a9245 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldWidgetTypeForm.php @@ -7,49 +7,12 @@ namespace Drupal\field_ui\Form; -use Drupal\Core\Form\FormInterface; -use Drupal\Core\ControllerInterface; -use Drupal\field\Plugin\Core\Entity\FieldInstance; -use Drupal\field\Plugin\Type\Widget\WidgetPluginManager; -use Symfony\Component\DependencyInjection\ContainerInterface; +use Drupal\field\FieldInstanceInterface; /** * Provides a form for the widget selection form. */ -class FieldWidgetTypeForm implements FormInterface, ControllerInterface { - - /** - * The field instance being edited. - * - * @var \Drupal\field\Plugin\Core\Entity\FieldInstance - */ - protected $instance; - - /** - * The field widget plugin manager. - * - * @var \Drupal\field\Plugin\Type\Widget\WidgetPluginManager - */ - protected $widgetManager; - - /** - * Constructs a new FieldWidgetTypeForm object. - * - * @param \Drupal\field\Plugin\Type\Widget\WidgetPluginManager $widget_manager - * The field widget plugin manager. - */ - public function __construct(WidgetPluginManager $widget_manager) { - $this->widgetManager = $widget_manager; - } - - /** - * {@inheritdoc} - */ - public static function create(ContainerInterface $container) { - return new static( - $container->get('plugin.manager.field.widget') - ); - } +class FieldWidgetTypeForm extends FieldInstanceFormBase { /** * {@inheritdoc} @@ -61,9 +24,9 @@ public function getFormID() { /** * {@inheritdoc} */ - public function buildForm(array $form, array &$form_state, FieldInstance $field_instance = NULL) { - $this->instance = $form_state['instance'] = $field_instance; - form_load_include($form_state, 'inc', 'field_ui', 'field_ui.admin'); + public function buildForm(array $form, array &$form_state, FieldInstanceInterface $field_instance = NULL) { + parent::buildForm($form, $form_state, $field_instance); + drupal_set_title($this->instance['label']); $bundle = $this->instance['bundle']; @@ -84,7 +47,7 @@ public function buildForm(array $form, array &$form_state, FieldInstance $field_ '#type' => 'select', '#title' => t('Widget type'), '#required' => TRUE, - '#options' => field_ui_widget_type_options($field['type']), + '#options' => $this->widgetManager->getWidgetOptions($field['type']), '#default_value' => $this->instance->getWidget()->getPluginId(), '#description' => t('The type of form element you would like to present to the user when creating this field in the %type type.', array('%type' => $bundle_label)), ); @@ -132,7 +95,7 @@ public function submitForm(array &$form, array &$form_state) { drupal_set_message(t('There was a problem changing the widget for field %label.', array('%label' => $instance['label'])), 'error'); } - $form_state['redirect'] = field_ui_next_destination($entity_type, $bundle); + $form_state['redirect'] = $this->getNextDestination(); } } diff --git a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php index a8cd891..e576d5d 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/OverviewBase.php @@ -130,4 +130,13 @@ public function getRegionOptions() { return $options; } + /** + * Returns the region to which a row in the overview screen belongs. + * + * This function is to be used as a #region_callback in + * \Drupal\field_ui\Form\OverviewBase::form(), and is called during + * field_ui_table_pre_render(). + */ + abstract public function getRowRegion($row); + }