¿Cómo se altera un error de formulario?


8

¿Cómo se altera o elimina un error de formulario producido por Drupal u otro módulo en el nodo insertar / guardar, para un tipo de contenido en particular? Estoy buscando un método que pueda usar en un módulo.

He intentado hook_node_validate () , pero todo lo que pude hacer fue obtener errores y establecer errores.

ingrese la descripción de la imagen aquí

Respuestas:


13

Alterando cuerdas

Para cambiar el texto de una sola cadena, el método más simple es usar el módulo Stride Overrides. Eso le permitiría reemplazar la cadena:

"el campo! nombre es obligatorio".

con (por ejemplo):

"El campo '! Nombre' es obligatorio".

Alterar campos de formulario

Si desea que un campo no sea obligatorio, use una implementación normal de hook_form_alter ():

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form['#node'];
  if ($node->type == 'my_custom_type') {
    $form['title']['#required'] = FALSE;
  }
}

Cambiar la forma en que se valida un formulario

Los formularios tienen funciones de validación especificadas en la $form['#validate']matriz. Y los elementos de formulario tienen funciones especificadas en $form['element_key']['#element_validate'].

Puedes especificar el tuyo así:

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_node_form_alter(&$form, &$form_state) {
  $form['title']['#element_validate'][] = 'mymodule_validate_node_title';
}

/**
 * Validate the node title to prevent ALL CAPS.
 */
function mymodule_validate_node_title($element, &$form_state, $form) {
  if (preg_match('/^[A-Z]+$/', $element['#value'])) {
    form_error($element, t('You may not enter titles in ALL CAPS.'));
  }
}

¡Gran respuesta! ¿Cómo cambiaría el texto de error de "Se requiere el campo de título"? (como se muestra en la pregunta)? Eso es sin usar anulaciones de cadenas.
timofey.com

En otras palabras, no quiero agregar validación, solo quiero modificar el mensaje de error de una validación existente ... ¿tal vez desarmar la validación existente y agregar una nueva?
timofey.com

1
La validación existente no es una función de devolución de llamada de validación; es solo que el campo es "obligatorio". Una combinación de mis dos últimos anteriores eliminaría el mensaje existente y luego agregaría otro tipo de validación.
pjcdawkins

Solo necesito cambiar un mensaje de validación. Aunque he implementado la solución anterior (por hook_form_alter). Recibo dos mensajes de validación. 1 por defecto y el segundo que he escrito. Cualquier sugerencia @pjcdawkins
innovador

6

Como la cadena utilizada para ese mensaje de error es "se requiere un campo de nombre". usar el módulo String Overrides o cambiar la cadena para usar en el archivo settings.php tendría el efecto de cambiar la cadena utilizada para cada campo de formulario requerido.

Si desea modificar la cadena de error que se muestra para el título cuando no se ha ingresado el título, puede:

  • Agregue un controlador de validación de formulario al formulario de edición de nodos, utilizando hook_form_alter()
  • En ese formulario, el controlador de validación:

    • Verifique el contenido de $form['title'](donde $formse establece usando $form = &drupal_static('form_set_error', array());, y cámbielo a la cadena que desee cuando esté'Title field is required.'
    • Verifique $_SESSION['messages']['error'](una matriz) contiene la cadena 'Title field is required.'y cámbiela a la cadena que desea mostrar

Evitar mostrar el error es más fácil: solo configure la #requiredpropiedad FALSEy Drupal no mostrará ese mensaje de error.



1

Puede personalizar los mensajes de error de formulario utilizando la validación de campo por campo de entidad.

Para hacerlo, edite la configuración del campo, vaya a Validación y agregue una nueva regla de validación ( Campo obligatorio ). Allí, debe tener un campo de texto para configurar un mensaje de error personalizado para ese campo.


0

Para Drupal 8, pude agregar una función de validación personalizada que en realidad puede examinar los errores existentes y cambiar el marcado de los errores según cada caso. En mi caso, quería alterar el mensaje de error de un campo entity_autocomplete que hacía referencia a los usuarios. Si se agregó un usuario no válido, el error de validación decía: "No hay entidades que coincidan con% name". En lugar de la palabra "entidades", quería que dijera "usuarios", para ser menos aterrador y potencialmente confuso para los usuarios.

Primero, uso hook_form_alter () para agregar mi función de validación:

/**
 * Implements hook_form_alter().
 */
function my_module_form_alter(&$form, FormStateInterface $form_state, $form_id) {

      if (in_array($form_id, ['whatever_form_id_you_need_to_alter'])) {
        // Add entity autocomplete custom form validation messages alter.
        array_unshift($form['#validate'], 'my_module_custom_user_validate');
      }

Luego, en la función 'my_module_custom_user_validate':

/**
 * Custom form validation handler that alters default validation.
 * @param $form
 * @param \Drupal\Core\Form\FormStateInterface $form_state
*/
function my_module_custom_user_validate(&$form, FormStateInterface $form_state) {
      // Check for any errors on the form_state
      $errors = $form_state->getErrors();
      if ($errors) {
        foreach ($errors as $error_key => $error_val) {
          // Check to see if the error is related to the desired field:
          if (strpos($error_key, 'the_entity_reference_field_machine_name') !== FALSE) {
            // Check for the word 'entities', which I want to replace
            if (strpos($error_val->getUntranslatedString(), 'entities') == TRUE) {
              // Get the original args to pass into the new message
              $original_args = $error_val->getArguments();
              // Re-construct the error
              $error_val->__construct("There are no users matching the name %value", $original_args);
            }
          }
        }
      }
    }

¡Espero que esto ayude!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.