แก้การแสดงผล Search ให้ได้ดั่งใจ

Submitted by ezybzy on Tue, 2013-08-06 - 15:49

บ่อยครั้งที่เมื่อใช้ SharePoint Search ค้นหาข้อมูลใน Portal เราพบกับข้อมูลจริง แต่คำบรรยายข้อมูลดูชวนคลื่นเหียนอาเจียน วิธีการปรับการแสดงผลคำบรรยายให้ดูดีมีสาระนั้นสามารถทำได้หลายแนวทาง กรณีนี้เราจะเลือกวิธีที่สั้นที่สุด ไม่ต้องสร้างหน้าค้นหาเพิ่ม แก้ XML, XSL บน Search Core Web Part อย่างเดียว

ขั้นแรก เราต้องสร้าง Managed Property แล้ว Map กับ Crawled Properties (1 ต่อ 1) อยากใช้กี่ค่าก็สร้างเข้าไป (จำชื่อไว้ด้วยเพราะจะเอาไปใช้ต่อ)

ขั้นที่สอง เปิดหน้าแสดงผลลัพธ์เนื้อหา ทำการแก้ไข Search Core Web Part ในส่วนของ XML และ XSL โดย

  • ปรับ Fetched Properties เพิ่มชื่อ Managed Properties ที่เราสร้างไว้ในขั้นตอนที่แล้ว
  • แก้ XSL แสดงผล มองหา <xsl:when test="hithighlightedproperties/HHTitle[. != '']"> และ <xsl:when test="hithighlightedsummary[. != '']"> แถว ๆ นั้นจะมี xsl:call-template ปรับค่า select เป็นการเชื่อม string ตาม property ที่เราสร้างขึ้นมา (ลองตรวจสอบ XML ผลลัพธ์การค้นหาก่อน -- ไม่ได้อธิบายในบทความนี้) เราอาจจะต้องเพิ่มเงื่อนไขเข้าไปเพื่อที่เมื่อตรวจสอบพบว่ามีค่า property ของเรา จึงส่งข้อความของเราเข้าไป แต่ถ้าไม่มีก็กลับไปใช้รูปแบบเดิม

เพียงเท่านี้ เราก็จะผลลัพธ์ที่ดูเนียนตาขึ้นอีกหน่อย

Blog Tags

แก้คำผิด: Code Snippet: Get User Credentials Using the Default Secure Store Provider

Submitted by ezybzy on Wed, 2013-07-24 - 13:58

จาก Code Snippet: Get User Credentials Using the Default Secure Store Provider

ได้ลองเอา code จากลิงค์ด้านบนไปใช้เพื่ออ่านค่า username, password จาก Secure Store Service แต่พบว่า Code ตัวอย่างนั้นไม่สมบูรณ์ เพราะขาดข้อมูลบางอย่างไป นี่คือสิ่งที่เขาทำตกหล่นไป

  1. ขาดการ Reference ถึง Microsoft.Office.SecureStoreService (อยู่ใน GAC แต่ต้องไปคุ้ยหาเอาจากใน Windows\Assembly)
  2. ต้อง using Microsoft.Office.SecureStoreService; ด้วยอีกอัน

หลังจากนั้นบรรทัด

ISecureStoreProvider provider = SecureStoreProviderFactory.Create();

จะใช้ได้เป็นปรกติ

Blog Tags

ลง Language Pack ให้ SharePoint 2013

Submitted by ezybzy on Thu, 2013-07-04 - 13:22

ในที่สุด Language Pack ภาษาไทยก็ออกมาให้ได้ติดตั้งเสียที กระบวนการติดตั้งก็ไม่ได้ซับซ้อนอะไรมาก แต่ก็อาจจะมีจุดที่ตกหล่นไปบ้าง เราสามารถแบ่งกระบวนการออกได้เป็น 2 กรณีคือ

กรณีการติดตั้งแบบสะอาด (ตั้ง Farm ใหม่, เพิ่มเครื่องใหม่) กรณีนี้ง่ายคาดเดาได้ไม่ยาก คือ ติดตั้ง SharePoint ตามด้วย Language Pack ตามด้วย Hotfix แล้วจึงรัน Configuration Wizard หากนำเครื่องเข้า Farm จำเป็นต้องติดตั้ง Language Pack ในเครื่องอื่น ๆ ก่อนที่จะนำเข้า Farm (ดูกรณีถัดไป)

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

แต่ก็มีประเด็นที่น่าสนใจอีกอย่าง ณ ปัจจุบันนี้ (ต้นกรกฎาคม 2556) ทาง Microsoft ได้ออก Public Update สำหรับ SharePoint ออกมา 1 ตัว (March 2013) แต่เพิ่งจะออก Language Pack ช่วงปลายเมษายน ทำให้ผมไม่แน่ใจว่าจะสามารถติดตั้ง Language Pack ได้ก่อนที่จะติดตั้ง PU หรือไม่ ในขั้นนี้อาจจะต้องเผื่อเวลาในการติดตั้งไว้ด้วย นั่นคือ ติดตั้ง SharePoint / Hotfix / LP / Hotfix ตามลำดับ แต่หากสามารถติดตั้ง LP โดยไม่ต้องติดตั้ง Hotfix ก่อนก็จะลดเวลาลงไปได้พอสมควร ยิ่งกรณีเครื่องที่เริ่มใช้งานแล้ว การติดตั้ง Hotfix แต่ละหนใช้เวลาดำเนินการค่อนข้างนาน อาจไม่ใช่เรื่องสนุกที่จะต้องมานั่งรอการติดตั้ง

