NestedConfigTargetForm.php

Same filename and directory in other branches
  1. 10 core/modules/system/tests/modules/form_test/src/Form/NestedConfigTargetForm.php

Namespace

Drupal\form_test\Form

File

core/modules/system/tests/modules/form_test/src/Form/NestedConfigTargetForm.php

View source
<?php

namespace Drupal\form_test\Form;

use Drupal\Core\Form\ConfigTarget;
use Drupal\Core\Form\ToConfig;
use Drupal\Core\Form\FormStateInterface;

/**
 * Test form for testing config targets that are not 1:1.
 *
 * Note this is extending TreeConfigTargetForm to ensure that the presence of
 * both 1:1 config targets and ones that aren't work together in the same form.
 */
class NestedConfigTargetForm extends TreeConfigTargetForm {
    
    /**
     * {@inheritdoc}
     */
    protected function getEditableConfigNames() {
        return [
            'form_test.object',
        ];
    }
    
    /**
     * {@inheritdoc}
     */
    public function getFormId() {
        return 'form_test_nested_config_target_form';
    }
    
    /**
     * {@inheritdoc}
     */
    public function buildForm(array $form, FormStateInterface $form_state) {
        $form['favorites'] = [
            '#type' => 'details',
            '#open' => TRUE,
            '#tree' => TRUE,
            '#title' => 'Favorite fruits',
        ];
        $form['favorites']['first'] = [
            '#type' => 'textfield',
            '#title' => 'First choice',
            '#config_target' => new ConfigTarget('form_test.object', 'favorite_fruits', fromConfig: fn(?array $favorite_fruits): string => $favorite_fruits[0] ?? 'Mango', toConfig: fn(string $first, FormStateInterface $form_state): array => [
                0 => $first,
                1 => $form_state->getValue([
                    'favorites',
                    'second',
                ]),
            ]),
        ];
        $form['favorites']['second'] = [
            '#type' => 'textfield',
            '#title' => 'Second choice',
            '#config_target' => new ConfigTarget('form_test.object', 'favorite_fruits.1', fn(?string $second_favorite_fruit): string => $second_favorite_fruit ?? 'Orange', fn() => ToConfig::NoOp),
        ];
        $form['could_not_live_without'] = [
            '#weight' => 10,
            '#type' => 'textfield',
            '#title' => 'I could not live without',
            '#placeholder' => 'vegetables',
            '#wrapper_attributes' => [
                'class' => [
                    'container-inline',
                ],
            ],
            '#config_target' => new ConfigTarget('form_test.object', 'could_not_live_without', toConfig: function (string $could_not_live_without, FormStateInterface $form_state) : ToConfig|string {
                if (empty($form_state->getValue([
                    'favorites',
                    'first',
                ]))) {
                    return ToConfig::DeleteKey;
                }
                if (empty($form_state->getValue([
                    'favorites',
                    'second',
                ]))) {
                    return ToConfig::DeleteKey;
                }
                if (empty($form_state->getValue([
                    'vegetables',
                    'favorite',
                ]))) {
                    return ToConfig::DeleteKey;
                }
                if (empty($form_state->getValue([
                    'vegetables',
                    'nemesis',
                ]))) {
                    return ToConfig::DeleteKey;
                }
                return $could_not_live_without;
            }),
            // Only if everything else is answered will this be asked.
'#states' => [
                'visible' => [
                    // 2 favorite fruits.
':input[name="favorites[first]"]' => [
                        'empty' => FALSE,
                    ],
                    ':input[name="favorites[second]"]' => [
                        'empty' => FALSE,
                    ],
                    // Favorite & nemesis vegetable.
':input[name="vegetables[favorite]"]' => [
                        'empty' => FALSE,
                    ],
                    ':input[name="vegetables[nemesis]"]' => [
                        'empty' => FALSE,
                    ],
                ],
            ],
        ];
        return parent::buildForm($form, $form_state);
    }

}

Classes

Title Deprecated Summary
NestedConfigTargetForm Test form for testing config targets that are not 1:1.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.