Ocultar / mostrar dinámicamente campos de API de campo en Drupal 7

14

He creado una entidad con un formulario 'agregar nuevo'. La entidad misma tiene un número limitado de variables reales. He agregado la mayoría de los datos adicionales que necesito usando campos personalizados (es decir, la API de campo).

Lo que necesito hacer en esta etapa es poder ocultar dinámicamente un campo en función del valor de otro. es decir, si un campo desplegable tiene su valor establecido en No, se debe ocultar otro campo; de lo contrario, se debe mostrar.

Por lo que puedo ver, es algo fácil agregar esta funcionalidad a los campos creados usando la API de formulario (es decir, a través de la propiedad AJAX), sin embargo, ¿hay alguna forma de lograrlo usando los campos adjuntos? No tengo problemas con el uso de Javascript personalizado si eso es lo que se requiere para resolver esto.

NRaf
fuente
No estoy seguro de si drupal.org/project/conditional_fields está listo para el d7 todavía, pero podría valer la pena investigarlo
Jukebox el

Respuestas:

5

jQuery funciona bien para esto:

(function($) {
  $(document).ready(function() {
    $('#select1').change(function() {
      switch ($(this).val()) {
        case '1':
          $('#field2').hide();
          break;
        default:
          $('#field2').show();
          break;
      }
    });
  });
}) (jQuery);
keithm
fuente
Sí, terminé usando drupal_add_js en la página del formulario y terminé haciéndolo en jQuery. Me preguntaba si había una forma más 'Drupal' de hacer esto.
NRaf
Mencionaría que no soy un gran admirador del enfoque de visibilidad de Drupal #states, por lo que no lo sugerí anteriormente.
keithm
@keithm ¿Podría explicarnos por qué no es un fanático de los estados (a partir de 2015, D7). Estoy trabajando en un proyecto en el que intentamos tomar la decisión de usar #states vs drupal_add_js. ¿Por qué crees que uno es una mejor opción sobre el otro?
blue928
Es una cuestión de preferencia legítima del programador en mi opinión; mi justificación puede diferir de la tuya. Dicho esto, en la práctica no me gusta recurrir a otra sintaxis que duplica la funcionalidad que se encuentra en Javascript / jQuery. Cuando probé #states, también encontré que los casos de uso para los que aparentemente está diseñado son demasiado limitantes. Cuando mi problema se extendió fuera de estos casos de uso, tuve que reescribir todo en Javascript directo de todos modos.
keithm
19

En Drupal 7 puede usar $ form en #stateslugar de un script jQuery personalizado. Ejemplo:

  $form['student_type'] = array(
    '#type' => 'radios',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'checkboxes',
    '#options' => drupal_map_assoc(array(t('SAT'), t('ACT'))),
    '#title' => t('What standardized tests did you take?'),
    // This #states rule says that this checkboxes array will be visible only
    // when $form['student_type'] is set to t('High School').
    // It uses the jQuery selector :input[name=student_type] to choose the
    // element which triggers the behavior, and then defines the "High School"
    // value as the one that triggers visibility.
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type"]' => array('value' => 'high_school'),
      ),
    ),
  );

Aquí hay un ejemplo si desea usar #statespara la condición de valores múltiples:

 $form['student_type'] = array(
    '#type' => 'checkboxes',
    '#options' => array(
      'high_school'   => t('High School'),
      'undergraduate' => t('Undergraduate'),
      'graduate'      => t('Graduate'),
    ),
    '#title' => t('What type of student are you?')
  );

  // High school information.
  $form['high_school']['tests_taken'] = array(
    '#type' => 'textfield',
    '#title' => t('What standardized tests did you take?'),
    '#states' => array(
      'visible' => array(   // action to take.
        ':input[name="student_type[high_school]"]' => array('checked' => TRUE),
        ':input[name="student_type[undergraduate]"]' => array('checked' => TRUE),
        ':input[name="student_type[graduate]"]' => array('checked' => FALSE),
      ),
    ),
  );

Consulte el módulo de ejemplosform_example/form_example_states.inc from para obtener más detalles y ejemplos.

milkovsky
fuente
Hablando de #stateseso, nunca he encontrado una manera de definir condiciones de visibilidad más complejas, como: ocultar el control A cuando el valor del control B está en la matriz (x, y, z). ¿Conoces una sintaxis para eso?
Artur
1
Vea mi actualización anterior
milkovsky
4

Deberías probar los campos condicionales , creo que este módulo es imprescindible para esta tarea. Puede establecer dependencias entre campos en una interfaz de administración fácil de usar. Por ejemplo, puede configurar el Acampo para que solo sea visible si el Bcampo tiene el valor " 1234 ", o puede configurar el Ccampo de texto para que sea visible solo cuando el Dcampo esté marcado, o establecer el Ecampo como invisible si Festá enfocado, etc.

En el formulario de carga, estas dependencias se establecerán en el lado del cliente, en la pantalla del nodo, estas dependencias se establecerán en el lado del servidor.

Puede establecer estas dependencias en admin/structure/types/manage/[YOURCONTENTTYPESMACHINENAME]/dependencies.

Campos condicionales (Fuente de la imagen: la página del proyecto )

Sk8erPeter
fuente