Blog Tags

Quick Note: การทำ Cross-site collection Publishing

Submitted by ezybzy on Mon, 2013-07-01 - 17:08

วิธีทำมีมากมายแต่ตัวที่แนะนำให้อ่านคือซีรีย์ How to set up a product-centric website in SharePoint Server 2013 ซึ่งก็ผ่านด้วยดี

แต่ก็พบจุดที่มีปัญหาทั้งบน Publishing Site และ Product Catalog หากมีการเปลี่ยนแปลง Region จะสามารถทำการ Connect ในเมนู Manage catalog connections โดยจะเจอ Error ประหลาดที่ไม่สื่อความหมายใดเลย ประมาณว่า

The value must be at most 64 characters long. Parameter name: Name

ดูไปดูมันก็คล้าย ๆ Exception ที่เกิดจาก LINQ นะ แต่นั่ง Refactor อยู่นานก็หาเหตุผลไม่ได้ว่าทำไม ก่อนหน้าประโยคนี้ใน ULS ก็มีการล็อคข้อความไว้อีกอย่างซึ่งก็ไม่ได้มีข้อบ่งชี้ใดเป็นพิเศษให้หาเจอว่ามาจากไหน ก็เลยทำการลบ Site Collection ทำใหม่โดยไม่เปลี่ยน Region หลังจากนั้นทุกอย่างก็ใช้ได้เป็นปรกติ

เมื่อทำการเชื่อมต่อ Catalog เข้ากับ Publishing Site ของเราแล้ว ระบบจะสร้างหน้าเว็บให้ 2 หน้า (และ Page Layout ของแต่ละหน้า) คือหน้า Catalog เอาไว้แสดงรายการสินค้าหลาย ๆ รายการ และ Catalog Item ไว้แสดงรายละเอียดสินค้าทีละรายการ ตัวอย่างที่พบเห็นทั่วไปมักจะสอนการปรับแต่ง Content Search Web Part กัน อันนี้ก็ไม่ได้ยากเย็นอะไรมากมาย เราต้องแก้ไข Control Template และ Item Template (อยู่ใน _catalogs/Display Templates/Content Web Parts) วิธีการลองอ่านย้อนจาก Stage 11 ในชุดบทความข้างต้นได้

ที่ดูจะมีปัญหาจริง คือหน้า Catalog Item ซึ่งถ้าจะลองดุ่ย ๆ จากหน้าตา SharePoint เลยอาจจะเดาไม่ออกว่าต้องไปแก้ที่ใด จริง ๆ แล้วเราสามารถใช้ SharePoint Designer เข้าไปแก้ Page Layout ของ Catalog Item ได้เลย โดยความเปลี่ยนแปลงที่ต่างไปจาก 2010 ก็คือ ใน 2013 นี้ ระบบสามารถสร้าง Page Layout (ไฟล์ .aspx) ได้จากไฟล์ HTML ที่ชื่อเหมือนกัน (ที่ทำเช่นนี้สามารถนำไปประยุกต์กับการทำ Master Page ได้ด้วย ดูรายละเอียดเพิ่มเติมเรื่อง Design Manager) ทำให้ Designer สามารถใช้ Web Editor ที่ชื่นชอบในการออกแบบหน้าเว็บได้โดยอิสระจากนักพัฒนา เพียงแต่ความยากในเรื่องนี้คือ การที่ Designer จำเป็นต้องใส่ Markup เฉพาะ เพื่อให้ตัว Design Manager สามารถอ่านไฟล์ HTML แล้วแปลงเป็น Page Layout ที่ถูกต้องได้ รายละเอียดตรงนี้สามารถดูได้จาก How to: Create a page layout in SharePoint 2013 และ SharePoint 2013 Design Manager snippets

สำหรับมือใหม่อาจจะงง ว่าแล้วเราจะทราบได้อย่างไรว่าต้องใช้ Markup ใด คำตอบคือ คงต้องผสมระหว่าง Snippet ที่สามารถใช้ Design Manager (ทำงานผ่านหน้าเว็บ) ช่วยสร้าง (มันจะสร้างเป็น code มาให้เรานำไปแปะใน Web Editor ได้เลย) และอาจจะต้องดัดแปลงจาก Page Layout ที่มันสร้างให้ เพราะเอาเข้าจริง code สำเร็จรูปนั้นก็เยอะเกินไป ต้องลดทอนลงมาพอสมควร

เมื่อแก้ไขหน้าเสร็จแล้วก็อย่าลืมนำ url ของหน้าเว็บที่ใช้งาน Page Layout ข้างต้นกลับไปผูกกับ Terms ใน Managed Metadata ของ Catalog ด้วย เพื่อให้ Navigation ของไซต์กดใช้งานได้

