Skip to main content

ลองทำ Sandboxed Workflow Action

Submitted by ezybzy on

มีเหตุให้ต้องทำ Sandboxed Workflow Action เนื่องจาก Workflow Action แบบปกติที่อยากทำดันไม่สามารถ Deploy ลงเครื่องได้เพราะไม่สามารถแก้ web.config ได้ พาลเอา Workflow Action ตัวที่เคย Deploy ได้ติดตั้งซ้ำไม่ได้ไปด้วย ลองดูตัวอย่างจาก Wictor Wilén แล้วนำมาทำตามซึ่งก็พบว่าเขาก็ไม่ได้อธิบายไปเสียทุกอย่าง ต่อไปนี้เป็นสรุปว่าจริง ๆ แล้วต้องทำอย่างไรถึงจะได้

ขั้นตอนการทำแตกต่างไปหน่อย เริ่มด้วยการสร้าง SharePoint Project แบบ Sandboxed ขึ้นมา จากนั้นสร้าง public class 1 อัน สร้าง public static method ที่มี return type เป็น System.Collections.Hashtable มี Argument ตัวแรกเป็น Microsoft.SharePoint.UserCode.SPUserCodeWorkflowContext เสมอ (มีหลาย Argument ได้แต่ต้องเป็น type ที่สามารถใช้กับ Workflow ได้ ตัวอย่างเช่น

public static Hashtable MyAction(SPUserCodeWorkflowContext context, string colA, string colB)

วิธีตั้งชื่อ Argument มีผลในขั้นต่อไปดังนั้นระวังเรื่องการสะกดให้ดี ส่วนเนื้อของ Method สร้าง Hashtable ขึ้นมา 1 ตัว กำหนดคีย์ที่ต้องการใช้คืนค่าออกมา (ถ้าอยากจะให้คืนค่าออกมา) จะไม่กำหนดก็ได้ ตัว context นี้จะไม่เหมือน Microsoft.SharePoint.WorkflowActions.WorkflowContext เสียทีเดียว แต่เป็นแค่ object ในนั้น ดังนั้นต้องใช้ฝีมือในการพลิกแพลงพอสมควร

ขั้นต่อมาสร้าง Module ขึ้นมา 1 อัน ในนั้นเราจะได้ elements.xml และไฟล์ตัวอย่าง 1 อันลบไปได้เลย ส่วนใน elements.xml สามารถลบไส้ในได้เลยเก็บไว้แค่ node Elements สร้าง node ลูกชื่อ WorkflowActions จากนั้นสามารถนำใส้ในจากไฟล์ .actions เดิมส่วนของ node Action มาใช้ได้ทันที มีสิ่งที่เป็นข้อสังเกตดังนี้

  • ต้องเพิ่ม attribute SandboxedFunction="true" ให้กับ node Action
  • node Action attribute ClassName สามารถใช้ replaceable token ได้ (ต้องไปตั้ง Guid ให้กับ class ที่เราสร้างขึ้นมา) โดย Guid ที่นำมาใช้ที่นี่ต้องเขียนเป็นอักษรตัวเล็ก เช่น $SharePoint.Type.your-guid-here.FullName$
  • node Action attribute FunctionName เป็นชื่อของฟังก์ชั่นที่เราตั้งขึ้นมา
  • node Parameters ต้องมีลูกเป็น node Parameter เป็น อย่างน้อย 1 ตัว เพื่อเรียกใช้งาน context ในโค้ดของเรา
  • node Parameters หากจะทำ Parameter ให้คืนค่าออกมา (ผ่านทาง Hashtable) ให้สร้าง node Parameter ตั้งชื่อให้ตรงกับคีย์ที่สร้างให้กับ Hashtable (มีหลายคีย์ได้) ค่า attribute ตามนี้ Type="System.String, mscorlib" Direction="Out" DesignerType="ParameterNames" หากไม่มีไม่ต้องใส่ เพราะอาจจะเกิดปัญหา SharePoint Designer แจ้งว่ากำหนดค่าให้ตัวแปรไม่ครบได้

จากนั้นสร้าง Feature ขึ้นมากำหนดให้ Scope เป็น Site แล้วเพิ่ม Module นี้เข้าไปกับ Feature

หลังจากนี้ Build, Package แล้วนำไป Deploy ได้เลย เมื่อ Activate Solution และ Activate Site Feature เปิด SharePoint Designer ใน Site Collection ที่ติดตั้งจะพบ Workflow Action ของเราให้ใช้งานได้

MSDN.aspx "How to: Create and Deploy Workflow Actions in Sandboxed Solutions") ก็ได้เขียน How to ไว้เหมือนกัน ถ้าตกหล่นอะไรก็อ่านเพิ่มเติมจากในนี้ได้