Score:0

การส่งแบบฟอร์มการลงทะเบียนแบบไดนามิกโดยใช้วานิลลา Javascript ajax

ธง us

ฉันต้องการใช้ความสามารถของ ajax ในการไม่รีเฟรชหน้าหรือเปลี่ยนเส้นทางผู้ใช้ไปยังหน้าการลงทะเบียน สร้างโมดอลโต้ตอบการเข้าสู่ระบบ / ลงทะเบียนแล้ว ฉันมี javascript ajax เข้าสู่ระบบทำงานได้อย่างสมบูรณ์โดยใช้การเรียก ajax ไปยัง api เข้าสู่ระบบโดยไม่ต้องกำหนดค่าหรือเพิ่มโมดูลใด ๆ ฉันต้องการรวมแบบฟอร์มการลงทะเบียนในลักษณะเดียวกัน ฉันต้องการลงทะเบียนเพื่อ:

  1. แสดงในโมดอล - ใช้งานได้
  2. ส่งโค้ดจาวาสคริปต์ที่ทำงานร่วมกับ PreventionDefault
  3. การตอบสนองล้มเหลว

Ajax Post กำลังส่งคืน '<' เห็นได้ชัดว่านี่คือการส่งคืน html ฉันจะรู้ได้อย่างไรว่าจะส่งข้อมูลในการโทร ajax ได้อย่างไร และจะคาดหวังอะไรจากการตอบกลับ ตัวอย่างของฉันด้านล่าง:

<style>
.scroll {
  //background-color: #fed9ff;
  //width: 600px;
  height: 500px;
  overflow-x: hidden;
  overflow-y: auto;
  //text-align: center;
  //padding: 20px;
}


.close { 
  margin: 10px 25px 0px;
}
#log-title { 
  margin-left:25px;
}
</style>

<a data-target="#register-modal" data-toggle="modal" class="" id="" href="#register-modal">Register / Create an Account </a>
 
<div id="overlay_container"></div>

 
<!--  Register to download button so stays on same page.  -->
<div id="register-modal" class="modal" tabindex="-1" role="dialog" aria-hidden="true">
  <button type="button" class="close" data-dismiss="modal" aria-label="Close">
    <span aria-hidden="true">&times;</span>
  </button> 
  <h3 id="log-title">Please register:</h3>   
  <div class="modal-dialog">
    <div class="modal-content scroll">
      <?php
        $register_form = \Drupal::service('entity.form_builder')->getForm(\Drupal\user\Entity\User::create([]), 'register', []);    
        // Load the service renderer
        $render = Drupal::service('renderer');
        $rform = $render->renderPlain($register_form);
        echo $rform;
      ?>
    </div> <!-- Register modal content end-->
  </div><!-- Register modal-dialog end -->
</div><!-- Register modal end -->

<script>
  var registerForm = document.getElementById('user-register-form');
  if (registerForm ) {
    // capture registration submit, prevent from submission and use ajax to get response
    registerForm.onsubmit = async (e) => {
      e.preventDefault();
        // callRegCaptcha();
      elms =document.getElementById("user-register-form").elements; 
      var url = "https://website/user/register"; //website is a true url

      fetch(url, {
        method: 'POST',
        body: elms
      })
      .then(response=>response.json())
      .then(json => {
        console.log(json);
      });
    }
  }
</script>

ทุกอย่างทำงานได้ยกเว้นการตอบสนอง ฉันไม่พบสิ่งที่คาดหวังจากคำตอบ หรือถ้าฉันผูกข้อมูลของเอล์มอย่างถูกต้อง ใครสามารถช่วยฉันในพื้นที่นี้?

การเข้าสู่ระบบจำเป็นต้องส่ง csrfToken พร้อมกับ

 ส่วนหัว: {
                'ประเภทเนื้อหา': 'แอปพลิเคชัน/json',
                'X-CSRF-โทเค็น': csrfToken
              },

และ "?_format=json" ต่อท้าย URL แต่สำหรับค่าการลงทะเบียน ฉันกำลังสุ่มสี่สุ่มห้า ใครมีข้อมูลบ้างว่าต้องผ่านอะไรบ้าง? คำตอบที่ฉันได้รับคือหน้า html

