In Drupal 8, Drupal 9 or Drupal 10 creating custom forms is a common task for developers. A useful feature is to include a select dropdown within a table row, allowing users to interact with the form elements in an organized manner. This blog post will guide you through the process of creating a custom form that includes a select dropdown rendered within a table.
Step-by-Step Guide
Step 1: Set Up Your Custom Module
First, create a custom module. For this example, we'll call it `custom_table_form`.
File Structure
custom_table_form/ - custom_table_form.info.yml - custom_table_form.module - src/ - Form/ - ExampleForm.php
Module Info File (`custom_table_form.info.yml`)
name: 'Custom Table Form' type: module description: 'A module that provides a custom form with a select dropdown rendered in a table.' core_version_requirement: ^8 || ^9 package: Custom dependencies: - drupal:system
Step 2: Implement the Custom Form
Next, create the form class that will build the form and handle form submissions.
Form Class (`src/Form/ExampleForm.php`)
```php <?php namespace Drupal\custom_table_form\Form; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; class ExampleForm extends FormBase { /** * {@inheritdoc} */ public function getFormId() { return 'custom_table_form_example_form'; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { // Define a sample list of items for demonstration. $items = [ ['id' => 1, 'name' => 'Item 1'], ['id' => 2, 'name' => 'Item 2'], ]; // Define the form table. $form['items'] = [ '#type' => 'table', '#header' => [ $this->t('Item'), $this->t('Current Status'), $this->t('Update Status'), ], '#empty' => $this->t('No items found.'), ]; // Add rows to the table. foreach ($items as $item) { $form['items'][$item['id']]['item'] = [ '#type' => 'markup', '#markup' => $item['name'], ]; $form['items'][$item['id']]['current_status'] = [ '#type' => 'markup', '#markup' => 'Active', // Example status, typically fetched from item data. ]; $form['items'][$item['id']]['update_status'] = [ '#type' => 'select', '#options' => [ 'active' => $this->t('Active'), 'inactive' => $this->t('Inactive'), ], '#default_value' => 'active', ]; } // Add a submit button to the form. $form['submit'] = [ '#type' => 'submit', '#value' => $this->t('Save'), ]; return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { // Handle form submission. $values = $form_state->getValue('items'); foreach ($values as $item_id => $item_data) { $new_status = $item_data['update_status']; \Drupal::messenger()->addMessage($this->t('Item ID @id has been updated to status: @status', ['@id' => $item_id, '@status' => $new_status])); } } } ```
Step 3: Define the Route
Now, define the route to access your form.
Routing File (`custom_table_form.routing.yml`)
custom_table_form.example_form: path: '/custom-table-form' defaults: _form: '\Drupal\custom_table_form\Form\ExampleForm' _title: 'Custom Table Form' requirements: _permission: 'access content'
Step 4: Enable the Module
Navigate to the Extend page (`/admin/modules`) in your Drupal site and enable the "Custom Table Form" module.
Step 5: Access the Form
Visit `/custom-table-form` in your browser. You should see the form with a table listing items and a select dropdown in each row to update the status.