เพิ่มข้อความ php อย่างเข้มงวด PHP AJAX CRUD: การสร้าง ลบ แก้ไขบันทึกในฐานข้อมูล MySQL สคริปต์ PHP สำหรับการดำเนินการ CRUD

ภาพรวม

ระบบการแจ้งเตือนในตัวซึ่งเป็นครั้งแรกใน Joomla ช่วยให้แอปของคุณสามารถแจ้งให้ผู้ใช้ (หรือกลุ่มผู้ใช้) ทราบเกี่ยวกับเหตุการณ์ต่างๆ คิดว่าการแจ้งเตือนเป็นการแจ้งเตือนที่สำคัญที่ผู้ใช้สนใจที่จะอ่านและติดตาม
สามารถสร้างการแจ้งเตือนได้ทุกที่ ในส่วนประกอบหรือปลั๊กอินของคุณและแสดงในภายหลังภายในระบบการแจ้งเตือน JomSocial
บทช่วยสอนนี้จะแสดงให้คุณเห็นว่าอย่างไร แต่เนื่องจากเราไม่รู้ว่าส่วนประกอบของบุคคลที่สามใด ๆ ที่เราสามารถใช้ได้ :) ตัวอย่างจะทำบนปลั๊กอินชุมชนซึ่งจะถูกทริกเกอร์ที่เหตุการณ์ onAfterProfileUpdate
หากคุณไม่ทราบวิธีสร้างปลั๊กอินที่จะเรียกใช้ในเหตุการณ์นี้ เราขอแนะนำให้คุณอ่านคู่มือนี้

นำไปปฏิบัติในองค์ประกอบของคุณต่อไป

ตามที่ระบุไว้ในภาพรวมของบทช่วยสอนนี้ เราจะสร้างการแจ้งเตือนโดยใช้ปลั๊กอินชุมชน
คุณมักจะต้องการสร้างการแจ้งเตือนภายในส่วนประกอบหรือปลั๊กอินของคุณ บทช่วยสอนต่อไปนี้จะใช้ได้ในกรณีใดก็ตาม คุณเพียงแค่ต้องกำหนดจุดใดในโค้ดของคุณที่จะสร้างการแจ้งเตือน และเพียงโหลดไฟล์ JomSocial Core Libraries

need_once JPATH_ROOT "/components/com_community/libraries/core.php" ;

การทำตามบทช่วยสอนที่อธิบายไว้ด้านล่างนี้ก็ใช้ได้ดีกับส่วนขยายของคุณด้วย

การเตรียมสภาพแวดล้อมการพัฒนา

1. เราจะถือว่าคุณได้สร้างปลั๊กอินตัวอย่างประเภทชุมชนไว้แล้ว ซึ่งจะถูกทริกเกอร์เมื่อผู้ใช้เปลี่ยนโปรไฟล์
ถ้าไม่เช่นนั้น คุณสามารถดาวน์โหลดปลั๊กอินตัวอย่างเปล่าได้จาก ติดตั้งใน Joomla และเปิดใช้งานปลั๊กอิน มันมีชื่อว่า ชุมชน - ตัวอย่างการแจ้งเตือน
2. นำทางไปยังฐานข้อมูลของคุณและล้างตารางทั้งสองนี้ เพื่อไม่ให้มีบันทึกใดๆ เลย

A) คำนำหน้า_community_notification
b) คำนำหน้า_community_mailq

3. มีผู้ใช้อย่างน้อยสอง (2) รายที่ไซต์ทดสอบของคุณและทราบ ID ของพวกเขา

ใน Joomla เวอร์ชันก่อนหน้า ID ผู้ใช้จะเริ่มต้นจากหมายเลขที่ระบุเสมอ (62, 42) ใน Joomla 3 หมายเลขนี้จะเป็นแบบสุ่ม ดังนั้นรูปภาพของสภาพแวดล้อมการทดสอบของเราเนื่องจากจะแตกต่างออกไปอย่างแน่นอนในตอนท้ายของคุณ

การแจ้งเตือนครั้งแรก

เปิดไฟล์ปลั๊กอิน php ซึ่งจะอยู่ใน ROOT/plugins/community/example
ภายในฟังก์ชัน onAfterProfileUpdate() ให้แทนที่

CNotificationLibrary::add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

