Return field as ของ People Picker กับ SharePoint Workflow

Submitted by ezybzy on Wed, 2012-09-12 - 14:17

ช่วงนี้ชีวิตยุ่งอยู่กับแต่ SharePoint Workflow ทำผิดแล้วผิดอีกแบบงง ๆ ก็เลยเอาบทเรียนเรื่อง Return field as ของ People Picker มาสรุป จะได้ไม่ทำผิดซ้ำอีก

หากต้องการส่งเมล์ด้วย Approval, Feedback, Custom Task ให้ตั้ง Return field as เป็น Login Names, Semicolon Delimited หรือ Login Name เสมอมิเช่นนั้นจะส่งเมล์ไม่ได้

หากต้องการจัดการ Permission ด้วย Action ต่าง ๆ ใน Impersonate Step ให้ตั้ง Return field as เป็น As String เสมอมิเช่นนั้นมันจะไปต่อไม่ได้

Blog Tags

จะทำ Query เหรอลองใช้ Search แทนซิ!

Submitted by ezybzy on Tue, 2012-08-14 - 20:47

เปิดไปเจอบทความหนึ่งของเว็บ SharePoint ของคนเยอรมัน (แต่เขียนเป็นภาษาอังกฤษนะ) เขาตั้งโจทย์ว่าเขาอยากจะทำ Query แสดงรายการ Blog ที่อยู่ใน Subsite หลาย ๆ แห่ง (จำไม่ได้ว่าเขียนถึงขั้นว่าต่าง Site Collection เลยไหม)

ถ้าเป็น Developer ทั่ว ๆ ไปคงบอกว่า ก็เขียนโปรแกรมลูปเอาซิ ดัก SPTemplateType เอาก็ได้ แต่ทางออกของเว็บนั้นก็ทำให้ผมผิดคาดนะ เขาบอกว่าใช้ Search ซิ ไหน ๆ มันก็ต้องวิ่ง Crawl อยู่แล้วก็เอาผลลัพธ์การ Crawl มาแสดงแทนไง

วิธีเขาคือ ตั้ง Search scope ให้ครอบคลุม Site ที่เราต้องการ แล้วก็ใช้ Web Part แสดงผลการค้นหามาวางในหน้าเว็บ แล้วก็เขียนเงื่อนไขดี ๆ ว่าจะให้แสดงเฉพาะ Blog เท่านั้นแล้วก็ใช้ XSL ปรับแต่งหน้าตาแสดงผล

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

ข้อดีอีกอย่างของ Search คือ อย่างน้อยมันก็พอจะทราบว่า User ที่เปิดชมหน้านั้นมีสิทธิ์ในการเข้าถึงข้อมูลหรือไม่ ซึ่งทำได้ค่อนข้างยากหากเขียนโปรแกรมลูปเอาเอง แล้วก็ดีในแง่การจัดการ Cache ข้อมูล เพราะถ้าเขียนเองก็คงจะเป็นไปได้ยากในการจัดการ Cache เพราะต้องเขียน Code จัดการเองซึ่งมักจะทำได้ออกมาไม่ดีเท่าไรสู้ของที่ระบบทำเองไม่ได้

Blog Tags

ปรับเปลี่ยนหน้าตา Feed ของ SharePoint

Submitted by ezybzy on Thu, 2012-07-26 - 14:00

ด้วยความซน จึงเข้าไปคุ้ย /_layouts/feed.aspx เพื่อดูว่ามันทำงานอย่างไรก็พบกับเรื่องประหลาดใจที่ว่าเบื้องหลังไฟล์นี้คือการเรียกใช้งาน ContentByQueryWebPart ดื้อ ๆ เลยโดยมีการให้ Parameter ต่าง ๆ ที่มันต้องการผ่านทาง Query String หนึ่งในพารามิเตอร์ที่เราสนใจคือ xsl=1 ทำไมต้องเป็น 1 ล่ะ?

Blog Tags

ติดตั้ง SharePoint 2013 แบบ All-in-one

Submitted by ezybzy on Sun, 2012-07-22 - 21:40

ได้ลองตั้ง SharePoint 2013 เพื่อจะดูว่ามีอะไรใหม่ ๆ น่าสนใจบ้างก็เลยสรุปประสบการณ์มาให้อ่านกัน

การติดตั้งนี้ทำบน VM ทั้งหมด ใช้ Client เพียงเครื่องเดียว สิ่งที่ติดตั้งประกอบไปด้วย

  • Windows Server 2012 Release Candidate Datacenter
  • SQL Server 2012 Developer Edition
  • SharePoint Server 2013 Preview
  • Office Professional Plus 2013 Preview
  • SharePoint Designer 2013 Preview
  • Visual Studio Ultimate 2012 Release Candidate

ความต้องการแบบ All-in-one ทำให้ต้องเพิ่ม Role ชื่อ Active Directory Domain Services แล้วจึงติดตั้ง SQL Server และ SharePoint ตามลำดับ พื้นที่ที่ใช้จริงตกราว 30GB (ขนาดไฟล์ VM)

การติดตั้งถือว่าง่ายครับ คล้าย ๆ ตอนติดตั้ง SharePoint Server 2010 เลย เพราะตัวติดตั้ง Prerequisite จะทำหน้าที่ Enable Role ต่าง ๆ ที่เกี่ยวข้องให้หมดเลย (Role บางส่วนก็ถูก Enable ตั้งแต่ติดตั้ง SQL Server แล้ว ซึ่งจะมีบางส่วนที่จะมีการดาวน์โหลดไฟล์จากอินเตอร์เน็ต ได้แก่การติดตั้ง .NET Framework 3.5)

