Bir form hatasını nasıl değiştirirsiniz?


8

Belirli bir içerik türü için Drupal veya düğüm ekleme / kaydetme üzerindeki başka bir modül tarafından üretilen bir form hatasını nasıl değiştirir veya kaldırırsınız. Bir modülde kullanabileceğim bir yöntem arıyorum.

Hook_node_validate () denedim , ama tüm yapabildim hataları almak ve hataları ayarlamak.

resim açıklamasını buraya girin

Yanıtlar:


13

Dizeleri değiştirme

Tek bir dizenin metnini değiştirmek için en basit yöntem Dize Geçersiz Kılma modülünü kullanmaktır. Bu, dizeyi değiştirmenize izin verir:

"! ad alanı zorunludur."

ile (örneğin):

Msgstr "'! Name' alanı zorunludur."

Form alanlarını değiştirme

Gerekli olmayan bir alanı yapmak istiyorsanız, normal bir hook_form_alter () uygulaması kullanın:

/**
 * 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;
  }
}

Bir formun onaylanma şeklini değiştirme

Formlar $form['#validate']dizide belirtilen doğrulama işlevlerine sahiptir . Ve form öğelerinde belirtilen işlevler vardır $form['element_key']['#element_validate'].

Kendinizi şu şekilde belirleyebilirsiniz:

/**
 * 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.'));
  }
}

Mükemmel cevap! "Başlık alanı zorunludur" hata metnini nasıl değiştirirsiniz? (soruda gösterildiği gibi)? Dize geçersiz kılmaları kullanmadan.
timofey.com

Başka bir deyişle, doğrulama eklemek istemiyorum, sadece mevcut bir doğrulama hata mesajını değiştirmek istiyorum .... belki mevcut doğrulamanın ayarını kaldırın ve yeni bir tane ekleyin?
timofey.com

1
Mevcut doğrulama, bir doğrulama geri çağırma işlevi değildir; sadece alan "zorunludur". Yukarıdaki son ikimin bir kombinasyonu mevcut mesajı kaldıracak ve daha sonra başka bir doğrulama türü ekleyecektir.
pjcdawkins

Yalnızca bir doğrulama iletisini değiştirmem gerekiyor. Her ne kadar yukarıdaki çözümü (kanca_form_alter tarafından) uyguladığım rağmen. İki doğrulama mesajı alıyorum. 1 bir varsayılan ve 2 yazdım. Herhangi bir öneri @pjcdawkins
yenilikçi kundan

6

Bu hata mesajı için kullanılan dize "! Name field zorunludur." kullanarak dize geçersiz kılar dize modülünü veya değiştirilmesi istenen her form alanı için kullanılan dize değiştirme etkisi olurdu settings.php dosyasında kullanılacak.

Başlık girilmediğinde başlık için gösterilen hata dizesini değiştirmek isterseniz:

  • Düğüm düzenleme formuna kullanarak form doğrulama işleyicisi ekleme hook_form_alter()
  • Bu formda değerleme işleyicisi:

    • İçeriğini doğrulayın $form['title'](nerede $formkullanılır?) $form = &drupal_static('form_set_error', array());Ve bulunduğunda istediğiniz dizeye değiştirin'Title field is required.'
    • Doğrulama $_SESSION['messages']['error'](bir dizi) dizeyi içerir ve 'Title field is required.'göstermek istediğiniz dizeyle değiştirir

Hatayı göstermekten kaçınmak daha kolaydır: Sadece #requiredözelliği olarak ayarlayın FALSEve Drupal bu hata mesajını göstermez.


4

Drupal 7 için bu modülü http://drupal.org/node/1209450 zip olarak indirebilirsiniz , bu kancayı verecektir.

message_alter(&$messages) {
}

Teşekkürler. Desteklenmeyen bir modül kullanmak muhtemelen iyi bir fikir değildir, ancak kılavuz olarak kullanılabilir!
timofey.com

1

Varlık başına alan doğrulamasını kullanarak form hata iletilerini özelleştirebilirsiniz .

Bunu yapmak için alan ayarlarını düzenleyin, Doğrulama'ya gidin ve yeni bir doğrulama kuralı ekleyin ( Zorunlu alan ). Burada, bu alan için Özel hata mesajı ayarlamak için metin alanınız olmalıdır .


0

Drupal 8 için, mevcut hataları gerçekten inceleyebilen ve hataların biçimlendirmesini her durum için değiştirebilen özel bir doğrulama işlevi ekleyebildim. Benim durumumda, kullanıcılara atıfta bulunan bir entity_autocomplete alanındaki hata mesajını değiştirmek istedim. Geçersiz bir kullanıcı eklenirse, doğrulama hatası "% name ile eşleşen varlık yok" ifadesini okudu. "Varlıklar" kelimesi yerine, "kullanıcılar" demesini, daha az korkutucu ve potansiyel olarak kullanıcılar için kafa karıştırıcı olmasını istedim.

İlk olarak, doğrulama işlevimi eklemek için hook_form_alter () kullanıyorum:

/**
 * 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');
      }

Ardından, 'my_module_custom_user_validate' işlevinde:

/**
 * 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);
            }
          }
        }
      }
    }

Bu yardımcı olur umarım!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.