ดังที่แสดงในตัวอย่าง API การเพิ่มการแจ้งเตือนมีพารามิเตอร์ 7 ตัว

  • $cmd - เป็นประเภทการแจ้งเตือน คุณสามารถดูการแจ้งเตือนทุกประเภทได้ในไฟล์นี้ ROOT/components/com_community/libraries/notificationtypes.php เริ่มต้นจากหรือประมาณบรรทัดที่ 53 เราขอแนะนำให้ใช้ประเภทการแจ้งเตือน system_messaging
  • $actor - คือบุคคลที่ดำเนินการ
  • $target - คือบุคคลหรือกลุ่มบุคคลที่จะได้รับการแจ้งเตือน
  • $subject - เป็นเรื่องของการแจ้งเตือน ทั้งในหน้าต่างป๊อปอัปการแจ้งเตือนและชื่ออีเมล
  • $body - คือเนื้อความของข้อความแจ้งเตือนทางอีเมล
  • $template - หากคุณต้องการใช้เทมเพลตเฉพาะ คุณสามารถกำหนดได้ที่นี่ มิฉะนั้น พารามิเตอร์นี้สามารถเว้นว่างได้
  • $params - พารามิเตอร์ที่กำหนดเอง
  • เมื่อรู้ทั้งหมดนี้แล้ว เรามากำหนดตัวแปรที่เราจะใช้กันดีกว่า
    เปลี่ยนรหัสปลั๊กอินของคุณเป็น:

    $user = CFactory::getUser(); $cmd = "system_messaging" ; // พารามิเตอร์แรก ประเภทของกิจกรรม $actor = $user -> id ; //พารามิเตอร์ที่สอง - รับรหัสของ $actor $target = "965" ; // พารามิเตอร์ที่สาม ใครรับการแจ้งเตือนบ้าง? ในสภาพแวดล้อมการพัฒนาของเรา ผู้ใช้ที่เป็นผู้ดูแลระบบที่มี ID 965 ในสภาพแวดล้อมของคุณ คุณมักจะต้องการรับ ID จากอ็อบเจ็กต์ของคุณหรือจากอาร์เรย์ของผู้ใช้ $subject = "เรื่องการแจ้งเตือน" ; // หัวเรื่องของทั้งสอง การแจ้งเตือนทางอีเมลและป๊อปอัป $body = ; //เนื้อหาในอีเมล $แม่แบบ = "" ; // หากคุณต้องการใช้ไฟล์เทมเพลต jomsocial คุณสามารถกำหนดได้ที่นี่ $params = ค่าพารามิเตอร์ใหม่("" ) ; // เราต้องการสร้างอ็อบเจ็กต์พารามิเตอร์เพิ่มเติม และกำหนดข้อมูลให้กับมัน โดยไม่ต้องกำหนดคลาสอย่างเป็นทางการ CNotificationLibrary:: add ( $cmd , $actor , $target , $subject , $body , $template , $params ) ;

    ตอนนี้เข้าสู่ระบบด้วยผู้ใช้คนใดก็ได้และเปลี่ยนข้อมูลโปรไฟล์ ให้ไปที่ฐานข้อมูลเพื่อดูว่าเกิดอะไรขึ้น
    ไปที่ตาราง prefix_community_notifications และสังเกตบันทึกใหม่

    นำทางไปยังตาราง prefix_community_mailq และดูบันทึกใหม่

    ยินดีด้วย!


    - คุณได้สร้างการแจ้งเตือนของคุณเองเป็นครั้งแรกซึ่งถูกส่งผ่านทางอีเมลและระบบแจ้งเตือน JomSocial ภายในเรียบร้อยแล้ว

    รหัสที่เป็นไปได้ขยายตัว

    $actor = CFactory::getUser(); $params = ค่าพารามิเตอร์ใหม่("" ) ; CNotificationLibrary:: add ( "system_messaging" , $actor -> "นี่คือข้อความเนื้อหาการแจ้งเตือน" , "" , $params ) ;

    สิ่งนี้สะอาดกว่าและง่ายต่อการติดตามมาก โดยพื้นฐานแล้วทำสิ่งเดียวกันกับโค้ดที่แสดงด้านบน

    พารามิเตอร์การแจ้งเตือนที่กำหนดเอง

    API การแจ้งเตือนสามารถขยายได้ด้วยพารามิเตอร์ใดๆ ที่คุณต้องการเพิ่ม
    พารามิเตอร์เหล่านี้สามารถส่งผ่านไปยังเทมเพลตอีเมล การแจ้งเตือน และแน่นอนว่ารวมถึงไฟล์ภาษาด้วย

    $actor = CFactory::getUser(); $link = "http://www.google.com" ; $params = ค่าพารามิเตอร์ใหม่("" ) ; $params -> set ("นักแสดง" , $actor -> getDisplayName () ) ; // สามารถใช้เป็นแท็ก (นักแสดง) $params -> set ("actor_url" , "index.php?option=com_community&view=profile&userid=" . $actor -> id ) ; // ลิงก์สำหรับแท็ก (นักแสดง) $params -> set ("url" , $link ) ; //URL ของกิจกรรมทั้งหมด ใช้เมื่อเลื่อนเมาส์ไปเหนืออวตารในหน้าต่างการแจ้งเตือน สามารถใช้เป็นแท็ก (url) ในอีเมลขาออกได้เช่นกัน ตรวจสอบให้แน่ใจว่าคุณได้กำหนดตัวแปร $link :) CNotificationLibrary:: add ( "system_messaging" , $actor -> id , "965" , "Notification Subject" , "This is the alert body message" , "" , $params ) ;

    • $params = Cพารามิเตอร์ใหม่( ); - เราต้องการสร้างอ็อบเจ็กต์พารามิเตอร์ใหม่และกำหนดข้อมูลให้กับมัน โดยไม่ต้องกำหนดคลาสอย่างเป็นทางการ
    • $params->set("นักแสดง", $นักแสดง->getDisplayName()); - การแจ้งเตือนของคุณควรมีนักแสดงอยู่เสมอ พารามิเตอร์นี้สามารถส่งผ่านไปยังเทมเพลตเป็นแท็ก (actor) ในหน้าต่างการแจ้งเตือน จะกำหนดผู้ใช้ที่ดำเนินการ
    • $params->set("actor_url", "index.php?option=com_community&view=profile&userid=" . $actor->id); - URL ของนักแสดง โดยปกติจะเป็น URL ของนักแสดง ในป๊อปอัปการแจ้งเตือน จะเพิ่มลิงก์ไปยังองค์ประกอบ (นักแสดง)
    • $params->set("url", $link); - นี่คือพารามิเตอร์ที่สำคัญที่สุดที่คุณต้องตั้งค่าให้ถูกต้องเสมอ ในหน้าต่างการแจ้งเตือน พารามิเตอร์นี้จะถูกใช้เหนือรูปภาพประจำตัว ในการแจ้งเตือนทางอีเมล ระบบจะสะท้อนถึงสถานที่ที่มีกิจกรรมเกิดขึ้น

    สำหรับตัวอย่างนี้ เราจะตั้งค่าตัวแปร $link ให้ลงจอด www.google.comเพื่อให้คุณสามารถดูว่ามันทำงานอย่างไร

    การเพิ่มสตริงภาษาและใช้ Params

    การมีพารามิเตอร์ที่เราเพิ่งตั้งค่าไว้ก็พร้อมที่จะใช้ในไฟล์ภาษาของเราเช่นกัน
    ให้กำหนดคีย์ภาษาโดยการเปลี่ยน " CNotificationLibrary::เพิ่ม()เอพีไอ

    CNotificationLibrary::add("system_messaging" , $actor -> id , "965" , JText::sprintf("PLG_COMMUNITY_EXAMPLE_SUBJECT" ) , JText::sprintf("PLG_COMMUNITY_EXAMPLE_BODY" ) , "" , $params ) ;

    ไฟล์ภาษาควรมีลักษณะเช่นนี้

    PLG_COMMUNITY_EXAMPLE_SUBJECT = "(นักแสดง) อัปเดตโปรไฟล์แล้ว" PLG_COMMUNITY_EXAMPLE_BODY = "สวัสดีผู้ดูแลระบบ \n นี่คืออีเมลเพื่อแจ้งให้คุณทราบว่า (นักแสดง) อัปเดตโปรไฟล์แล้ว \n\n หากคุณต้องการไปที่ Google คลิกที่นี่ \n a href=" _QQ_" (URL)"_QQ_">(URL)"

    ในตัวอย่างนี้ เราได้ใช้แท็ก (actor) และ (url) เพื่อส่งข้อมูลไปยังทั้งเทมเพลตการแจ้งเตือนและอีเมล มาดูกันว่ามีลักษณะอย่างไร
    ในหน้าต่างการแจ้งเตือนเมื่อวางเมาส์เหนืออวาตาร์ ให้สังเกตว่าพารามิเตอร์ (url) ถูกเตะเข้ามาและเพิ่มลิงก์ไปยัง Google บนอวาตาร์ มันเป็นความตั้งใจเพราะเราทำให้มันเป็นเช่นนั้น :)


    ]

    ในหน้าต่างเดียวกัน เมื่อวางเมาส์เหนือลิงก์นักแสดง นี่คือส่วนที่ (นักแสดง) สะท้อนผู้ใช้ที่ดำเนินการในขณะที่ (actor_url)" ดูแลว่าวัตถุมีการเชื่อมโยงอย่างถูกต้อง


    มาดูกันว่าเกิดอะไรขึ้นในคิวอีเมล


    และสุดท้ายคืออีเมลจริงที่ส่งถึงผู้ใช้ปลายทาง


    ความสำเร็จ
    จนถึงตอนนี้ เราได้สร้างพารามิเตอร์สาม (3) ตัวที่ใช้ในหน้าต่างการแจ้งเตือนและอีเมลได้สำเร็จ

  • (นักแสดง) - ส่งคืนชื่อผู้ใช้ของผู้ใช้ที่ดำเนินการ
  • (actor_url) - ให้ คุณลักษณะของ (นักแสดง)
  • (url) - ไม่ได้บังคับ แต่คุณควรจะมีไว้ในการแจ้งเตือนเสมอ เป็น URL หลักที่การกระทำที่เราได้รับแจ้งเกิดขึ้น
  • ในทำนองเดียวกัน คุณสามารถกำหนด "

    • (เป้าหมาย) - หากคุณต้องการมัน
    • (target_url) หากคุณต้องการในการแจ้งเตือน
    • (ชื่อเรื่อง) - มักใช้เพื่ออ้างถึงวัตถุที่สร้างการแจ้งเตือน ตัวอย่าง: "ผู้ใช้ X โพสต์รูปภาพใหม่ในอัลบั้ม Y" ชื่ออัลบั้ม Y ที่นี่
    • (title_url) - เช่นเดียวกับก่อนหน้านี้ URL ของออบเจ็กต์ที่สร้างการแจ้งเตือน
    • (ข้อความ) - พารามิเตอร์นี้สามารถใช้เพื่อตั้งค่า (และสะท้อน) ข้อความในเนื้อหาของอีเมล JomSocial

    ในที่สุดฉันก็รู้ว่า: ฉันไม่สามารถหาใครได้ดีไปกว่าภรรยาของฉัน ที่เหลือก็แค่หาเมีย

    PHP AJAX CRUD: การสร้าง ลบ แก้ไขบันทึกในฐานข้อมูล MySQL

    ในบทความนี้ เราจะเรียนรู้เกี่ยวกับวิธีเพิ่ม แก้ไข และลบบันทึกในฐานข้อมูล MySQL โดยใช้ PHP เราใช้ตัวจัดการ JQuery ที่ส่งคำขอ AJAX ไปยังสคริปต์ฝั่งเซิร์ฟเวอร์ ตัวจัดการจะอัพเดตรายการบันทึก

    แบบฟอร์ม AJAX สำหรับส่งคำขอสร้าง ลบ แก้ไข

    เมื่อเพิ่มบันทึก แบบฟอร์มจะส่งข้อมูลไปยังสคริปต์ PHP ผ่านการร้องขอ AJAX หากการเพิ่มสำเร็จ รายการจะถูกโหลดซ้ำ

    ฟังก์ชัน JQuery AJAX สำหรับการสืบค้นฐานข้อมูล CRUD

    ในฟังก์ชัน JQuery AJAX เรามีกรณีสวิตช์เพิ่มแก้ไขและลบ กรณีเหล่านี้จะสร้างสตริงข้อมูลการสืบค้นและการตอบกลับที่แตกต่างกัน ขึ้นอยู่กับการดำเนินการของฐานข้อมูล

    ฟังก์ชัน showEditBox(id) ( $("#frmAdd").hide(); var currentMessage = $("#message_" + id + " .message-content").html(); var editMarkUp = ""+currentMessage+" SaveCancel"; $("#message_" + id + " .message-content").html(editMarkUp); ) ฟังก์ชั่น cancelEdit(message,id) ( $("#message_" + id + " .message-content") .html(message); $("#frmAdd").show(); function callCrudAction(action,id) ( $("#loaderIcon").show(); var queryString; switch(action) ( กรณี "เพิ่ม" : queryString = "action="+action+"&txtmessage="+ $("#txtmessage").val(); ตัวพิมพ์เล็ก "แก้ไข": queryString = "action="+action+"&message_id="+ id + " &txtmessage ="+ $("#txtmessage_"+id).val(); break; case "delete": queryString = "action="+action+"&message_id="+ id; break; ) jQuery.ajax(( url: " crud_action.php", data:queryString, พิมพ์: "POST", Success:function(data)( switch(action) ( case "add": $("#comment-list-box").append(data); break ; กรณี "แก้ไข": $("#message_" + id + " .message-content").html(data); $("#frmAdd").show(); หยุดพัก;

    กรณี "ลบ": $("#message_"+id).fadeOut(); หยุดพัก;

    ) $("#txtmessage").val(""); $("#loaderIcon").hide(); ), ข้อผิดพลาด:ฟังก์ชัน ()() )); -

    สคริปต์ PHP สำหรับการดำเนินการ CRUD

    รหัสต่อไปนี้ดำเนินการแบบสอบถามกับฐานข้อมูล สคริปต์ PHP นี้ หลังจากดำเนินการ CRUD แล้ว จะอัปเดตบันทึกอันเป็นผลมาจากการตอบสนอง AJAX

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

    บ่อยครั้ง การสร้างและส่งออกข้อความจะถูกแยกออกเป็นคำขอ HTTP ที่แตกต่างกัน ตามกฎแล้ว จะสะดวกในการใช้การเปลี่ยนเส้นทางหลังจากประมวลผลแบบฟอร์ม (เพื่อหลีกเลี่ยงปัญหากับปุ่มย้อนกลับและรีเฟรช) แต่ในขณะเดียวกัน ช่วงเวลาที่เป็นธรรมชาติสำหรับการสร้างข้อความก็คือช่วงเวลาของการประมวลผลแบบฟอร์มและการดำเนินการที่มาพร้อมกับมันอย่างแม่นยำ มัน. ทำไม ลองนึกภาพว่าข้อความควรมีลักษณะดังนี้: "จำนวนหน่วยที่สั่งซื้อสำหรับรายการ 'แผ่นรองเมาส์' เปลี่ยนจาก 7 เป็น 12 สำเร็จแล้ว" หลังจากเปลี่ยนเส้นทางแล้ว บางทีอาจไปยังหน้าที่ต่างไปจากเดิมอย่างสิ้นเชิง จะปวดหัวเป็นพิเศษในการพิจารณาว่าเคยทำอะไรมาก่อน

    ส่วนใหญ่แล้วข้อความจะแสดงในคำขอ POST ที่ประมวลผลแบบฟอร์มซึ่งไม่ดีคำว่า "หน้านี้ล้าสมัย" ทำลายชีวิต (เมื่อผู้ใช้ตัดสินใจลองใช้ปุ่มย้อนกลับ)

    มีคนใช้การเปลี่ยนเส้นทางโดยละทิ้งข้อความที่เป็นมิตร

    ขณะเดียวกันก็มีวิธีที่ง่ายและชัดเจนในการทำให้ชีวิตดีขึ้น แม้จะชัดเจน แต่ด้วยเหตุผลบางอย่างฉันไม่เคยเห็นใครใช้มันเลย อย่างน้อยก็ตอนที่ฉันดูแหล่งที่มาของผู้อื่น

    ดังนั้นเราจึงมีปัญหา - ข้อความจะต้อง "แสดง" ในคำขอที่แตกต่างกัน เราต้องการกลไกในการถ่ายโอนข้อความไปยังหน้าที่ควรจะแสดง คุณคงจำเซสชันต่างๆ ได้แล้ว

    ใช่ โดยทั่วไปแล้วคุณพูดถูก วิธีการอื่นๆ เช่น ผ่านตัวแปรร่วม ไม่อนุญาตให้บันทึกข้อมูลในกรณีที่มีการใช้การเปลี่ยนเส้นทาง (หมายเหตุโดย Maxim Naumenko) นอกจากนี้ ฉันมักจะตรวจสอบให้แน่ใจว่าแต่ละหน้าจอในแอปพลิเคชันมีความสามารถพร้อมกับข้อมูลอื่น ๆ ในการแสดงข้อความที่สร้างขึ้นบนหน้าจอก่อนหน้า สะดวกเพราะไม่ต้องเตรียมหน้าจอแยกสำหรับแสดงข้อความ และผู้ใช้ไม่ต้องคลิกเมาส์อีก แต่จริงๆ แล้ว นักออกแบบจำเป็นต้องคิดตรงนี้ เพื่อเน้นบริเวณที่ข้อความจะปรากฏ

    แนวคิดนี้ง่ายมากและสามารถนำไปใช้กับคลาสได้ 2-3 คลาส

    สิ่งแรกที่นึกถึงคือการสร้างคลาสข้อความ ซึ่งอันที่จริงจะแสดงข้อความในไดอะแกรมคลาสแบบง่ายของเรา ข้อความจะต้องสามารถบันทึกตัวเองในเซสชันได้ตลอดจนแสดงตัวเองบนหน้าจอ

    class Message ( /** * Message content. */ var $content; /** * Constructor สำหรับการเริ่มต้นข้อความ * * @param content เนื้อหาข้อความ */ function Message($content) ( $this->content = $ content ; ) /** * เขียนข้อความถึง session. */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * ส่งข้อความไปที่เพจ */ function toPage () ( echo. " - " . $this->เนื้อหา
    "; } }

    ตัวแปร $_SESSION ใช้เพื่อเข้าถึงเซสชัน

    โปรดทราบว่า $_SESSION เป็นอาร์เรย์ เราใช้เพียงองค์ประกอบเดียวของอาร์เรย์นี้กับดัชนี 'session_message'

    ในกรณีนี้ เรากำลังจัดการกับ "อาร์เรย์ของอาร์เรย์" - สิ่งที่เราเก็บไว้ในองค์ประกอบ 'session_message' คืออาร์เรย์ นี่คือรายการข้อความที่ส่ง (แน่นอนว่าอาจมีได้หลายข้อความ)

    หากคุณไม่พบเธรดนี้ ก็ถึงเวลาทบทวนส่วนต่างๆ ของคู่มือที่เกี่ยวข้องกับเซสชันและอาร์เรย์โดยเฉพาะ

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

    โปรดทราบว่าในขณะนี้ไม่ใช่ออบเจ็กต์ที่ใส่ลงในเซสชัน แต่เป็นเพียงข้อความเท่านั้น OOP ช่วยให้เราสามารถเปลี่ยนพฤติกรรมของเมธอด send() ได้ในภายหลัง โดยไม่ต้องเปลี่ยนโค้ดไคลเอ็นต์ที่เข้าถึงเมธอดนี้ (เช่น ในอนาคตเราสามารถเขียนออบเจ็กต์ข้อความทั้งหมดลงในเซสชันได้หากมีหลายฟิลด์)

    ลองจินตนาการว่าเราจะทำเช่นนี้โดยใช้ฟังก์ชัน เราน่าจะมีฟังก์ชัน message_send($txt) และฟังก์ชัน message_to_page($txt) ด้วย ตอนนี้เราจำเป็นต้องเพิ่มความสามารถในการมีพฤติกรรมที่แตกต่างกันสำหรับข้อความประเภทต่างๆ การเรียกฟังก์ชันเปลี่ยนแปลง: message_send($txt, $kind), message_to_page($txt, $kind) คุณจะต้องค้นหาโค้ดแอปพลิเคชันทั้งหมดเพื่อค้นหาฟังก์ชันดังกล่าวและทำการแก้ไข

    สิ่งนี้สามารถหลีกเลี่ยงได้โดยการคาดการณ์สถานการณ์ล่วงหน้าโดยนำเสนอข้อความเป็นอาร์เรย์ที่เชื่อมโยง: $msg['txt'], $msg['kind'] จากนั้นจะมีพารามิเตอร์เพียงตัวเดียวในการเรียกใช้ฟังก์ชัน คุณรู้สึกไหมว่าสิ่งนี้กำลังพยายามที่จะกลายเป็นชั้นเรียน?

    ดังนั้น OOP เปิดโอกาสให้คุณมีความหรูหราโดยไม่ต้องคิดทุกอย่างล่วงหน้า

    คลาสถัดไป - กล่องจดหมาย - ออกแบบมาเพื่อสิ่งนี้โดยเฉพาะ

    class Inbox ( /** * Array of gets message. */ var $messages = array(); /** * ใน Constructor เราได้รับข้อความที่ได้รับทั้งหมด * และลบออกจากเซสชัน */ function Inbox() ( if (is_array($ _SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); สำหรับ ($i = 0; $i< $co; $i++) { $this->ข้อความ = ข้อความใหม่($ข้อความ[$i]); ) ) /* ล้างอาร์เรย์ข้อความ */ $_SESSION["session_messages"] = array(); ) /** * แสดงเนื้อหาใน Inbox บนเพจ */ function toPage() ( $co = sizeof($this->messages); if ($co > 0) ( echo "ข้อความจากระบบ:
    "; ) สำหรับ ($i = 0; $i< $co; $i++) { $this->ข้อความ[$i]->ToPage(); -

    มาลองใช้ระบบส่งข้อความของเรากัน

    มาสร้างตัวอย่างง่ายๆ ที่จะตอบสนองต่อการส่งแบบฟอร์มโดยการรายงานจำนวนวินาทีในนาทีปัจจุบัน

    เราซ่อนงานทั้งหมดที่มีอาร์เรย์และเซสชันไว้ในคลาส และโค้ดสุดท้ายก็ดูเรียบง่ายและสวยงาม

    สร้างไดเร็กทอรีบนเว็บเซิร์ฟเวอร์ของคุณ จากนั้นสร้างไฟล์ทั้งสามนี้ในไดเร็กทอรีและลองใช้สคริปต์ โปรดทราบว่าไม่มีปัญหากับปุ่มย้อนกลับและรีเฟรช

    ตอนนี้ลองจินตนาการว่าคุณกำลังสร้างพอร์ทัลที่ซับซ้อน โดยที่ตามกฎแล้วจะมีหลายบล็อกบนเพจ และแต่ละบล็อกสามารถมีแอปพลิเคชันแยกต่างหากได้

    ที่นี่เราพบปัญหาสองประการ:

    * ฉันต้องการให้รายการข้อความปรากฏในส่วนใดส่วนหนึ่งของหน้า และคุณพบที่ที่ดีสำหรับสิ่งนี้แล้ว
    ปัญหาคือคุณต้องรันคำสั่ง $inbox->toPage() ในเวลาเดียวกับตำแหน่งรายการข้อความบนเพจ หากเราต้องการเปลี่ยนตำแหน่งของรายการนี้ เราจะต้องเข้าไปในโค้ด แต่การเปลี่ยนเฟรมพอร์ทัลอย่างต่อเนื่องสำหรับสิ่งนี้ไม่ดี ทางออกที่ดีที่สุดคือสร้างเอาต์พุตข้อความในรูปแบบของโมดูลแยกต่างหาก ซึ่งเรารู้เพียงว่าจำเป็นต้องเชื่อมต่อกับเฟรมเวิร์ก
    นั่นคือปลดปล่อยตัวเองจากลำดับการเปิดตัวโมดูลที่เข้มงวด อันที่จริง เนื่องจากผลลัพธ์ของเอาต์พุต Inbox ไม่ได้ขึ้นอยู่กับการทำงานของระบบ (ในขั้นตอนนี้ เรามีข้อมูลทั้งหมดในเซสชันอยู่แล้ว) แล้วเหตุใดจึงมีความซับซ้อนเป็นพิเศษ
    * เพื่อรักษาลักษณะที่ปรากฏ (การออกแบบ) ของรายการข้อความ คุณต้องดูแลโค้ด HTML ซึ่งได้รับการฮาร์ดโค้ดในเมธอด toPage() ของคลาสข้อความและกล่องจดหมาย โดยปกติ คุณจะต้องเปลี่ยนโค้ด PHP เพื่อเปลี่ยนการออกแบบ

    เมื่อต้องการแก้ไขปัญหาแรก คุณสามารถสร้างบัฟเฟอร์ที่เก็บผลลัพธ์ของผลลัพธ์ของกล่องจดหมายเข้า

    บางทีเราอาจยังมีหลายอย่างที่คล้ายกัน (ไปยังกล่องจดหมาย) และเราจำเป็นต้องสร้างระบบบัฟเฟอร์ เพื่อไม่ให้เกิดความสับสนว่าเอาต์พุตของใครเป็นของใคร เราอาจจะต้องตั้งชื่อบัฟเฟอร์ เราจะจัดเก็บลำดับไว้ที่ไหนสักแห่งตามที่บัฟเฟอร์ควรจะส่งออก - ควรเก็บไว้ในไฟล์ภายนอกเพื่อให้การเปลี่ยนแปลงง่ายขึ้น

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

    ฉันจะไม่เน้นว่า XML คืออะไรและ XSLT คืออะไร หากคุณไม่คุ้นเคยกับสิ่งเหล่านี้ zvon.org เป็นสถานที่ที่ดีในการเริ่มค้นหา

    แนวคิดคือการสร้างไม่ใช่โค้ด HTML แต่เป็นโครงสร้าง XML ในเมธอด toPage() เอกสารหน้าจะถูกสร้างขึ้นเป็นสตริงที่มีโค้ด XML (ซึ่งจะทำหน้าที่เป็น "บัฟเฟอร์") และในขั้นตอนสุดท้ายของสคริปต์ เราจะใช้การแปลง XSL

    ขั้นแรก ลองจินตนาการว่าส่วนหลักของโค้ดควรได้รับผลลัพธ์อย่างไร

    นาที 57 วินาที: 45

    มันค่อนข้างง่ายที่จะเดา - สองข้อความและแบบฟอร์ม โปรดทราบว่าสคริปต์ PHP จำเป็นต้องเตรียมสตริงดังกล่าวเท่านั้น - มันง่ายมาก ยิ่งกว่านั้นลำดับของแท็กหลักนั้นไม่สำคัญ - คุณสามารถใส่ไว้ก่อนได้ซึ่งจะสะดวกสำหรับโปรแกรมเมอร์ วิธีการปฏิบัติ คุณสามารถใช้การบัฟเฟอร์เอาท์พุต เอาท์พุต XML แทนโค้ด HTML ได้โดยไม่ต้องเปลี่ยนแปลงอะไรเลย และสุดท้ายก็แค่จับเอาท์พุตเป็นสตริง แต่แล้วเราจะสูญเสียความยืดหยุ่น - ตัวอย่างเช่น บางครั้งคุณต้องการส่งข้อมูลการดีบักไปยังเพจโดยตรง (โดยใช้เสียงก้อง) ในเวลาเดียวกัน นักพัฒนา PHP กำลังทำงานบนโมดูล DOM ที่นำเสนอวิธีการขั้นสูงในการสร้างและส่งผ่านเอกสารแบบต้นไม้ หากเราต้องการนำ DOM ไปใช้ เราจะต้องออกแบบแอปพลิเคชันใหม่ทั้งหมด โดยเปลี่ยนเอาต์พุตของสตริงเป็นการสร้างองค์ประกอบ DOM ดังนั้น ฉันชอบที่จะจัดเก็บการแสดง XML ของออบเจ็กต์ภายในออบเจ็กต์เอง โดยประกอบเอกสาร XML ทั่วไปตามลำดับ มันไม่ได้ยากขนาดนั้น แค่ต้องมีการปรับเปลี่ยนเล็กน้อย คุณจะเห็นว่าเทคนิคนี้ไม่ได้ผูกติดอยู่กับวิธีการจัดเก็บข้อมูล XML เฉพาะเจาะจงอย่างเคร่งครัด และจะช่วยให้คุณสามารถเปลี่ยนไปใช้ DOM ได้อย่างง่ายดาย ก่อนอื่น โปรดสังเกตว่าแต่ละออบเจ็กต์ของเรามีเมธอด toPage() ความคล้ายคลึงกันนี้น่าจะทำให้เราคิดถึงการแนะนำคลาสพาเรนต์ทั่วไปใหม่ ให้แต่ละคลาสที่สามารถสร้างชิ้นส่วนของเอกสาร XML สำหรับเพจสืบทอดจากคลาสที่จะดูแลการแสดง XML ของออบเจ็กต์ ลองเรียกมันว่า Outputable

    class Outputable ( /** * คอนเทนเนอร์ XML (สตริง) */ var $output = ""; /** * ระบุเนื้อหาของคอนเทนเนอร์และล้างคอนเทนเนอร์ * * @return สตริงที่มีข้อมูล XML */ ฟังก์ชั่น getOutput () ( $ out = $this->output; $this->output = ""; return $out; ->output .= $string . "n" ) /** * "Abstract" method */ function toPage( ) ( ) )

    เมธอด toPage() ถูกทำให้ว่างเปล่า - ในกรณีนี้จำเป็นต้องใช้เป็นตัวบ่งชี้ว่าคลาส "matryoshka" ภายนอกควรสื่อสารกับคลาสภายในอย่างไร อย่างไรก็ตาม เราสามารถเสนอการใช้งานเริ่มต้นได้ที่นี่ หากเราสังเกตเห็นว่ามีออบเจ็กต์จำนวนมากที่แสดงตัวเองบนหน้าเว็บในลักษณะเดียวกัน

    คลาส Message และ Inbox จะเปลี่ยนไปเล็กน้อย - ตอนนี้ทั้งคู่ควรสืบทอดจาก Outputable และวิธีการ toPage() ก็จะเปลี่ยนไปเช่นกัน
    ข้อความ.php

    class Message ขยาย Outputable ( /** * Message content. */ var $content; /** * Constructor สำหรับการเริ่มต้นข้อความ * * @param content เนื้อหาข้อความ */ function Message($content) ( $this->content = $content; ) /** * เขียนข้อความไปที่ session */ function send() ( $_SESSION["session_messages"] = $this->content; ) /** * ส่งข้อความไปยังเพจ ( $ นี้->ผนวกOutput("".$this->เนื้อหา"");

    class Inbox ขยาย Outputable ( /** * Array ของข้อความที่ได้รับ */ var $messages = array(); /** * ใน Constructor เราได้รับข้อความที่ได้รับทั้งหมด * และลบออกจากเซสชัน */ function Inbox( ) ( if (is_array ($_SESSION["session_messages"])) ( $messages = $_SESSION["session_messages"]; $co = sizeof($messages); สำหรับ ($i = 0; $i< $co; $i++) { $this->ข้อความ = ข้อความใหม่($ข้อความ[$i]); ) ) /* ล้างอาร์เรย์ข้อความ */ $_SESSION["session_messages"] = array(); ) /** * แสดงเนื้อหาใน Inbox บนเพจ */ function toPage() ( $co = sizeof($this->messages); $this->appendOutput(""); for ($i = 0; $i< $co; $i++) { $this->ข้อความ[$i]->toPage(); $this->appendOutput($this->ข้อความ[$i]->getOutput()); ) $this->appendOutput(""); -

    วิธีการส่งออกมีการเปลี่ยนแปลง - ขณะนี้ แทนที่จะส่งออกไปยังเพจโดยตรง การแสดงภายนอกจะใช้สำหรับเวลาที่ถูกจัดเก็บไว้ใน Outputable ซึ่ง "อยู่" ในแต่ละออบเจ็กต์ วิธีการ appendOutput() ทำหน้าที่แทนโครงสร้าง echo() ในการรับเอาต์พุตของอ็อบเจ็กต์ จะใช้เมธอด getOutput()

    ทีนี้มาดูกันว่าส่วนไคลเอนต์ของโค้ดคืออะไรซึ่งจะแก้ปัญหาเดิมได้
    ดัชนี.php

    นวัตกรรมหลักอยู่ในวัตถุ $global_content ซึ่งเป็นชื่อที่พูดเพื่อตัวเอง ในกรณีนี้ เป็นของคลาส Outputable ในงานจริง คุณอาจสร้างคลาสแยกต่างหากสำหรับเนื้อหาของเพจ

    หากคุณมองอย่างใกล้ชิด เนื้อหาของสคริปต์ไม่ได้เปลี่ยนแปลงเลย - กล่องจดหมายเดียวกัน toPage() เดียวกัน เพิ่มคำสั่งที่แสดงเนื้อหาของรายการข้อความในเนื้อหาหน้า เพื่อความหลากหลาย ขณะนี้มีการสร้างข้อความสองข้อความ

    หากต้องการดูผลลัพธ์ สิ่งที่เหลืออยู่คือการเตรียมเทมเพลต XSL
    สไตล์.xsl

    ตัวอย่าง XSLT

    ข้อความ

    เราประสบความสำเร็จอะไรบ้าง?

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

    โมดูลใดๆ ที่สร้างข้อมูล XML จากการทำงานสามารถนำมาใช้ในโครงการได้ อย่างไรก็ตาม นี่เป็นข้อดีประการหนึ่งเหนือเอ็นจิ้นเทมเพลตซึ่งการสร้างข้อมูลประกอบด้วยลำดับวิธีการเรียก (กำหนด ฯลฯ ) ของเอ็นจิ้นเฉพาะซึ่งไม่มีมาตรฐานทั่วไป

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

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

    ในที่สุด การควบม้าเกี่ยวกับโอกาส:

    * หน้าต่างป๊อปอัปสำหรับรายการข้อความสำคัญ
    * "หน้าผู้ส่ง" และ "หน้าปลายทาง" ในข้อความ
    * บันทึกข้อความในฐานข้อมูล
    * ปุ่ม "แสดงประวัติการกระทำของฉัน"
    * การวิเคราะห์ทางสถิติของการกระทำของผู้ใช้ภายในเซสชัน
    * "ผู้ช่วยอัจฉริยะ" ในเว็บแอปพลิเคชัน

    ในแอป Zend ของฉัน ฉันกำลังเขียน API เล็กน้อยสำหรับแอปมือถือ เพื่อให้นักพัฒนามือถือง่ายขึ้น ฉันจึงใช้ Swagger จนถึงตอนนี้ทุกอย่างทำงานได้ดี ยกเว้นคำขอ GET คำขอเดียว

    ฉันจะโทรติดต่อ /user/messages/(sessionToken) เมื่อใด NumMessages = (numMessages) & pageNr = (pageNr) ในเบราว์เซอร์ ฉันได้ผลลัพธ์ที่ต้องการ แต่เมื่อฉันพยายามให้ Swagger ดำเนินการตามคำขอนี้ เฉพาะ sessionToken เท่านั้นที่จะถูกส่งผ่าน ฉันลองใช้คำอธิบายประกอบเหล่านี้สำหรับ Swagger:

    /** * @SWG\Api(path="/user/messages/(sessionToken)?numMessages=(numMessages)&pageNr=(pageNr)", * @SWG\Operation(* method = "GET", * สรุป = รับข้อความที่เพจ", * Notes="", * type="string", * name="getUsermessagesPaged", * authorizations=(), * @SWG\Parameter(* name="sessionToken", * description="The token จากเซสชันผู้ใช้ที่ใช้งานอยู่", * required=true, * type="string", * paramType="path", * AllowMultiple=true *), * @SWG\Parameter(* name="numMessages", * description=" จำนวนข้อความบนเพจ (numMessages & pageNr จะถูกละเว้นหากไม่ได้ตั้งค่าทั้งสองอย่าง)", * required=true, * type="string", * paramType="query", * AllowMultiple=true *), * @SWG\Parameter (* name="pageNr", * description="pagenumber (numMessages & pageNr จะถูกละเว้นหากไม่ได้ตั้งค่าทั้งสองอย่าง)", * required=true, * type="string", * paramType="query", * AllowMultiple=true *), * @SWG\ResponseMessage(code=200, message="json (messages => "user_messages")"), * @SWG\ResponseMessage(code=400, message="json พร้อมข้อผิดพลาด "ไม่ได้เข้าสู่ระบบ"" ) *) *) */

    มีใครเห็นความผิดพลาดของฉันบ้างไหม?

    ยินดีต้อนรับความช่วยเหลือใด ๆ

    ขอแสดงความนับถือ

    อัปเดต. ตามที่แนะนำ ฉันเปลี่ยน paramTypes ทั้งสองเป็น "query" และเปลี่ยนเส้นทาง:

    @SWG\Api(path="/user/messages/(sessionToken)",

    แต่เขาไม่ได้ทำงานเป็นนักสู้

    xdebug ใน eclipse PDT แสดง:

    RequestURI => /ias/public/user/messages/(sessionToken)

    QueryParams => Zend\\Stdlib\\Parameters - *ArrayObject*storage => Array - =>

    JSON กร่าง:

    ( "apiVersion": "1.0.0", "swaggerVersion": "1.2", "apis": [ ( "path": "\/user", "description": "การดำเนินการเกี่ยวกับผู้ใช้" ) ], "info" : ( "title": "Mobile access api", "description": "นี่คือ xxx mobile access api", "termsOfServiceUrl": null, "contact": "xxx", "license": null, "licenseUrl" : null, "_partialId": null, "_partials": , "_context": ( "ความคิดเห็น": "\/**\ * @SWG\\Info(\ * title="Mobile access api",\ * description="This is the xxx mobile access api.",\ * contact="xxx",\ *)\ *\/", "line": 3 } } } !}

    นี่คือผลลัพธ์ /user:

    ( "basePath": "http://localhost/ias/public", "swaggerVersion": "1.2", "apiVersion": "1.0.0", "resourcePath": "/user", "apis": [ ( "path": "/user/balance/(sessionToken)", "operations": [ ( "method": "GET", "summary": "รับยอดคงเหลือของผู้ใช้", "ชื่อเล่น": "getUserdata", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "โทเค็นจากเซสชันผู้ใช้ที่ใช้งานอยู่" ) ], "responseMessages": [ ( "code": 200, "message": "json (balance => "user_balance")" ), ( "code": 400, "message ": "json ที่มีข้อผิดพลาด "ไม่ได้เข้าสู่ระบบ"" ) ], "notes": "", "การอนุญาต": () ) ]), ( "path": "/user/login", "operations": [ ( "method": "POST", "summary": "บันทึกผู้ใช้เข้าสู่ระบบ", "ชื่อเล่น": "loginUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "email", "type": "string", "required": true, "allowMultiple": false, "description": "อีเมลผู้ใช้สำหรับการเข้าสู่ระบบ" ), ( "paramType": "form", "name": "password", "type": "string", "required": true, "allowMultiple": false, "description": "รหัสผ่านสำหรับการเข้าสู่ระบบในรูปแบบข้อความที่ชัดเจน" ) ], "responseMessages": [ ( "code": 200, "message": "json with session_id, user_id, user_balance" ), ( "code": 400, "message": "json มีข้อผิดพลาด "ไม่มีผู้ใช้ที่ได้รับอีเมลและรหัสผ่าน"" ), ( " code": 400, "message": "json มีข้อผิดพลาด "อินพุตไม่ถูกต้อง"" ), ( "code": 400, "message": "json มีข้อผิดพลาด "no post request"" ) ], "notes": "" , "การอนุญาต": () ) ] ), ( "path": "/user/logout", "operations": [ ( "method": "POST", "summary": "ออกจากระบบผู้ใช้", "ชื่อเล่น" : "logoutUser", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, " AllowMultiple": false, "description": "โทเค็นจากเซสชันผู้ใช้ที่ใช้งานอยู่" ) ], "responseMessages": [ ( "code": 200, "message": "json (result => "deleted")" ), ( "รหัส": 400, "ข้อความ": "json มีข้อผิดพลาด "ไม่มี user_session พร้อม sid ที่กำหนด"" ), ( "รหัส": 400, "ข้อความ": "json มีข้อผิดพลาด "อินพุตไม่ถูกต้อง"" ), ( "รหัส ": 400, "message": "json มีข้อผิดพลาด "no post request"" ) ], "notes": "", "authorizations": () ) ]), ( "path": "/user/messages/( sessionToken)", "operations": [ ( "method": "GET", "summary": "รับข้อความใหม่", "ชื่อเล่น": "getUsermessages", "type": "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "โทเค็นจากเซสชันผู้ใช้ที่ใช้งานอยู่" ) ], "responseMessages": [ ( "รหัส": 200, "ข้อความ": "json (ข้อความ => "user_messages")" ), ( "รหัส": 400, "ข้อความ": "json ที่มีข้อผิดพลาด "ไม่ได้เข้าสู่ระบบ "" ) ], "notes": "", "การอนุญาต": () ), ( "method": "GET", "summary": "รับข้อความที่เพจ", "ชื่อเล่น": "getUsermessagesPaged", "type" : "string", "parameters": [ ( "paramType": "path", "name": "sessionToken", "type": "string", "required": true, "description": "โทเค็นจาก เซสชันผู้ใช้ที่ใช้งานอยู่" ), ( "paramType": "query", "name": "numMessages", "type": "string", "required": true, "description": "จำนวนข้อความบนเพจ (numMessages & pageNr จะถูกละเว้นหากไม่ได้ตั้งค่าไว้ทั้งคู่)" ), ( "paramType": "query", "name": "pageNr", "type": "string", "required": true, "description": "pagenumber ( numMessages & pageNr จะถูกละเว้นหากไม่ได้ตั้งค่าทั้งคู่)" ) ], "responseMessages": [ ( "code": 200, "message": "json (messages => "user_messages")" ), ( "code": 400 , "message": "json ที่มีข้อผิดพลาด "ไม่ได้เข้าสู่ระบบ"" ) ], "notes": "", "การอนุญาต": () ) ]), ( "path": "/user/userdata", "operations" : [ ( "method": "POST", "summary": "โพสต์ข้อมูลผู้ใช้", "ชื่อเล่น": "postUserdata", "type": "string", "parameters": [ ( "paramType": "form", "name": "sessionToken", "type": "string", "required": true, "allowMultiple": false, "description": "โทเค็นจากเซสชันผู้ใช้ที่ใช้งานอยู่" ), ( "paramType": "form ", "name": "password", "type": "string", "required": false, "allowMultiple": false, "description": "รหัสผ่านใหม่" ), ( "paramType": "form", " name": "address", "type": "string", "required": false, "allowMultiple": false, "description": "new address" ), ( "paramType": "form", "name": "housenr", "type": "string", "required": false, "allowMultiple": false, "description": "new housenr" ), ( "paramType": "form", "name": "zip" , "type": "string", "required": false, "allowMultiple": false, "description": "new zip" ), ( "paramType": "form", "name": "city", "type ": "string", "จำเป็น": false, "allowMultiple": false, "description": "เมืองใหม่" ), ( "paramType": "form", "name": "email", "type": " string", "required": false, "allowMultiple": false, "description": "new email" ) ], "responseMessages": [ ( "code": 200, "message": "json (ผู้ใช้ => "userdata" ")" ), ( "code": 400, "message": "json มีข้อผิดพลาด

    ดูเหมือนว่ามีข้อผิดพลาดที่ swagger-ui ของฉันไม่ส่งพารามิเตอร์คำขอใด ๆ ใช่ไหม นี่คือตัวอย่างที่มีพารามิเตอร์แบบสอบถามหนึ่ง sessionToken: (ควบคุมโดย FireBug 2.0.6)

    GET /ias/public/user/balance HTTP/1.1 โฮสต์: localhost ตัวแทนผู้ใช้: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 ยอมรับ: application/json ยอมรับภาษา: de, en-US;q=0.7,en;q=0.3 ยอมรับ-เข้ารหัส: gzip, deflate ประเภทเนื้อหา: application/json ผู้อ้างอิง: http://localhost/ias/swagger/ คุกกี้: __utma=111872281.581414660.1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set การเชื่อมต่อ: Keep-alive

    คำตอบคือ:

    HTTP/1.1 400 วันที่คำขอไม่ถูกต้อง: วันอังคารที่ 25 พฤศจิกายน 2014 เวลา 14:58:20 น. GMT เซิร์ฟเวอร์: Apache/2.4.9 (Win32) PHP/5.5.12 X-Powered-By: PHP/5.5.12 ความยาวเนื้อหา: 25 การเชื่อมต่อ: ปิด ประเภทเนื้อหา: application/json; ชุดอักขระ=utf-8

    คำตอบนั้นถูกต้องเนื่องจากไม่มีการผ่าน sessionToken

    สิ่งนี้ต้องอาศัยการทำงาน แต่ไม่ได้มาจากการผยอง-ui:

    GET /ias/public/user/balance?sessionToken=HTTP/1.1 โฮสต์: localhost User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0 ยอมรับ: text/html,application/ xhtml+xml,application/xml;q=0.9,*/*;q=0.8 ยอมรับ-ภาษา: de,en-US;q=0.7,en;q=0.3 ยอมรับ-เข้ารหัส: gzip, ยุบคุกกี้: __utma=111872281.581414660 .1366700677.1394721873.1394723866.255; uvts=sB5Dda3cZBNdaTk; searchpanel-close=set การเชื่อมต่อ: Keep-alive