---
url: 'https://metadrop.net/es/articulos/crear-lista-de-radio-button-con-elementos-de-formulario-intercalados'
title: 'Crear lista de radio button con elementos de formulario intercalados'
author: 'Ricardo Sanz'
date: '2017-01-17T10:12:09+00:00'
updated: '2026-08-04T08:12:05+00:00'
type: article
summary: 'Implementación de la Form API de Drupal para generar elementos de formulario anidados.'
tags:
  - 'Form API'
  - 'Radio Button'
  - 'Layout API'
image: 'https://metadrop.net/sites/default/files/styles/full/public/article/image/form_radios.png.webp?itok=fhx7aoAz'
published: true
og:
  determiner: Automatic
  site_name: Metadrop
  'image:url': 'https://metadrop.net/sites/default/files/styles/full/public/article/image/form_radios.png.webp?itok=fhx7aoAz'
  'image:type': image/png
  'image:width': '735'
  'image:height': '253'
  'image:alt': 'Crear lista de radio button con elementos de formulario intercalados'
  street_address: 'Calle Manuel Luna, 12, 3 Dcha'
  locality: Madrid
  region: Madrid
  postal_code: '28020'
  country_name: España
  email: hola@metadrop.net
  phone_number: '910053180'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      '@type': Article
      '@id': 'https://metadrop.net/es/articulos/crear-lista-de-radio-button-con-elementos-de-formulario-intercalados#article'
      name: 'Crear lista de radio button con elementos de formulario intercalados'
      headline: 'Crear lista de radio button con elementos de formulario intercalados'
      description: 'Implementación de la Form API de Drupal para generar elementos de formulario anidados.'
      about:
        - 'Form API'
        - 'Radio Button'
        - 'Layout API'
      image:
        '@type': ImageObject
        url: 'https://metadrop.net/sites/default/files/styles/full/public/article/image/form_radios.png.webp?itok=fhx7aoAz'
        width: '735'
        height: '253'
      datePublished: '2013-09-10T10:00:00+0200'
      dateModified: '2026-08-04T10:12:05+0200'
      author:
        '@type': Person
        name: 'Ricardo Sanz'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
      mainEntityOfPage: 'https://metadrop.net/es/articulos/crear-lista-de-radio-button-con-elementos-de-formulario-intercalados'
    -
      '@type': Organization
      '@id': 'https://metadrop.net/#organization'
      url: 'https://metadrop.net/'
      name: Metadrop
      sameAs:
        - 'https://www.drupal.org/metadrop'
        - 'https://twitter.com/metadrop'
        - 'https://asociaciondrupal.es/partner/metadrop'
        - 'https://www.linkedin.com/company/metadrop'
      logo:
        '@type': ImageObject
        url: 'https://metadrop.net/themes/custom/mdrop_radix/logo-metadrop-500-500.jpg'
        width: '500'
        height: '500'
    -
      '@type': ItemPage
      '@id': 'https://metadrop.net/es/articulos/crear-lista-de-radio-button-con-elementos-de-formulario-intercalados'
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Inicio
            item: 'https://metadrop.net/es'
          -
            '@type': ListItem
            position: 2
            name: 'Artículos expertos sobre Drupal y tecnología'
            item: 'https://metadrop.net/es/articulos'
      publisher:
        '@type': Organization
        '@id': 'https://metadrop.net/#organization'
---
 1. [Artículos](https://metadrop.net/es/articulos)
 
  

# Crear lista de radio button con elementos de formulario intercalados

Martes 10 de Septiembre de 2013

 

 



Implementación de la Form API de Drupal para generar elementos de formulario anidados.



   



Por ejemplo, se quiere una lista de radio buttons de este estilo:

```
 o Opción 1
    __________  (Examinar)    ◄---- opción de subir fichero en op 1

 o Opción 2
    __________________
    __________________
    __________________  ◄---- textarea para en op 2
    __________________
```

Se puede conseguir mediante el elemento radio, en vez de radios, y agrupándolos mediante la clave '#name':

```php
$form['contenedor']['opcion_radio_1'] = array(
'#type' => 'radio',
'#name' => 'radio_options',
'#title' => 'Texto de la opción 1',
'#return_value' => 'op1',
);

$form['contenedor']['file_upload_op1'] = array(
'#type' => 'file',
'#title' => 'Selecciona fichero',
);

$form['contenedor']['opcion_radio_2'] = array(
'#type' => 'radio',
'#name' => 'radio_options',
'#title' => 'Texto de la opción 2',
'#return_value' => 'op2',
'#default_value' => 'op2',
);

$form['contenedor']['textarea_op2'] = array(
'#type' => 'textarea',
'#description' => 'Texta area de opción 2',
);
```

El resultado:

El problema con este acercamiento es que a Drupal no le gusta. En el array $form\_state\['values'\] se encuentra el valor elegido en los radios (se pueden ver los valores de $form\_state\['values'\]\['opcion\_radio\_1'\] y $form\_state\['values'\]\['opcion\_radio\_2'\] pero siempre llevan los valores por defecto, no los seleccionados por el usuario). Por tanto nos queda hacer dos cosas más:

- Leer el valor introducido por el usuario desde $form\_state\['input'\]\['radio\_options'\] con mucho cuidado ya que el array 'input' NO está saneado, tiene los valores en crudo enviados por el usuario.
- Poner a mano el valor seleccionado en el #default\_value correspondiente para que, por ejemplo, al fallar una validación siga seleccionada la opción que indicó el usuario. La forma de hacerlo es en un #after\_build, dado que en ciertas circunstancias no se reconstruye el formulario entero y por tanto la ejecución no pasaría por el código de generación del formulario, donde normalmente va la indicación del valor por defecto. Así que colocamos una función de #afer\_build en el contenedor padre:
    
    ```php
    $form['contenedor'] = array(
    '#type' => 'container',
    '#after_build' => array('contenedor_opciones_radio_after_build'),
    );
    ```
    
    Teniendo la función el siguiente código:
    
    ```php
    function contenedor_opciones_radio_after_build($form_element, &$form_state) {
    if (!empty($form_state['input']['radio_options']) && $form_state['input']['radio_options'] == 'opcion_1') {
    $form['contenedor']['opcion_radio_1']['#default_value'] = 'opcion_1';
    }
    else {
    $form['contenedor']['opcion_radio_2']['#default_value'] = 'opcion_2';
    }
    return $form_element;
    }
    ```
    
    Este código marca la opción 2 si es la que está marcada en 'input', marcando la opción 2 en caso de que reciba cualquier otro valor (o ninguno). En este ejemplo, obviamente, la opción 2 es la opción por defecto.



[Form API](https://metadrop.net/es/articulos?text=Form%20API)

[Radio Button](https://metadrop.net/es/articulos?text=Radio%20Button)

[Layout API](https://metadrop.net/es/articulos?text=Layout%20API)

 

- Ricardo Sanz
    
    CTO