आप एक फार्म त्रुटि कैसे बदल सकते हैं?


8

आप किसी विशेष सामग्री प्रकार के लिए, नोड इंसर्ट पर Drupal या किसी अन्य मॉड्यूल द्वारा निर्मित प्रपत्र त्रुटि को कैसे बदलते या निकालते हैं। मैं एक ऐसी विधि की तलाश में हूं जिसका उपयोग मैं किसी मॉड्यूल में कर सकूं।

मैंने hook_node_validate () की कोशिश की है , लेकिन मैं जो भी करने में सक्षम था वह त्रुटियों को प्राप्त करने और त्रुटियों को सेट करने के लिए है।

यहां छवि विवरण दर्ज करें

जवाबों:


13

तार बदल देना

एक स्ट्रिंग के पाठ को बदलने के लिए, सबसे सरल विधि स्ट्रिंग ओवरराइड्स मॉड्यूल का उपयोग करना है। यह आपको स्ट्रिंग को बदलने की अनुमति देगा:

"नाम फ़ील्ड आवश्यक है।"

के साथ (उदाहरण के लिए):

"फ़ील्ड 'नाम' आवश्यक है।"

फ़ील्ड्स को बदलना

यदि आप किसी फ़ील्ड को आवश्यक नहीं बनाना चाहते हैं, तो एक सामान्य हुक_फॉर्म_लेटर () कार्यान्वयन का उपयोग करें:

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

फॉर्म को वैलिडेट करने का तरीका बदलना

प्रपत्र में $form['#validate']सरणी में निर्दिष्ट सत्यापन कार्य हैं । और फार्म तत्वों में निर्दिष्ट कार्य हैं $form['element_key']['#element_validate']

आप इस तरह अपना खुद का उल्लेख कर सकते हैं:

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

बहुत बढ़िया जवाब! आप त्रुटि पाठ को कैसे बदलेंगे - "शीर्षक फ़ील्ड की आवश्यकता है।" (जैसा कि प्रश्न में चित्रित किया गया है)? यह स्ट्रिंग ओवरराइड का उपयोग किए बिना है।
timofey.com

दूसरे शब्दों में, मैं सत्यापन नहीं जोड़ना चाहता, मैं केवल मौजूदा सत्यापन के त्रुटि संदेश को संशोधित करना चाहता हूं .... शायद मौजूदा सत्यापन को परेशान कर एक नया जोड़ दें?
timofey.com

1
मौजूदा सत्यापन एक सत्यापन कॉलबैक फ़ंक्शन नहीं है; यह केवल यह है कि फ़ील्ड "आवश्यक" है। ऊपर मेरे अंतिम दो का संयोजन मौजूदा संदेश को हटा देगा और फिर दूसरे प्रकार के सत्यापन को जोड़ देगा।
pjcdawkins

मुझे केवल सत्यापन संदेश बदलने की आवश्यकता है। हालांकि मैंने उपरोक्त समाधान (हुक_फॉर्म_ल्टर द्वारा) लागू किया है। मुझे दो सत्यापन संदेश मिल रहे हैं। 1 डिफ़ॉल्ट और दूसरा जो मैंने लिखा है। कोई भी सुझाव @pjcdawkins
अभिनव कुंदन

6

चूंकि उस त्रुटि संदेश के लिए उपयोग की जाने वाली स्ट्रिंग "नाम का क्षेत्र आवश्यक है।" स्ट्रिंग ओवरराइड्स मॉड्यूल का उपयोग करना या सेटिंग्स में उपयोग करने के लिए स्ट्रिंग को बदलना। एफपी फ़ाइल का हर आवश्यक प्रपत्र फ़ील्ड के लिए उपयोग किए जाने वाले स्ट्रिंग को बदलने के लिए प्रभाव होगा।

यदि आप शीर्षक के लिए दिखाए गए त्रुटि स्ट्रिंग को बदलना चाहते हैं जब शीर्षक दर्ज नहीं किया गया है, तो आप कर सकते हैं:

  • उपयोग करके नोड एडिट फॉर्म में एक फॉर्म वैलिडेशन हैंडलर जोड़ें hook_form_alter()
  • उस रूप में मान्य हैंडलर:

    • की सामग्री सत्यापित करें $form['title'](जहां $formसेट का उपयोग किया गया है $form = &drupal_static('form_set_error', array());, और इसे स्ट्रिंग में बदलें जिसे आप चाहते हैं'Title field is required.'
    • सत्यापित करें $_SESSION['messages']['error'](एक सरणी) में स्ट्रिंग है 'Title field is required.'और इसे उस स्ट्रिंग में बदलें जिसे आप दिखाना चाहते हैं

त्रुटि दिखाने से बचना आसान है: बस #requiredसंपत्ति को सेट करें FALSE, और Drupal उस त्रुटि संदेश को नहीं दिखाएगा।


4

ड्रुपल 7 के लिए आप इस मॉड्यूल को डाउनलोड कर सकते हैं http://drupal.org/node/1209450 ज़िप में यह आपको यह हुक देगा।

message_alter(&$messages) {
}

धन्यवाद। यह शायद एक असमर्थित मॉड्यूल का उपयोग करने के लिए एक अच्छा विचार नहीं है, लेकिन इसे एक गाइड के रूप में इस्तेमाल किया जा सकता है!
timofey.com

1

आप प्रति इकाई फ़ील्ड सत्यापन फ़ील्ड का उपयोग करके प्रपत्र त्रुटि संदेश अनुकूलित कर सकते हैं ।

ऐसा करने के लिए, फ़ील्ड सेटिंग संपादित करें, सत्यापन पर जाएं और एक नया सत्यापन नियम ( आवश्यक फ़ील्ड ) जोड़ें। वहां, आपके पास उस फ़ील्ड के लिए कस्टम त्रुटि संदेश सेट अप करने के लिए टेक्स्टफ़ील्ड होना चाहिए ।


0

ड्रुपल 8 के लिए, मैं एक कस्टम वेलिड फ़ंक्शन को जोड़ने में सक्षम था जो वास्तव में मौजूदा त्रुटियों की जांच कर सकता है, और प्रति मामले के आधार पर त्रुटियों के मार्कअप को बदल सकता है। मेरे मामले में, मैं एक इकाई_ उपसंहार क्षेत्र से त्रुटि संदेश को बदलना चाहता था जो उपयोगकर्ताओं को संदर्भित कर रहा था। यदि कोई अमान्य उपयोगकर्ता जोड़ा गया था, तो सत्यापन त्रुटि पढ़ी गई, "% नाम से मेल खाते कोई निकाय नहीं हैं"। शब्द "संस्थाओं" के बजाय, मैं यह कहना चाहता था कि "उपयोगकर्ता", कम डरावना और उपयोगकर्ताओं के लिए संभावित रूप से भ्रमित करने वाला हो।

सबसे पहले, मैं अपने वैध कार्य को जोड़ने के लिए hook_form_alter () का उपयोग करता हूं:

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

फिर, '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);
            }
          }
        }
      }
    }

उम्मीद है की यह मदद करेगा!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.