I was able to add conditional fields in a paragraph, following Conditional Fields in Paragraphs Using the Javascript States API for Drupal 8, but it controls and hides only 1 field.
I need to control multiple fields from one select list. I added multiple fields to a variable and created a for loop. The select list has 3 options.
- 3row|3row
- 2row|2row
- 1row|1row
The following is the code for the custom module. When it runs, the last for
loop is the only one that works. The first 2 select list options don’t work. Do I need to add a field value check before each for loop? My module name is conditional_fields.
use DrupalnodeNodeInterface; use DrupalnodeNodeForm; use DrupalCoreFormFormStateInterface; use DrupalCoreEntityDisplayEntityViewDisplayInterface; use DrupalparagraphsParagraphInterface; use DrupalparagraphsPluginFieldFieldWidgetParagraphsWidget; use DrupalparagraphsEntityParagraph; /* * Implements hook_field_widget_form_alter(). */ function conditional_fields_field_widget_paragraphs_form_alter(&$element, DrupalCoreFormFormStateInterface $form_state, $context) { $field_definition = $context['items']->getFieldDefinition(); $paragraph_entity_reference_field_name = $field_definition->getName(); if ($paragraph_entity_reference_field_name == 'field_topic_paragraphs') { $widget_state = DrupalCoreFieldWidgetBase::getWidgetState($element['#field_parents'], $paragraph_entity_reference_field_name, $form_state); $paragraph_instance = $widget_state['paragraphs'][$element['#delta']]['entity']; $paragraph_type = $paragraph_instance->bundle(); if ($paragraph_type == 'teaser_content') { $dependee_field_name = 'field_paragraph_number_of_rows'; $selector = sprintf('select[name="%s[%d][subform][%s]"]', $paragraph_entity_reference_field_name, $element['#delta'], $dependee_field_name); $fields_to_control1 = ['field_description_col_5','field_link_col_5','field_description_col_6','field_link_col_6','field_description_col_7','field_link_col_7','field_description_col_8','field_link_col_8','field_description_col_9','field_link_col_9','field_description_col_10','field_link_col_10','field_description_col_11','field_link_col_11','field_description_col_12','field_link_col_12','field_description_col_13','field_link_col_13','field_description_col_14','field_link_col_14','field_description_col_15','field_link_col_15','field_description_col_16','field_link_col_16']; $fields_to_control2 = ['field_description_col_9','field_link_col_9','field_description_col_10','field_link_col_10','field_description_col_11','field_link_col_11','field_description_col_12','field_link_col_12','field_description_col_13','field_link_col_13','field_description_col_14','field_link_col_14','field_description_col_15','field_link_col_15','field_description_col_16','field_link_col_16']; $fields_to_control3 = ['field_description_col_13','field_link_col_13','field_description_col_14','field_link_col_14','field_description_col_15','field_link_col_15','field_description_col_16','field_link_col_16']; foreach ($fields_to_control3 as $field) { $element['subform'][$field]['#states'] = [ 'invisible' => [ $selector => ['value' => '3row'], ], ]; } foreach ($fields_to_control2 as $field){ $element['subform'][$field]['#states'] = [ 'invisible' => [ $selector => ['value' => '2row'], ], ]; } foreach ($fields_to_control1 as $field) { $element['subform'][$field]['#states'] = [ 'invisible' => [ $selector => ['value' => '1row'], ], ]; } unset($element['subform']['field_paragraph_number_of_rows']['widget']['#options']['_none']); $element['subform']['field_paragraph_number_of_rows']['widget']['#empty_option'] = t('- 4 Rows -'); } } }