เมื่อติดตั้ง Visual Studio เสร็จต้องติดตั้งตัว Update ประจำ July หนึ่งตัว เพื่อที่จะติดตั้งเครื่องมือสำหรับพัฒนา SharePoint 2013 เพิ่มอีกที

สัปดาห์หน้าน่าจะได้ลองติดตั้งเล่นกับอะไรที่เก่ากว่าคือ Windows Server 2008 R2 Service Pack 1 และ SQL Server 2008 R2 Service Pack 1 ก็จะได้เห็นว่าจะมีอะไรติดขัดอีกบ้าง

Blog Tags

ให้สิทธิ์ในการ Deploy WSP ใน SharePoint 2010

Submitted by ezybzy on Fri, 2012-07-20 - 16:38

เมื่อเราเริ่มตั้ง Environment สำหรับการพัฒนา การแยก User ของนักพัฒนาออกจากกันดูจะเป็นเรื่องที่เข้าท่า เพราะสไตล์การพัฒนาของนักพัฒนาแต่ละคนที่แตกต่างกัน (คนละรำคาญการปิดหน้าต่างที่จำเป็นการใน Debug เสียจริง) แต่เมื่อแยก User ออกมาแล้วเราก็จะพบปัญหาเรื่องสิทธิ์ในการเข้าถึงเว็บที่จะทดสอบ รวมถึงสิทธิ์ในการติดตั้ง WSP

สำหรับสิทธิ์ในการเข้าถึงเว็บ ปกติจะแก้ได้ด้วยการเพิ่มสิทธิ์ไม่ว่าจะเป็น Farm Administrator หรือ Site Collection Administrator ให้กับผู้ใช้ที่ต้องการ

ส่วนสิทธิ์ในการติดตั้ง WSP จากการค้นหาหลาย ๆ เว็บแนะนำวิธีให้ไปเพิ่มสิทธิ์ db_owner ให้กับ User ที่ต้องการลงใน Database ของ SharePoint เองซึ่งผมมองว่ามันไม่น่าจะเป็นแนวทางที่ Microsoft อยากจะให้ทำเท่าไร แต่แล้วก็พบว่ามีคำสั่ง PowerShell คำสั่งหนึ่งที่จะช่วยเพิ่มสิทธิ์พิเศษนี้ได้ คำสั่งนั้นคือ Add-SPShellAdmin

หลักการคือ การจะสามารถติดตั้ง WSP ได้ ผู้ใช้ต้องมีสิทธิ์ในการจัดการ SharePoint ผ่าน Shell และมีสิทธิ์ในการเข้าถึงฐานข้อมูลที่เกี่ยวข้องใน SharePoint ดังนั้นผู้ใช้คำสั่งคำสั่งนี้ครั้งแรกคือ User ที่สิทธิ์ใหญ่ที่สุดใน SharePoint Farm

คำสั่งน่ารู้คือ

Add-SPShellAdmin -UserName *DOMAIN\Username*

แต่แค่นี้ยังไม่พอครับ คำสั่งนี้แค่เพิ่มให้เขาพร้อมที่จะใช้งาน PowerShell ได้แต่ยังไม่สามารถติดตั้งได้ คำสั่งต่อมาที่ต้องรู้คือ

Add-SPShellAdmin -UserName *DOMAIN\Username* -database *DATABASE_GUID*

ปัญหาคือ เราจะทราบได้อย่างไรว่ามีฐานข้อมูลตัวไหนที่เกี่ยวข้องกับเราบ้าง เพราะถ้าใส่ไม่ครบ อาจจะพบปัญหาคือสั่ง Deploy ลงได้แค่บาง Site Collection กรณีที่ Web Application นั้นมีฐานข้อมูลที่เกี่ยวข้องอยู่หลาย ๆ ก้อน ซึ่งปัญหานี้จะปรากฏใน Event Viewer เป็น EventID 3760 ซึ่งกล่าวถึง Login failure ของฐานข้อมูล

คำสั่งที่น่ารู้อีก 2 คำสั่งคือ Get-SPDatabase และ Get-SPContentDatabase ซึ่งเมื่อศึกษาพารามิเตอร์ที่เกี่ยวข้องก็จะทำให้เราเลือก Content Database ที่เกี่ยวข้องกับ Web Application ของเรา คำสั่ง Get-SPContentDatabase จะแสดงเฉพาะฐานข้อมูลตัวที่ Started อยู่เท่านั้น แต่ไม่ได้แปลว่านี่คือฐานข้อมูลทั้งหมดที่เกี่ยวข้องกับ Web Application ของเรา ซึ่งอาจจะต้องคอยสังเกตจาก EventID 3760 ด้วย

การทดลองครั้งหนึ่งที่ได้ทำคือ ทำการติดตั้ง WSP ใส่ Site Collection 2 ตัวคือ http://foo และ http://foo/bar ผลปรากฏว่าเฉพาะ http://foo ที่ทำการติดตั้งสำเร็จ เนื่องจากบังเอิญว่า http://foo/bar นั้นอยู่บนฐานข้อมูลอีกก้อนที่ไม่อยู่ในสถานะ Started จึงต้องสั่งเพิ่มสิทธิ์ผู้ใช้เข้าฐานข้อมูลก้อนนั้น แล้วจึงทำการติดตั้งได้

จะว่าไปคำว่า Started/Stopped ของ Content Database นี่ก็สร้างความสับสนจริง ๆ เพราะนิยามมันคือ การยอมรับให้มี Site Collection ใหม่เกิดบนตัวมันได้ ซึ่งเมื่อเปลี่ยนเป็นสถานะ Stopped นั่นแปลว่าปิดรับการเพิ่ม Site Collection ไม่ได้ความว่าฐานข้อมูลก้อนนั้นไม่ถูกใช้งาน

Blog Tags