คุณจะแก้ไขข้อผิดพลาดของแบบฟอร์มได้อย่างไร


8

คุณจะแก้ไขหรือลบข้อผิดพลาดแบบฟอร์มที่ผลิตโดย Drupal หรือโมดูลอื่นบนการแทรก / บันทึกโหนดสำหรับประเภทเนื้อหาเฉพาะได้อย่างไร ฉันกำลังมองหาวิธีที่ฉันสามารถใช้ในโมดูล

ฉันลองใช้hook_node_validate ()แต่สิ่งที่ฉันสามารถทำได้คือรับข้อผิดพลาดและตั้งข้อผิดพลาด

ป้อนคำอธิบายรูปภาพที่นี่

คำตอบ:


13

การเปลี่ยนสตริง

ในการเปลี่ยนข้อความของสตริงเดี่ยววิธีที่ง่ายที่สุดคือการใช้โมดูล String Overrides ที่จะช่วยให้คุณสามารถแทนที่สตริง:

ต้องใส่ชื่อฟิลด์!

ด้วย (ตัวอย่าง):

"ต้องระบุฟิลด์ '! name'"

การเปลี่ยนฟิลด์แบบฟอร์ม

หากคุณต้องการทำให้ฟิลด์ไม่จำเป็นต้องใช้การใช้งาน 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;
  }
}

การเปลี่ยนวิธีการตรวจสอบแบบฟอร์ม

แบบฟอร์มมีฟังก์ชั่นการตรวจสอบความถูกต้องที่ระบุใน$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

ฉันต้องการเปลี่ยนเฉพาะข้อความตรวจสอบความถูกต้อง แม้ว่าฉันจะใช้วิธีการแก้ปัญหาข้างต้น (โดย hook_form_alter) ฉันได้รับข้อความตรวจสอบสองข้อความ 1 ค่าเริ่มต้นหนึ่งและที่สองที่ฉันเขียน ข้อเสนอแนะใด ๆ @pjcdawkins
kundan นวัตกรรม

6

เนื่องจากสตริงที่ใช้สำหรับข้อความแสดงข้อผิดพลาดนั้นจำเป็นต้องมี "! name field" การใช้โมดูลString Overridesหรือการเปลี่ยนสตริงเพื่อใช้ในไฟล์ settings.php จะมีผลในการเปลี่ยนสตริงที่ใช้สำหรับทุกฟิลด์แบบฟอร์มที่ต้องการ

หากคุณต้องการแก้ไขสตริงข้อผิดพลาดที่แสดงสำหรับชื่อเรื่องเมื่อไม่ได้ป้อนชื่อคุณสามารถ:

  • เพิ่มตัวจัดการการตรวจสอบความถูกต้องของฟอร์มให้กับฟอร์มแก้ไขโหนดโดยใช้ hook_form_alter()
  • ในรูปแบบตัวจัดการ validantion:

    • ตรวจสอบเนื้อหาของ$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

สำหรับ drupal 7 คุณสามารถดาวน์โหลดโมดูลนี้http://drupal.org/node/1209450ใน zip มันจะให้เบ็ดนี้

message_alter(&$messages) {
}

ขอบคุณ อาจไม่ใช่ความคิดที่ดีที่จะใช้โมดูลที่ไม่รองรับ แต่สามารถใช้เป็นแนวทางได้!
timofey.com

1

คุณสามารถปรับแต่งข้อความแสดงข้อผิดพลาดโดยใช้การตรวจสอบความถูกต้องของฟิลด์ต่อฟิลด์เอนทิตี

หากต้องการทำเช่นนั้นให้แก้ไขการตั้งค่าฟิลด์ไปที่การตรวจสอบความถูกต้องและเพิ่มกฎการตรวจสอบความถูกต้องใหม่ ( ฟิลด์ที่จำเป็น ) ที่นั่นคุณควรมีฟิลด์ข้อความสำหรับตั้งค่าข้อความแสดงข้อผิดพลาดที่กำหนดเองสำหรับฟิลด์นั้น


0

สำหรับ Drupal 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);
            }
          }
        }
      }
    }

หวังว่านี่จะช่วยได้!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.