Blog Tags

เดา iWatch

Submitted by ezybzy on Mon, 2013-07-01 - 13:02

ข่าวลือ iWatch เยอะเหลือเกิน ผมแค่รู้สึกว่ามันคงเป็น Watch ที่เหมาะจะคู่กับ iPhone/iPod touch/iPad มากกว่า

ตามความคิดของผม iWatch จะเป็นนาฬิกาที่สามารถแสดงผลข้อมูลในกลุ่ม Push Notification รวมถึง Widget App บางตัว (เช่น Weather, Stock) หรืออาจจะทำได้ถึงขั้นล้วงดูข้อมูลของ Built-in App อย่างเช่น Message, Contact, Music และอาจจะมี Siri อยู่ในตัว

ลักษณะการใช้งาน เราต้อง Pair มันเข้ากับ iP device (เฉพาะรุ่นใหม่ นั่นก็คือ iPod touch 5, iPhone 4S, iPad 4 ขึ้นไป) อาจจะผ่าน Wifi หรือ Bluetooth ก็ได้ อาจจะมีปุ่มเพียงแค่หนึ่งปุ่ม เพื่อปลุก/ปิด ที่เหลือก็เป็นการใช้งาน Multitouch แบบที่ iPod nano เคยมี เมื่อมีการแจ้งเตือนใดเข้ามา มันจะปรากฏบน iWatch ซึ่งถ้าเป็น App เช่น Message เราอาจจะใช้ Dictation พูดสั่งให้ตอบข้อความได้ทันที หรือสั่ง Siri ให้ค้นหาข้อมูลให้เราได้คร่าว ๆ ก่อนที่อาจจะส่ง Url ไปยัง iP device เพื่อเปิดผ่าน Safari เมื่อเราปลุก iP device ขึ้นมาก็ได้ พูดง่าย ๆ มันจะช่วยให้เราหยิบ iP device ออกมาจากกระเป๋าให้น้อยลงนั่นเอง

สรุปในแง่ Specification มันน่าจะมีจอสัมผัส, มีไมโครโฟน, มี Bluetooth 4 หรือ Wifi อาจจะมี Lightning หรือใช้ที่ชาร์ตร่วมกับ iPod shuffle ไปเลย (แต่มันคงสร้างความสับสนนะ?) ส่วนของ OS คงจะพัฒนาต่อมาจาก iPod nano เป็น OS ที่ไม่ซับซ้อน เน้นรับค่ามาจาก iP device กับส่งค่าต่อกลับไปยัง iP device ไม่มีการประมวลผลที่ซับซ้อน

ฟีเจอร์ประมาณนี้ ราคาซักหมื่นก็น่าจะพอไหวนะ

Blog Tags

การแก้ปัญหาเมื่อ SharePoint ไม่รู้จะใช้ Managed Metadata Service ตัวไหน

Submitted by ezybzy on Tue, 2013-06-25 - 14:30

ใน SharePoint Farm ปัจจุบันมี Managed Metadata Service อยู่ 1 ตัว มีความต้องการว่าเราจะสร้าง Managed Metadata Service สำหรับ Web Application ที่เราต้องการจะศึกษา Cross-site publishing ผมก็เลยทำการสร้าง MMS ขึ้นมาอีกตัว ทำการ Web Application อันใหม่แล้วผูก MMS ตัวนี้เข้ากับ Web Application นั้นโดยไม่ใช้ MMS ตัวเดิม

ปัญหามาเกิดเมื่อเราทำการสร้างไซต์ที่เป็น Product Catalog เมื่อเปิดใน Term Store เราพบว่า ไม่มีการสร้าง Term พิเศษให้โดยอัตโนมัติ ใน Event Log ไม่ได้แจ้งอะไรเป็นพิเศษ แต่ใน ULS เราพบ Event น่าสนใจอันหนึ่ง ซึ่งเกิดขึ้นในกระบวนการสร้าง Site Collection นี้ (ใช้ ULS Viewer ดักค่าตั้งแต่กดปุ่มสร้างไซต์จนถึงหน้าจอที่รายงานผลการสร้างไซต์)

{DATE/TIME} w3wp.exe (0x099C)   0x17E0  Web Content Management  Publishing Provisioning aaub3   High    Failed to add term set Product Hierarchy. Unable to fetch the Term Store of the Site Collection {GUID}

ก็ค่อนข้างชัดเจนว่ามันไม่รู้จัก Term Store แต่จะทำอย่างไรให้มันรู้จักล่ะ? ไปพบบทความของ Jason Lee ซึ่งพบอาการเดียวกันเป๊ะ ก็เลยจัดการตั้งค่าตาม แล้วสร้าง Site Collection ใหม่ ผลลัพธ์ก็ออกมาเป็นดังที่ควรจะเป็น

บทเรียนสำหรับวันนี้คือ นอกจากจะตั้งให้ Permission แก่ Term Store แล้ว เรายังต้องตั้ง Properties ของ Service Application Proxy ด้วย เผื่อเกิดข้อผิดพลาดที่ไม่คาดคิดเช่นนี้

Blog Tags