ลงทะเบียนแบบง่ายบน SharePoint

Submitted by ezybzy on Mon, 2012-06-18 - 22:54

ได้รับโจทย์งานมาว่าอยากให้มีการลงทะเบียนก่อนจะเข้าถึงเอกสารทั้ง Library

เพื่อนเสนอมาว่า ทำ Web Part ให้เขากรอกชื่อเลย เราก็ย้อนกลับไปว่า มันก็รู้ชื่อเขาอยู่แล้วจะให้กรอกอีกทำไม เราก็เลยมองไปที่ List Item ผสมกับ Workflow ให้ทำการเพิ่มสิทธิ์ ความคิดผ่านนะ แต่พอเอาไปทำจริง Workflow ดันไม่ทำงานซะงั้น

แต่แล้วก็แว้บความคิดอีกว่า เอ้อ แล้วทำไมไม่ใช้ SharePoint Group ไปตรง ๆ เลย ข้อมูลที่จะกรอกลงทะเบียนมันก็ไม่เห็นจะมีอะไรเลยนี่นะ

ขั้นเตรียมการ เราทำการสร้าง SharePoint Group ขึ้นมา 1 อันแล้วนำไปผูกกับ Library ที่ต้องการแล้วทำการ Stop Inherit Permission แล้วทำการลบ Group หรือบุคคลที่ไม่เกี่ยวข้องออกให้หมด แล้วก็ให้สิทธิ์กับ SharePoint Group นั้นพอสมควร

จากนั้นกลับมากำหนดค่ากับ SharePoint Group ให้อนุญาตให้ Request for joining แล้วก็ตั้งให้ Accept คำขอการเข้ากลุ่มโดยอัตโนมัติ แล้วก็อย่าลืมเอา e-mail ปลายทางออกด้วย เดี๋ยวจะได้เมล์ที่ไม่พึงประสงค์มาเยอะเกินเหตุ (เพิ่งทราบว่าการ Request เข้ากลุ่มใน SharePoint ตัวระบบไม่ได้เก็บสถิติใด ๆ ไว้เลยนอกจากพ่น e-mail ร้องขอออกไปอย่างเดียว ซึ่งในนั้นก็มีเพียงแค่ลิงค์ที่จะนำไปสู่หน้าการตั้งสิทธิ์โดยมีพารามิเตอร์ของผู้ใช้ที่ร้องขอสิทธิ์เท่านั้น!)

มีโจทย์ที่สนุกกว่านั้นอีกหน่อยคือ แล้วจะหลอกล่อให้ผู้ใช้เข้าไป Join Group อย่างไรดี ส่งไปหน้ากลุ่มแล้วให้กด Join Group เอาเองก็ดูจะไม่เข้าท่าเท่าไร ก็เลยได้ข้อเสนอแนะมาว่า ก็จำลองปุ่ม Join Group มาเลยดีกว่าไหม? เหมือนจะง่ายนะ แต่เผอิญว่าปุ่มนั้นใน Code HTML ที่ถูกสร้างขึ้นมาบนหน้าจอ SharePoint ดันให้ลิงค์เป็น javascript: ซึ่งแปลว่าไม่มีลิงค์ให้กดนะ!

เราก็เลยต้องมานั่งแกะว่าจริง ๆ กดแล้วมันทำอะไร ก็ไปพบว่ามันเรียกใช้งาน Javascript function ที่ชื่อ JoinOrLeaveGroupClick() ซึ่งในนั้นก็เป็นการสั่ง __doPostBack() ตามกระบวนการของ ASP.net ก็ดูเหมือนว่าจะสุดทางแล้ว ต่อมาก็คิดต่อว่า แล้วเราจะสั่งมันได้อย่างไร ก็พบว่าเราสามารถแทรกหน้า SharePoint Group ใส่ iframe ได้ เนื่องจากเราไม่ติดข้อจำกัดของ XSS (หน้าแสดงผลกับหน้า SharePoint อยู่บนโดเมนเดียวกัน) เราก็เลยถือโอกาสเขียน Javascript สั่งให้ไปเรียกใช้งานฟังก์ชั่นดังกล่าวใน iframe แทน ซึ่งก็ทำได้ไม่ผิดกติกาอะไร แต่ก็มีเรื่องที่ต้องคิดอีกอย่างคือ การเข้าหรือออกจากกลุ่มมันดันใช้ฟังก์ชั่นเดียวกัน แล้วจะมีหนทางในการตรวจสอบก่อนไหมว่า ผู้ใช้คนนี้อยู่ในกลุ่มแล้วให้ซ่อนปุ่มกดนี้ไป

ก็เลยต้องมานั่งสังเกตว่าเมนูของการ Join Group กับ Leave Group มีข้อแตกต่างอย่างไร ก็พบว่า ในการ Join Group เมนูที่เกิดขึ้นจะมีโครงสร้าง ul ซึ่งประกอบด้วย li แค่อันเดียว แต่การ Leave Group จะเกิด li มา 4 อัน (เป็นเมนู 3 อัน แล้วตัวแบ่งอีก 1 อัน) ซึ่งก็โชคดีอีกว่า li แต่ละตัวมี Attribute ชื่อ id ประกอบด้วย นั่นจึงทำให้สามารถใช้ฟังก์ชั่นหากิน getElementById จัดการตรวจสอบว่าพบ id ของเมนูที่ต้องการหรือไม่ หากพบก็จะสั่งให้ซ่อนปุ่มได้อีกชั้น พบว่าเราต้องใช้วิธีนับจำนวนแถว td ของตารางที่เป็นตัวกำหนดแถบเมนูว่ามีกี่ปุ่ม ซึ่งหากยังไม่ได้เข้ากลุ่มตารางดังกล่าวจะมีจำนวน td 4 อัน (หากเข้ากลุ่มแล้วจะมี 7 อัน)

สังเกตว่าจากเริ่มต้น Programming สุดท้ายก็มาจบลงที่ Javascript ที่ผูกโยงกับการใช้ฟีเจอร์เดิม ๆ ของ SharePoint นั่นเอง บางทีหลังจากผ่านประสบการณ์อะไรมาก ๆ มันก็ทำให้เราคิดได้ว่า ความต้องการบางอย่าง จริง ๆ ใน SharePoint มันก็มีให้อยู่แล้ว การที่จะมานั่งเขียน Code ทำไปทุกอย่างมันก็วุ่นวายเสียแรงเกินไป เรามาใช้มายากลของ HTML ทำดีกว่าง่ายกว่าเยอะ!

Tags