5-11-2008 21:15:11
Trong kiến trúc của WSS 2.0 có 2 khái niệm “ghosting” và “unghosting”. Page Ghosting là một chức năng cho phép web server lưu trữ một mẫu trang .aspx trên hệ thống tệp cục bộ của nó và chia sẻ mẫu này qua nhiều site. Page Ghosting mang lại lợi ích về hiệu năng vì WSS có thể tạo hàng ngàn trang sử dụng chung một template trên hệ thống tệp cục bộ và được nạp vào bộ nhớ chỉ một lần.
WSS 2.0 giúp việc tùy biến của người dùng trở nên thuận tiện nhờ các công cụ như Front Page 2003. Khi người dùng thay đổi một mẫu trang và ghi lại những thay đổi đó, thì một phiên bản mới của trang sẽ được lưu trong SQL Server. Trong WSS 2, việc này được xem như là “page unghosting” .
WSS 3.0 vẫn hỗ trợ các mẫu trang nằm trên web server cũng như các phiên bản đã tùy biến của chúng được lưu trữ trong SQL Server. Tuy nhiên đội dự án WSS 3.0 không còn dùng khái niệm ghosting và unghosting nữa vì chúng khó dịch sang khác ngôn ngữ khác, thay vào đó là các khái niệm “uncustomized page” (mẫu trang được sử dụng trực tiếp trên hệ thống file cục bộ của webserver) và “customized page” (phiên bản đã chỉnh sửa của mẫu trang đã được ghi vào cơ sở dữ liệu cho một trang riêng biệt).
Một sự thay đổi khác là phiên bản mới của FrontPage 2003 được xuất hiện dưới cái tên mới: Microsoft Office SharePoint Designer 2007 (MOSD). MOSD cũng hướng người dùng hơn là lập trình viên. Nhưng dù sao thì đối với mỗi lập trình viên, có nó vẫn hơn không!!!
MOSD cung cấp hệ soạn thảo và bộ thiết kế WYSIWYG để tùy biến các trang .aspx trong các site WSS 3.0. Ta còn có thể tạo ra các trang mới trong một site WSS 3.0 mà không có một mẫu tương ứng nào trên Web server. MOSD 2007 hỗ trợ tạo list và document library, thậm chí cung cấp một giao diện mới giúp tạo ra các workflow mong muốn trong site WSS 3.0.
• Làm việc với Master Page
Một trong những nét buồn tẻ nhất trong WSS 2.0 là tạo ra một dạng cảm quan (look and feel) nhất quán giữa các trang. Nguyên nhân là do ASP.net 1.1 không cung cấp bất kỳ công nghệ dựng mẫu trang nào có thể sử dụng trên nhiều trang trong WSS 2.0 site. Vì thế mà các lập trình viên và người thiết kế đã sắp xếp lại để cắt/dán các mẫu trình bày HTML từ trang này sang trang khác, rất khó để tùy biến và bảo trì một site có những yêu cầu trình bày khác so với những gì sẵn có bằng WSS 2.0 site chuẩn.
ASP.NET 2.0 mang đến một tính năng tạo mẫu trang rất mạnh gọi là master page. Nó chính là một mẫu cho phép định nghĩa một định dạng trình bày trang cho cả site có những thành phần như banner, các điều khiển trình duyệt (navigation control) và menu. Các trang link đến master page gọi là content page.
Điểm chính yếu là mỗi content page liên kết đến master page để thu được layout chia sẻ, rồi mở rộng master page bằng cách bổ sung các nội dung tùy biến vào các điểm giữ chỗ đã đặt tên có thể thay thế được (replaceable named placeholder).
WSS 3.0 được thiết kế từ dưới lên để bao trùm cấu trúc master page của ASP.NET 2.0. Mỗi site WSS 3.0 được tạo ra từ một danh mục đặc biệt gọi là Master Page Gallery chứa đựng một master page với tên gọi default.master. Master page này định nghĩa một cách trình bày chung cho mọi trang chủ của site (default.aspx) cũng như mọi trang chuẩn của WSS 3.0 liên kết với các list và document library (ví dụ: allItem.aspx, newItem.aspx). Dạng trình bày của master page chứa đựng các menu và điều khiển trình duyệt chuẩn của WSS.
Sự định nghĩa về default.master bao hàm một vài điểm giữ chỗ đã được đặt tên như PlaceHolderPageTitle, PlaceHolderMain và PlaceHolderLeftNavigation. Điều này giúp tạo các content page thuộc site (có cùng định dạng trình bày) trở nên tương đối đơn giản. Đoạn mã dưới đây chỉ rõ việc tạo một content site là dễ dàng đến thế nào:
<%@ Page language=”C#” MasterPageFile=”~masterurl/default.master” %>
<asp: Content ContentPlaceHolderId=”PlaceHolderMain” runat=”server”>
<h3>Welcome to customization with WSS V3 </h3>
Trang được tạo ra quá đơn giản, hơn nhiều so với WSS 2!!
</asp:Content>
Việc định nghĩa content page thể hiện trong code không thể nào đơn giản hơn. Nó chỉ làm một việc đơn giản là thêm một đoạn HTML cực ngắn trong PlaceHolderMain, nhưng đủ để tạo một dạng trình bày trang WSS chuẩn với biểu tượng, menu và các thanh navigation. Khi biết cách sử dụng tập các placeHolder được định nghĩa trong default.master, ta có thể dễ dàng đổi chỗ các thành phần chuẩn của WSS như menu và navigation bar hay thay thế chúng bằng những ASP.NET control hay Webpart của riêng mình. Điều này là thực hiện được ở phạm vi một site, một site collection hay lớn hơn thế.
Master page và content page được lưu trữ và nạp lên cùng dựa trên những nguyên lý của mẫu trang và tùy biến trang (đã thảo luận). Có các mẫu trang cho master page và content page nằm trong hệ thống file cục bộ của webserver. Mỗi site ban đầu sử dụng phiên bản chưa tùy biến của mẫu master page và content page. Tuy nhiên, khi người sử dụng tùy biến và lưu trữ lại sự thay đổi nhờ MOSD 2007, thì phiên bản đã chỉnh sửa được lưu lại trong cơ sở dữ liệu của SQL server.
Ta có thể tùy chọn chỉ mình master page mà không quan tâm đến các content page hoặc ngược lại, thậm chí thay đổi cả hai, nhưng rồi cuối cùng muốn hủy bỏ mọi sự thay đổi, thì cả giao diện trên Browser của WSS 3.0 lẫn MOSD 2007 đều hõ trợ các menu đơn giản để xóa bỏ dấu vết trên cơ sở dữ liệu của SQL server và khôi phục lại mẫu trang ban đầu.
Lưu ý rằng mỗi site có Master Page Gallery chứa default.master và thuộc tính Master-Url của riêng nó, nên không phải các site trong site collection đều tự động sử dụng cùng một master page. Tuy nhiên, khá đơn giản để viết một vài mã lệnh có sử dụng đệ quy ngược với mô hình đối tượng của WSS 3.0 để đồng bộ hóa một site ngoài cùng (top-level) và các site con trong một site collection để sử dụng chung một master page.
• Các Web Part trong WSS 3.0
Một trong những cách làm phổ biến nhất của các lập trình viên khi mở rộng các site của WSS 2.0 là tao ra những web part mong muốn. Ưu điểm của Web part là có thể bổ sung được nhiều tùy chọn cá nhân của người dùng.
Vì tính phổ dụng của Web part trong WSS 2.0, Microsoft đã quyết định hỗ trợ thêm cho khả năng phát triển các Web part mong muốn vào ASP.NET 2.0. Chiến lược hướng tới một lực lượng đông đảo người sử dụng là lập trình viên đã hoàn tất bằng việc tạo ra một cấu trúc bên trong mới mẻ của Web part cho ASP.NET 2.0, cái chưa từng có ở WSS 2.0.
Do đó hiện nay có hai kiểu Web part khác nhau:
• Kiểu cũ (kiểu WSS) phụ thuộc vào Microsoft.SharePoint.dll và phải kế thừa từ lớp cơ sở WebPart định nghĩa bởi đội dự án WSS 2.0 trong namespace Microsoft.SharePoint.WebPartPages.
• Kiểu mới (kiểu ASP) phụ thuộc vào System.Web.dll và phải kế thừa từ một lớp cơ sở khác cũng mang tên WebPart định nghĩa bởi đội dự án ASP.NET 2.0 trong namespace System.Web.UI.WebControls.WebParts.
WSS 3.0 cần phải được thiết kế với mục tiêu chạy được cả Web part kiểu cũ và Web part kiểu mới. Điều này đã thực hiện được với việc xây dựng các hỗ trợ của WSS 3.0 cho Web part bên trên hạ tầng Web part của ASP.NET, sau đó tạo ra các thay đổi cho Microsoft.SharePoint.dll sao cho các Web part kiểu WSS (viết cho WSS 2.0) có thể được tương thích với WSS 3.0 runtime environment.
Để lý giải làm thế nào Web part được nạp và chạy trong WSS 3.0, đầu tiên ta thảo luận về việc làm thế nào kiến trúc WSS 3.0 được thiết kế thành lớp trên cùng của hạ tầng Web part của ASP.NET 2.0. Đầu tiên, cần xem xét cách mà các trang Web part được trình bày trong WSS 3.0, sau đó ta sẽ đi vào chi tiết cách thức phát triển các Web part cho môi trường WSS 3.0.
Để chạy các Web part trong ứng dụng ASP.NET 2.0, ta phải tạo một trang .aspx chứa đúng một thể hiện của control WebPartManager và một hay nhiều control WebPartZone. Control WebPartManager chịu trách nhiệm xuất bản các dữ liệu liên quan đến Web part cũng như lưu trữ và truy xuất nó từ các bảng trong cơ sở dữ liệu của các ASP.NET service.
Trang .aspx tương tự như một trang Web part cũng có thể chứa các Editor Part cho phép người dùng tùy biến và cá nhân hoá các thuộc tính Web part. Các trang Web part cũng có thể chứa các Catalog Part, cho phép người dùng bổ sung Web part mới vào các zone khác nhau.
Hạ tầng Web part của WSS 3.0 được xây dựng trên một control mang tên SPWebPartManager nhận được từ control WebPartManager của ASP.NET 2.0. Control SPWebPartManager nạp chồng (override) các hành vi chuẩn của control WebPartManager để giữ nguyên dữ liệu Web part bên trong cơ sở dữ liệu nội dung của WSS thay cho cơ sở dữ liệu của ASP.NET services. Ta không cần phải lo lắng về chuyện làm việc trực tiếp với control SPWebpartManager vì thể hiện duy nhất của nó đã được định nghĩa trong trang default.master. Khi tạo ra một content page kế thừa từ default.master, control SPWebPartManager đã có sẵn ở đó.
Các điều khiển khác xuất hiện trên một trang WSS 3.0 Web part thông thường chứa đựng các Web Part zone, Editor Part và Catalog Part. Chú ý rằng các Web part zone cho một trang Web part trong WSS 3.0 nên được tạo ra bằng control WebPartZone định nghĩa trong namespace Microsoft.SharePoint.WebPartPages mà không phải control WebPartZone của ASP.Net 2.0
Một trang Web part trong WSS 3.0 đòi hỏi có control SPWebPartManager và một hoặc nhiều control WebPartZone. Nếu ta tạo ra một content page kế thừa từ lớp WebPartPage, ta có thể nhận được những tiện ích của WSS 3.0 như Editor Part và Catalog Part cung cấp sẵn.
Các thể hiện của control WebPartZone thường được định nghĩa trong content page. (đoạn code không gõ vào…)
Khi tạo ra một trang Web part cho một ứng dụng ASP.NET 2.0 chuẩn, ta cần phải thêm các logic tương tác với control WebPartManager để quản lý chế độ hiển thị của Web part. Bình thường ta cũng cần phải bổ sung Editor Part và Catalog Part một cách rõ ràng vào trang dùng định dạng trình bày HTML để bố trí chúng. Rất may là ta không cần phải làm những việc ấy khi tạo ra các trang cho một site WSS 3.0, thay vào đó ta kế thừa từ lớp WebPartPage đã định nghĩa sẵn trong namespace Microsoft.SharePoint.WebPartPages và để nó làm toàn bộ mọi thứ.
(*) Phát triển một Web part tùy chọn: Sẽ nghiên cứu sau ở giai đoạn code
• Điểm nổi bật trong lưu trữ nội dung
WSS 2.0 bị phê phán rằng một số tính năng giá trị hỗ trợ cho document library lại không mở rộng cho list. Ví dụ document library hỗ trợ đánh số phiên bản (versioning) và các sự kiện, nhưng list thì không. Trong WSS 3.0, list đã hỗ trợ nhiều tính năng giống như document library bao gồm versioning, events và folders. Ngoài ra còn có một vài tính năng mới hỗ trợ cho cả list và library trong WSS 3.0 như trình bày dữ liệu đến từ các RSS feed tự động.
WSS 2.0 còn bị phàn nàn về hiệu năng khi làm việc trên list và document library lớn. Ví dụ list thường bắt đầu cho thấy hiệu năng yếu kém khi số lượng phần tử vượt quá 2000. Document library cũng tương tự như vậy. Vì thế việc đi đến một sự phối hợp để phân chia các document ra nhiều thư mục trong cùng một document library đã trở thành cách tiếp cận phổ biến trong WSS 2.0 để giải quyết vấn đề số lượng document lớn.
WSS 3.0 giới thiệu tính năng đánh chỉ mục cột (column indexing) mới để giảm nhẹ vấn đề về hiệu năng nói trên. Từ một trang thiết lập list hay document library, ta có thể thêm một chỉ mục vào một cột bất kỳ. Việc làm này không thật sự tạo ra một chỉ mục trong SQL Server, mà nó tạo ra một bảng với ID là số nguyên của phần tử thuộc list hay document và giá trị của cột đã được đánh chỉ mục. WSS sau đó sử dụng bảng này để tăng hiệu năng xử lý dữ liệu trả về từ các view, đặc biệt là một view xây dựng nhờ bộ lọc trên các cột đã đánh chỉ mục.
Nhiều lập trình viên mong muốn làm việc với các field của WSS 3.0 ở một cấp độ thấp hơn để có thể thu được nhiều control thông qua việc xác nhận và diễn tả nó. Đội dự án WSS đáp lại mong muốn đó bằng cách bổ sung các kiểu field có thể mở rộng trong WSS 3.0. Ta có thể tạo ra một kiểu field mở rộng được bằng cách viết một lớp trong C# hay VB.NET có kế thừa từ các kiểu field dựng sẵn trong WSS như SPFieldText, SPFieldNumber hay SPFieldUser. Một kiểu field mở rộng được cũng có thể tận dụng control User của ASP.NET chứa đựng các Web control ưa thích của ta. Điều này cho phép ta sử dụng cùng một kỹ thuật để khởi tạo và xác nhận control mà ta đã sử dụng trong các ứng dụng ASP.NET.
Một cải tiến hấp dẫn nữa trong WSS 3.0 là các custom site column. Một site colum là một định nghĩa có thể tái sử dụng, có thể được sử dụng trong nhiều list. Một site column định nghĩa tên của một column, kiểu field cơ sở của nó và các đặc điểm khác như giá trị mặc định, định dạng và chuẩn hóa của nó. Khi đã định nghĩa một site column, ta có thể sử dụng nó giống như ta định nghĩa cấu trúc của một list tự tạo. Lợi ích hiển nhiên là ta có thể cập nhật site column ở chỉ một nơi và thu được kết quả update trong cả danh sách nơi mà site colum đã được sử dụng.
Một site column được định nghĩa trong phạm vi của một site đơn, nó chưa hiển thị ở tất cả các site con bên dưới trang mà ở đó nó được định nghĩa. Do đó ta có thể tạo ra một site column có thể tái sử dụng trong toàn bộ site collection bằng cách định nghĩa nó ở trang trên nhất.
Một kỹ thuật thuật tiện được giới thiệu cùng với site colum là khả năng thực hiện tìm kiếm field qua các site. Ví dụ ta có thể tạo ra một site colum ở trang ngoài cùng có nhiệm vụ thực hiện việc tìm kiếm trên một list trong cùng site. Sau đó ta có thể tạo ra các list khác trong site con sử dụng site …
• Xử lý sự kiện
Bộ xử lý sự kiện trong WSS 2.0 có hỗ trợ xử lý sự kiện, song sự hỗ trợ này là rất nhỏ và nhận được nhiều lời phàn nàn từ phía cộng đồng các lập trình viên. Các sự kiện trong WSS 2.0 được hỗ trợ cho document library nhưng không cho list. Hơn nữa WSS 2.0 chỉ hỗ trợ các sự kiện không đồng bộ diễn ra sau khi hành động của người dùng đã được chuyển đến cơ sở dữ liệu SQL server, nghĩa là không có cách nào để hủy bỏ một hành động của người dùng trong bộ xử lý sự kiện.
Hỗ trợ xử lý sự kiện trong WSS 3.0 đã được nâng cấp đáng kể. Ngoài hỗ trợ những sự kiện không đồng bộ như WSS 2.0 đã làm được, nó còn hỗ trợ cho những sự kiện đồng bộ, cho phép lập trình viên hủy bỏ thao tác người dùng. Ví dụ ta có thể cấm người dùng xóa một văn bản một khi nó đã được duyệt hoặc sắp được tạo ra ở một thời điểm định trước trong tương lai. Hơn thế nữa, các sự kiện giờ đây đã được bổ sung cho list, giống như cho document library.
Ngoài việc hỗ trợ các sự kiện trên list và document, WSS 3.0 hỗ trợ nhiều kiểu sự kiện mới khác nhau mà chưa từng có trong WSS 2.0. Có các sự kiện trên list xảy ra khi một ai đó thay đổi định nghĩa list. Ví dụ ta có thể hủy hành động của một người nếu anh ta cố gắng loại bỏ hay đổi tên một cột trong danh sách tùy chọn của ta. Bên cạnh đó còn có các sự kiện xảy ra bất kỳ khi nào có người xóa hay di chuyển một site hay toàn bộ một site collection.

---
Coding for food