สุดท้าย การลงทะเบียนมี captcha v2 ซึ่งแสดงผลข้อผิดพลาด: "คำตอบที่คุณป้อนสำหรับ CAPTCHA ไม่ถูกต้อง"

ฉันยังดูที่หน้านี้: https://www.drupal.org/node/2405657

แสดง #ลงทะเบียน

โพสต์: https://example.com/user/register?_format=json
ประเภทเนื้อหา: application/json

{
  "ชื่อ": { "value": "fooBar" },
  "จดหมาย": { "value": "[email protected]" },
  "ผ่าน": { "value": "secretSauce" }
}
200 ตกลง

ฉันไม่ได้รับการตอบกลับ json มันส่งคืนข้อผิดพลาดทางไวยากรณ์: โทเค็นที่ไม่คาดคิด < ใน JSON ที่ตำแหน่ง 1

ดึงข้อมูล (url, {
            วิธีการ: 'โพสต์',
            ข้อมูล: JSON.stringify({
  "ชื่อ": { "value": "fooBar" },
  "จดหมาย": { "value": "[email protected]" },
  "ผ่าน": { "value": "secretSauce" }
}),


            ประเภทข้อมูล: "json",
            contentType: "application/json; charset=utf-8",
            ความสำเร็จ: ฟังก์ชัน (ข้อมูล) {
                console.log (ข้อมูล);
                successmessage = 'บันทึกข้อมูลสำเร็จแล้ว';
                $("#overlay_container").text(ข้อความสำเร็จ);
            },
            ข้อผิดพลาด: ฟังก์ชัน (ข้อมูล) {
                console.log (ข้อมูล);
                ข้อความสำเร็จ = 'ข้อผิดพลาด';
                $("#overlay_container").text(ข้อความสำเร็จ);
            }
        })
        .then(response=>response.json())
        .then(json=> {
            console.log(json);
        }).catch(ฟังก์ชัน(ผิดพลาด) {
                        console.log(ผิดพลาด); // แสดงข้อยกเว้นด้านบน
                 });

ไม่ประสบความสำเร็จ: หรือข้อผิดพลาดตอบสนองเพียงจับ

นอกจากนี้ เมื่อ _format=json ไปยัง url จะมีการรายงานข้อผิดพลาดต่อไปนี้:

{ข้อความ: 'รูปแบบที่ยอมรับไม่ได้: json'}
ข้อความ: "รูปแบบที่ยอมรับไม่ได้: json"
[[ต้นแบบ]]: วัตถุ

ต่อไป ฉันได้ลองติดตามการตอบกลับของโพสต์นี้โดย @Fons Vandamme ในการติดตั้ง Rest UI และกำหนดค่าการลงทะเบียนผู้ใช้

การลงทะเบียนผู้ใช้กับส่วนที่เหลือ

ข้อความ: "ไม่ได้รับข้อมูลบัญชีผู้ใช้สำหรับการลงทะเบียน"
[[ต้นแบบ]]: วัตถุ

ถัดไป: ภายใต้การขยายผู้ดูแลระบบ เปลี่ยนการตรวจสอบสิทธิ์จากคุกกี้เป็นการตรวจสอบสิทธิ์ขั้นพื้นฐานโดยการติดตั้งการตรวจสอบสิทธิ์พื้นฐาน HTTP ไปที่การกำหนดค่า UI ที่เหลือสำหรับการลงทะเบียนผู้ใช้ /ผู้ใช้/ลงทะเบียน: POST และข้อผิดพลาดใหม่คือคำขอไม่ถูกต้อง 400 รายการ

Score:1
ธง us

