Skip to main content

SharePoint

Field ที่ว่างเปล่า

Submitted by ezybzy on

สมมติเราสร้าง Field ไว้เก็บข้อมูลใน List item โดยที่ Field นี้ไม่ได้บังคับว่าให้กรอกข้อมูล เหตุการณ์เหมือนจะเป็นไปด้วยดี ผู้ใช้งานกรอกข้อมูลใส่ List item ไว้เรียบร้อยโดยไม่ได้กรอกค่าใน Field นี้

แต่แล้ว เราจำเป็นต้องเพิ่มค่าให้กับ Field นี้โดยผ่าน Code ปัญหาเกิดทันทีครับ

SPFieldUserValueCollection a = item[b] as SPFieldUserValueCollection;

สมมติว่าผู้ใช้งาน ไม่ได้ทำการเลือกรายชื่อผู้ใช้ใน Field ที่กำหนดให้นี้ ผลลัพธ์ที่ได้ของตัวแปร a นั้นคือ null ครับ

เข้าใจว่านี่คงเป็นเพราะกระบวนการการเก็บข้อมูลในฐานข้อมูล ซึ่งหากไม่ได้มีการบันทึกข้อมูล ตัว SharePoint จะตีให้ค่าของ Field นั้นเป็น String.Empty ซึ่งจากที่เห็นทำให้ as operator ให้ผลลัพธ์ null ออกมา ทางแก้ที่พอจะนึกออกคือ ก็ต้องสร้างค่านั้นเอง แล้วทำการให้ค่ากลับไปเพื่อบันทึกข้อมูลใส่ List item ดังเช่น

SPFieldUserValueCollection a = item[b] as SPFieldUserValueCollection;

if (a == null)
    a = new SPFieldUserValueCollection();

// Do something ...

// Assign value back to list item
item[b] = a;

item.Update();

อาจจะเป็นจุดที่หลาย ๆ คนพลาดนะ ก็จำเอาไว้

Tags

การตั้ง Search Scope ใน SharePoint

Submitted by ezybzy on

มีโจทย์ว่า ต้องจำกัดผลลัพธ์การค้นหาใน Site Collection อันหนึ่ง (สมมติว่าชื่อ http://a) ซึ่งภายในดันมีอีก Site Collection หนึ่งที่มีรูปของ Url เป็น http://a/sites/xyz

วิธีแก้ปัญหาก็ทำได้หลายวิธี หนึ่งในนั้นคือ การกำหนด Content Source โดยกรอก Url ของ Site Collection ที่ต้องการ และต้องไม่ลืมเลือก Crawl Settings ให้เป็น Only crawl the Site Collection of each start address แทนที่จะเลือก Crawl everything under the hostname for each start address ซึ่งตัว Crawler จะวิ่งไปทั่วระดับ Web Application เลย

เมื่อตั้งส่วนนี้เสร็จ ก็ต้องไปตั้ง Scopes (ในเมนู Query and Results) โดยหากจะเล่นกับ Content Source ที่สร้างไปเมื่อซักครู่ ตัว Scope นี้จะถูกบังคับให้เป็น Shared Scope (แต่ละ Site Collection ที่จะใช้ระบบ Search จะไม่สามารถลบค่าออกเองได้ เพราะนี่เป็นค่าจากส่วนกลาง) เนื่องจากในเมนู Search Scope ที่อยู่ภายใต้ Site Collection เมื่อทำการ New rule แล้วในหัวข้อ Scope Rule Type จะไม่มีหัวข้อนี้ให้เลือก

วิธีนี้เท่าที่ลอง ใช้งานไม่ได้กับ FAST Query SSA นะ ประหลาดใจเหมือนกัน แต่อาจจะเป็นการตั้งค่าบางอย่างผิดพลาดก็ได้ เลยไม่ปรากฏตัวเลือกนี้ให้ใช้ จำเป็นต้องกลับไปใช้วิธีไล่ Exclude URL ที่ไม่ต้องการออกไปแทน

Tags

ดัก Anonymous Access ใน SharePoint แบบ Hard-core!

Submitted by ezybzy on

ใน SharePoint นั้นสามารถกำหนดสิทธิ์การเข้าถึงของ Anonymous ได้ 3 แบบ จากน้อยไปเยอะดังนี้

  • Nothing (ดูอะไรไม่ได้เลย)
  • Lists & Libraries (เข้าถึงได้เฉพาะ List และ Library)
  • Entire Web Site (เปิดดูได้ทุกอย่าง)

ทีนี้ถ้าเลือกเปิด Entire Web Site ก็จะพบปัญหาว่า ถ้าเขารู้ URL หลังบ้านเขาก็ทะลุเข้าไปเห็นอะไรที่เราไม่อยากให้เขาเห็นได้เลยซึ่งเราคงไม่ต้องการให้เกิดเหตุการณ์เช่นนั้น (การดูว่าไซต์ไหนใช้ SharePoint มันไม่ใช่เรื่องยากนะ เพราะมันมักจะทิ้งร่องรอยให้เราตรวจได้) แต่การเปิดแค่ Lists & Libraries มันก็ดันทำให้เปิดหน้าแรกของเว็บไม่ได้

ทางแก้ที่พอจะทำได้คือ ตั้งเป็น Lists & Libraries แล้วก็ค่อย ๆ เพิ่มสิทธิ์ Anonymous Access ให้สามารถ View Items ทีละ Library เท่าที่จำเป็น ซึ่งนั่นก็จะประกอบไปด้วย Pages/SitePages (หน้าเว็บ ขึ้นกับว่าใช้ Publishing หรือ Enterprise Wiki), Style Library (CSS/XSLT สำหรับ Content Query Web Part และอื่น ๆ), Master Page Gallery (มิเช่นนั้นจะเปิดหน้าเว็บไม่ได้เพราะโหลด Master Pages มาปั้นเป็นหน้าเว็บไม่ได้) และสุดท้ายคือรูปภาพซึ่งก็แล้วแต่ว่าจะเก็บไว้ใน PublishingImages/SiteCollectionImages หรือว่าที่อื่น หากเก็บรูปไว้ในโมดูล Images จะทำอะไรกับมันไม่ได้ เนื่องจากว่า Images ไม่ได้เป็น Library จึงไม่สามารถไปปรับค่าสิทธิ์ได้

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

Tags

เมื่อไฟล์สูญหายไปจาก FileUpload

Submitted by ezybzy on

ในโครงการระบบ SharePoint ที่ดูแลอยู่ ได้ทดลองทำฟอร์ม Upload ข้อมูลบางอย่างขึ้นมา เป็นฟอร์มง่าย ๆ ที่วาง FileUpload ไว้บนนั้น

ทีนี้ปัญหามันมาอยู่ตอนอัพโหลดข้อมูล (Microsoft ก็เขียน Code ในลักษณะนี้เช่นกันกับหน้าอัพโหลดของระบบ /_layouts/Upload.aspx)

folder.Files.Add(GenerateFileNameBasedOnTimeAndUploaderID(Path.GetExtension(DocumentFile.FileName), DocumentFile.FileBytes);

พอลองกับไฟล์เอกสารทั่ว ๆ ไปมันก็ไม่ได้มีปัญหาอะไร แต่พอลองกับไฟล์ที่เป็น Flash .swf กลับมีปัญหาไม่สามารถอัพโหลดได้โดยมี 2 กรณีคือ

Tags