Tengo una lista desplegable que muestra varios campos en función de lo que se elija y sé que puedo buscar en Google la visibilidad con los estados, pero cuando trato de usar requerido, se muestra * span, pero en realidad no es obligatorio. Lo que quiero decir es que, aunque es "obligatorio", puedo presionar Enviar y no recibir un mensaje de error de Drupal. ¿Estoy haciendo algo mal o está actualmente roto en Drupal 7.8?
$form['host_info'] = array(
'#type' => 'select',
'#title' => t("Host Connection"),
'#options' => array(
'SSH2' => t('SSH2'),
'Web Service' => t('Web Service'),
),
'#default_value' => t(variable_get('host_info', 'SSH2')),
'#description' => t("Specify the connection information to the host"),
'#required' => TRUE,
);
$form['ssh_host'] = array(
'#type' => 'textfield',
'#title' => t("Host Address"),
'#description' => t("Host address of the SSH2 server"),
'#default_value' => t(variable_get('ssh_host')),
'#states' => array(
'visible' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
'required' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
),
);
$form['ssh_port'] = array(
'#type' => 'textfield',
'#title' => t("Port"),
'#description' => t("Port number of the SSH2 server"),
'#default_value' => t(variable_get('ssh_port')),
'#states' => array(
'visible' => array(
':input[name=host_info]' => array('value' => t('SSH2')),
),
'required' => array(
':input[name=host_info]' => array('value' => t('Web Service')),
),
),
);
7
javascript
Sathariel
fuente
fuente
name
. Debe ser:input[name="host_info"]
.Respuestas:
Deberá validar esto usted mismo en una función de validación personalizada.
Todo lo configurado por #states ocurre al 100% en el navegador, todo lo que hace no es visible para Drupal cuando se envía el formulario (por ejemplo, todos los campos de formulario invisibles se envían y validan de la misma manera si no hubiera #states).
fuente
Puede usar requerido como este:
fuente
Muy similar a la respuesta de Felix Eve, solo que este es un fragmento para la validación de elementos en línea:
Llama a una función de validación de elemento el elemento requerido:
Luego, la función de validación encuentra el campo requerido y verifica si tiene el valor de formulario correcto que revelaría el campo que se necesita.
fuente
Hay otra forma de usar la función AFTER_BUILD para el formulario y hacer que ese campo sea opcional. Aquí hay un enlace para drupal 6.
Agregue esto a su código de formulario
Implemente después de la compilación, pruebe su condición de campo personalizada
En mi caso, #states agregaba múltiples *, así que tengo que evitarlo y usé jquery para ocultar y mostrar el intervalo que contiene *
Y
Basado en mi valor custom_field.
fuente
Aquí hay una guía detallada sobre Drupal 7 formulario #states .
Este es el bit importante:
fuente
Acabo de enfrentar el mismo problema que necesitaba para proporcionar una validación personalizada, sin embargo, quería que esto se controlara a través de la matriz #states, por lo que no tuve que especificar las mismas reglas dos veces.
Funciona extrayendo el nombre del campo del selector jQuery (el selector debe estar en el formato
:input[name="field_name"]
o no funcionará).El código a continuación solo se prueba en el escenario específico en el que lo estaba usando, sin embargo, creo que puede resultar útil para otra persona.
fuente
Pude hacerlo de esta manera en Drupal 8:
No ponga t ('SSH2'). esto pondrá la traducción allí en lugar del valor de la opción que es un SSH2 no traducido.
Sospecho que esto también funcionaría para Drupal 7.
fuente
He anidado campos de formulario y una casilla de verificación, por lo que necesitaba trabajar un poco en la respuesta de Dominic Woodman. En caso de que alguien más se encuentre con el mismo problema:
fuente