เพื่อให้สิ่งนี้ใช้งานได้ นี่คือขั้นตอนที่ดำเนินการเพื่อให้ใช้งานได้ ตามความคิดเห็นหลาย ๆ ทำตามคำแนะนำลิงค์นี้: https://areatype.com/blog/register-user-drupal-8-rest-api

  1. เปิดใช้งาน RESTful Web Services, HAL, REST UI, Serialization
  2. กำหนดค่า UI ส่วนที่เหลือ คลิก 'กำหนดค่า' ใต้ส่วนต่อขยาย Rest UI เปิดใช้งานทรัพยากร 'การลงทะเบียนผู้ใช้' ด้วยการตั้งค่าต่อไปนี้:

       ก. เส้นทาง -> /user/register: POST  
       ข. วิธีการ: POST
       ค. รูปแบบ: hal_json, json
       ง. การรับรองความถูกต้อง: คุกกี้ "**หมายเหตุ**: สิ่งนี้อาจหลีกเลี่ยงข้อมูลรับรองสำหรับผู้ใช้ใหม่..."
  1. การตั้งค่าบัญชี: ภายใต้การกำหนดค่า -> การตั้งค่าบัญชี "ใครสามารถลงทะเบียนบัญชีได้บ้าง" -> ผู้เยี่ยมชม ปิดใช้งาน "ต้องมีการยืนยันอีเมลเมื่อผู้เยี่ยมชมสร้างบัญชี"

  2. RESTful Web Services -> ขยาย -> RESTful Web Services -> สิทธิ์ "เข้าถึง POST บนทรัพยากรการลงทะเบียนผู้ใช้" ให้ช่องทำเครื่องหมายผู้ใช้ที่ไม่ระบุตัวตน

  3. รับบุรุษไปรษณีย์สำหรับ Chrome และตั้งค่าดังนี้: โพสต์ -> จุดสิ้นสุดของ URL -> http://{website-name-pointer}/user/register?_format=hal_json การอนุญาต: ไม่มี ส่วนหัว: Content-Type:application/json โทเค็น x-csrf:OGVi9xj9vemD3BItXOWf4-3ml2maqy-2kk0gkjIRuHk ** รับโทเค็น x-csrf-token ผ่านตัวสร้างใหม่ รับสาย ** ** http://{website}/session/token ** มันส่งออกโทเค็น csrf ในเนื้อหาส่งคืน

ควรมีลักษณะดังนี้:

ส่วนหัว: X-CSRF-Token และ Content-Type
โพสต์ URL: http://{website-name-pointer}/user/register?_format=hal_json
ร่างกาย:
{
"ชื่อ":[{"value":"test3"}],
"เมล":[{"value":"[email protected]"}],
"ผ่าน":[{"value":"test"}]
}

สิ่งนี้ควรส่งคืนสถานะ 200 ตกลงพร้อมกับผู้ใช้ที่ลงทะเบียนใหม่ uid uuid etc เนื้อหา เป็นการตอบกลับเช่นเดียวกับในกรณีที่ส่งหน้าการลงทะเบียน

บันทึก หากส่งคืนหน้า html "สร้าง/ลงทะเบียนผู้ใช้" ในเนื้อหาการตอบสนองหรือค่าอื่น ๆ แสดงว่าเป็นการตั้งค่าในการกำหนดค่า UI ที่เหลือหรือการกำหนดค่า vistor ที่เป็นไปได้มากที่สุด

หากคุณได้รับสถานะอื่นที่สามารถระบุตัวตนได้น้อยกว่า แสดงว่าไม่ถูกต้องทั้งหมด หากคุณได้รับข้อผิดพลาด 500 เป็นไปได้ว่าปัญหาในการตรวจสอบสิทธิ์ และเปลี่ยนจากคุกกี้เป็นการให้สิทธิ์พื้นฐาน หรือตรวจสอบการตั้งค่า UI อีกครั้งสำหรับตัวตรวจสอบสิทธิ์ หมายเลข 2 และ 3 ดูเป็นพื้นที่ของการลองผิดลองถูก

ดูเหมือนว่าการแก้ไขปัญหาจะยากกว่าที่ควรจะเป็น และใช้เวลา 3 วันในการค้นหาคำตอบทางอินเทอร์เน็ตและอ่านบันทึกการเปลี่ยนแปลงรหัสจำนวนมาก

ฉันนำเสนอสิ่งนี้เพื่อช่วยทุกคนที่มีปัญหาคล้ายกันในการทำให้กระบวนการทำงานได้อย่างมีประสิทธิภาพ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา