2010-06-16 29 views
5

Estoy usando Ctools Dependency para hacer un fieldset hideable. Esto es parte de mi código:Drupal: Cómo hacer que un campo dependiente usando CTools

$form['profile-status'] = array(
    '#type' => 'radios', 
    '#title' => '', 
    '#options' => array(
     'new' => t('Create a new profile.'), 
     'select' => t('Use an existing profile.'), 
    ), 
); 

$form['select'] = array(
    '#type' => 'select', 
    '#title' => t('Select a profile'), 
    '#options' => $options, 
    '#process' => array('ctools_dependent_process'), 
    '#dependency' => array('radio:profile-status' => array('select')), 
); 

$form['profile-properties'] = array(
    '#type' => 'fieldset', 
    '#title' => t('View the profile'), 
    '#process' => array('ctools_dependent_process'), 
    '#dependency' => array('radio:profile-status' => array('select')), 
    '#input' => true, 
); 

En fragmento anterior, hay dos elementos, uno de selección y un conjunto de campos. Ambos tienen parámetros #process y #dependency y ambos apuntan a un campo para el valor dependiente. El problema es que elementos como select o textfield se pueden ocultar fácilmente pero no funcionan para fieldset. En la página de solicitud de soporte this, el creador de CTools ha mencionado que '#input' => true es una solución alternativa. Como ve, lo agregué al código, pero no funciona tan bien.

¿Tiene alguna sugerencia?

Respuesta

5

Encontré mi respuesta después de leer la fuente de CTools dependiente. Fieldset debe cambiar así:

$form['profile-properties'] = array(
    '#type' => 'fieldset', 
    '#title' => t('View the profile'), 
    '#process' => array('ctools_dependent_process'), 
    '#dependency' => array('radio:profile-status' => array('select')), 
    '#input' => true, 

    '#id' => 'my-fs-id', 
    '#prefix' => '<div id="my-fs-id-wrapper">', 
    '#suffix' => '</div>', 
); 

En primer lugar, se debe establecer una ID para fieldset. Luego debe estar envuelto en una etiqueta DIV. La ID de la DIV debe ser la ID de feildset con el sufijo '-wrapper'.

1

ahora (febrero de 2013) El uso es:

$form['foo_or_bar'] = array(
    '#title' => 'Foo or Bar', 
    '#type' => 'radios', 
    '#options' => array(
     "foo" => "Foo", 
     "bar" => "Bar" 
    ), 
    '#default_value' => "foo", 
); 

$form['react_on_foo'] = array(
    '#type' => 'fieldset', 
    '#title' => t('Foo fieldset'), 
    '#dependency' => array('radio:foo_or_bar' => array('foo')), 
); 

$form['react_on_foo']['dummy_for_foo_fieldset'] = array(
    '#title' => t('Dummy for FOO fieldset'), 
    '#type' => 'textfield', 
); 


$form['react_on_bar'] = array(
    '#type' => 'fieldset', 
    '#title' => t('Bar fieldset'), 
    '#dependency' => array('radio:foo_or_bar' => array('bar')), 
); 

$form['react_on_bar']['dummy_for_bar_fieldset'] = array(
    '#title' => t('Dummy for BAR fieldset'), 
    '#type' => 'textfield', 
); 

Y #process no más se necesita.

Cuestiones relacionadas