function RecipeInputFormTrait::buildRecipeInputForm

Generates a tree of form elements for a recipe's inputs.

Parameters

\Drupal\Core\Recipe\Recipe $recipe: A recipe.

Return value

array[] A nested array of form elements for collecting input values for the given recipe and its dependencies. The elements will be grouped by the recipe that defined the input -- for example, $return['recipe_name']['input1'], $return['recipe_name']['input2'], $return['dependency']['input_name'], and so forth. The returned array will have the `#tree` property set to TRUE.

1 call to RecipeInputFormTrait::buildRecipeInputForm()
FormTestRecipeInputForm::buildForm in core/modules/system/tests/modules/form_test/src/Form/FormTestRecipeInputForm.php
Form constructor.

File

core/lib/Drupal/Core/Recipe/RecipeInputFormTrait.php, line 32

Class

RecipeInputFormTrait
Defines helper methods for forms which collect input on behalf of recipes.

Namespace

Drupal\Core\Recipe

Code

protected function buildRecipeInputForm(Recipe $recipe) : array {
    $collector = new class  implements InputCollectorInterface {
        
        /**
         * A form array containing the input elements for the given recipe.
         *
         * This will be a tree of input elements, grouped by the name of the
         * recipe that defines them. For example:
         *
         * @code
         * $form = [
         *   'recipe_1' => [
         *     'input_1' => [
         *       '#type' => 'textfield',
         *       '#title' => 'Some input value',
         *     ],
         *     'input_2' => [
         *       '#type' => 'checkbox',
         *       '#title' => 'Enable some feature or other?',
         *     ],
         *   ],
         *   'dependency_recipe' => [
         *     'input_1' => [
         *       '#type' => 'textarea',
         *       '#title' => 'An input defined by a dependency of recipe_1',
         *     ],
         *   ],
         *   '#tree' => TRUE,
         * ];
         * @endcode
         *
         * The `#tree` property will always be set to TRUE.
         *
         * @var array
         */
        // phpcs:ignore DrupalPractice.CodeAnalysis.VariableAnalysis.UnusedVariable
        public array $form = [];
        
        /**
         * {@inheritdoc}
         */
        public function collectValue(string $name, DataDefinitionInterface $definition, mixed $default_value) : mixed {
            $element = $definition->getSetting('form');
            if ($element) {
                $element += [
                    '#description' => $definition->getDescription(),
                    '#default_value' => $default_value,
                    '#type' => 'value',
                ];
                // Recipe inputs are required by default, unless they are single
                // checkboxes, in which case the `#required` behavior doesn't make
                // a lot of sense because it forces the user to check the box.
                $element['#required'] ??= $element['#type'] !== 'checkbox';
                NestedArray::setValue($this->form, explode('.', $name, 2), $element);
                // Always return the input elements as a tree.
                $this->form['#tree'] = TRUE;
            }
            return $default_value;
        }

};
    $recipe->input
        ->collectAll($collector);
    return $collector->form;
}

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