From 7ca30bf8fdabaf922b47b0cf76a5bea1da385421 Mon Sep 17 00:00:00 2001
From: Geek Merlin <merlin@geeks4change.net>
Date: Wed, 16 Apr 2025 16:25:05 +0200
Subject: [PATCH 1/2] Fix field form for D11 #3519507

---
 list_predefined_options.module | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/list_predefined_options.module b/list_predefined_options.module
index e6cae8e..48c21f6 100644
--- a/list_predefined_options.module
+++ b/list_predefined_options.module
@@ -10,8 +10,20 @@ use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 
+/**
+ * Implements hook_form_FORM_ID_alter(): field_config_edit_form.
+ *
+ * For core >=11.x.
+ */
+function list_predefined_options_form_field_config_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
+  $subform =& $form['field_storage']['subform'];
+  list_predefined_options_form_field_storage_config_edit_form_alter($subform, $form_state, $form_id);
+}
+
 /**
  * Implements hook_form_FORM_ID_alter(): field_storage_config_edit_form.
+ *
+ * For core <10/11.x.
  */
 function list_predefined_options_form_field_storage_config_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
   /** @var \Drupal\Core\Field\FieldConfigInterface $field */
-- 
GitLab


From a066b178759a9811a0a9988140884370b2cc129c Mon Sep 17 00:00:00 2001
From: Geek Merlin <merlin@geeks4change.net>
Date: Wed, 16 Apr 2025 18:23:58 +0200
Subject: [PATCH 2/2] Fix fieldStorageConfig handling

---
 list_predefined_options.module | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/list_predefined_options.module b/list_predefined_options.module
index 48c21f6..0fe9c2f 100644
--- a/list_predefined_options.module
+++ b/list_predefined_options.module
@@ -9,6 +9,7 @@ use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\FieldableEntityInterface;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\field\FieldStorageConfigInterface;
 
 /**
  * Implements hook_form_FORM_ID_alter(): field_config_edit_form.
@@ -17,7 +18,11 @@ use Drupal\Core\Field\FieldStorageDefinitionInterface;
  */
 function list_predefined_options_form_field_config_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
   $subform =& $form['field_storage']['subform'];
-  list_predefined_options_form_field_storage_config_edit_form_alter($subform, $form_state, $form_id);
+  /** @var \Drupal\field\FieldConfigInterface $fieldConfig */
+  $fieldConfig = $form_state->getFormObject()->getEntity();
+  /** @var \Drupal\field\FieldStorageConfigInterface $fieldStorageConfig */
+  $fieldStorageConfig = $fieldConfig->getFieldStorageDefinition();
+  _list_predefined_options_storage_form_alter($subform, $fieldStorageConfig);
 }
 
 /**
@@ -26,20 +31,24 @@ function list_predefined_options_form_field_config_edit_form_alter(&$form, FormS
  * For core <10/11.x.
  */
 function list_predefined_options_form_field_storage_config_edit_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  /** @var \Drupal\Core\Field\FieldConfigInterface $field */
-  $field = $form_state->getFormObject()->getEntity();
+  /** @var \Drupal\field\FieldStorageConfigInterface $fieldStorageConfig */
+  $fieldStorageConfig = $form_state->getFormObject()->getEntity();
+  _list_predefined_options_storage_form_alter($form, $fieldStorageConfig);
+}
 
+function _list_predefined_options_storage_form_alter(array &$form, FieldStorageConfigInterface $fieldStorageConfig): void {
   $field_types = [
     'list_float',
     'list_integer',
     'list_string',
   ];
 
-  if (in_array($field->getType(), $field_types)) {
-    $options = \Drupal::service('plugin.manager.list_options')->listOptions($field->getType());
+  if (in_array($fieldStorageConfig->getType(), $field_types)) {
+    $options = \Drupal::service('plugin.manager.list_options')
+      ->listOptions($fieldStorageConfig->getType());
     $options = ['' => t('Custom')] + $options;
 
-    $settings = $field->getThirdPartySettings('list_predefined_options');
+    $settings = $fieldStorageConfig->getThirdPartySettings('list_predefined_options');
     $form['list_predefined_options_plugin_id'] = [
       '#type' => 'select',
       '#title' => t('Allowed values'),
@@ -89,7 +98,7 @@ function list_predefined_options_form_field_storage_config_edit_form_alter(&$for
     // function, but by the time we get here, both the form state and the field
     // config entity see it as empty, probably because of our entity builder
     // having acted.
-    $allowed_values_function_setting = $field->getSetting('allowed_values_function');
+    $allowed_values_function_setting = $fieldStorageConfig->getSetting('allowed_values_function');
     if (empty($allowed_values_function_setting) || $allowed_values_function_setting == 'list_predefined_options_allowed_values') {
       $form['settings']['allowed_values']['#access'] = TRUE;
       $form['allowed_values_function']['#access'] = FALSE;
@@ -102,7 +111,7 @@ function list_predefined_options_form_field_storage_config_edit_form_alter(&$for
 /**
  * Entity builder callback to save our settings into the field storage config.
  */
-function list_predefined_options_form_field_storage_config_edit_form_builder($entity_type, $entity, &$form, FormStateInterface $form_state) {
+function list_predefined_options_form_field_storage_config_edit_form_builder($entity_type, FieldStorageConfigInterface $entity, &$form, FormStateInterface $form_state) {
   $plugin_id = $form_state->getValue('list_predefined_options_plugin_id');
   if (!empty($plugin_id)) {
     $entity->setThirdPartySetting('list_predefined_options', 'plugin_id', $plugin_id);
@@ -121,7 +130,7 @@ function list_predefined_options_form_field_storage_config_edit_form_builder($en
 /**
  * Implements hook_ENTITY_TYPE_presave(): field_storage_config
  */
-function list_predefined_options_field_storage_config_presave(EntityInterface $entity) {
+function list_predefined_options_field_storage_config_presave(FieldStorageConfigInterface $entity) {
   // Workaround for https://www.drupal.org/project/drupal/issues/3016895 -
   // though because of https://www.drupal.org/project/drupal/issues/3366218
   // this is currently pointless.
-- 
GitLab