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.
     */
    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.