Phận làm trai gõ phím bình thiên hạ
Chí anh hùng click chuột định giang sơn
  • 5 store procedure hệ thống mà developer phải biết

    Nếu bạn là developer thì chắc chắn rằng bạn phải biết SQLServer ! (Hiện tại SQLServer đã có đến phiên bản SQLServer 2008). Tuy nhiên ứng với phiên bản SQLServer nào Microsoft đều đưa ra các store procedure hệ thống (System stored procedures)

    Bài viết này mình đề cập đến 5 store procedure hệ thống theo mình nghĩ là mỗi người khi developer với SQLServer đều phải biết.

    1. sp_help

    a. Mục đích

    Đây là store procedure hệ thống giúp bạn tra cứu nhanh về thông tin của các đối tượng (objects) có trong database. Như là: xem cấu trúc của 1 bảng, xem bảng này có phụ thuộc bảng nào, xem bảng này có Primary KeyForegin Key của table nào, .....

    b. Cú pháp

    • sp_help : để lấy tất cả các thông tin về tất cả các đối tượng trong Database
    • sp_help <tên của đối tượng> : để lấy tất cả các thông tin cụ thể của đối tượng (thông số tên đối tượng truyền vào) trong Database

    c. Ví dụ

    • sp_help ---> Khi đó bạn sẽ thấy giống màn hình sau:

       
    • sp_help 'Person.Address' ---> Khi cần lấy thông tin của table Person.Address trong Database: Adventure Works. Khi đó bạn se thấy giống màn hình sau

    2. sp_helptext

    a. Mục đích

    Đây là store procedure hệ thống giúp bạn tra cứu định nghĩa các đối tượng: store procedure hệ thống, store procedure do người dùng định nghĩa, hàm do người dùng định nghĩa, trigger, ....

    b. Cú pháp

    • sp_helptext  <tên của đối tượng> : để lấy định nghĩa của đối tượng (thông số tên đối tượng truyền vào) trong Database

    c. Ví dụ

    3. sp_MSforeachtable

    a. Mục đích

    Đây là store procedure hệ thống giúp bạn duyệt qua tất cả các table trong Database. Khi đó bạn dùng kí tự ? để làm kí tự đại diện cho table. Ví dụ cơ bản nhất khi dùng store procedure hệ thống này là đếm số dòng của tất cả các bảng trong Database

    b. Cú pháp

    •  sp_MSforeachtable <Câu lệnh SQL> ---> Câu lệnh SQL bắt buộc phải chứ kí tự ? làm kí tự đại diện cho tên table

    c. Ví dụ

    •  sp_MSforeachtable 'SELECT ''?'', COUNT(*) FROM ?' : Đếm số dòng của tất cả các table trong Database: Adventure Works.Khi đó bạn sẽ thấy màn hình như sau

    4. sp_depends 

    a. Mục đích

     Đây là store procedure hệ thống giúp bạn liệt kê các Views, store procedure do người dùng định nghĩa, hàm do người dùng định nghĩa, trigger, ... có phụ thuộc vào tên đối tượng truyền vào

    b. Cú pháp

    •  sp_depends <tên của đối tượng>  --> tìm các đối tượng khác có phụ thuộc với tên đối tượng được của thông số truyền vào

    c. Ví dụ

    •  sp_depends 'Person.Address'  -> tìm các đối tượng khác phụ thuộc vào table: Person.Address trong Database: Adventure Works. Khi đó ta sẽ thấy như màn hình sau

    5. sp_spaceused

    a. Mục đích

     Đây là store procedure hệ thống giúp bạn lấy kích thước của Database hoặc kích thước của một đối tượng trong Database.

    b. Cú pháp

    •  sp_spaceused ---> lấy kích thước của Database (là Database mà ta đang thực thi store procedure hệ thống này)
    • sp_spaceused <tên của đối tượng> ---> lấy kích thước của 1 đối tượng cụ thể được truyền vào từ thông số tên đối tượng

    c. Ví dụ

    •  sp_spaceused ---> lấy kích thước của Database: Adventure Works. Khi đó bạn sẽ thấy màn hình như sau
    • sp_spaceused ‘Person.Address’ ---> lấy kích thước của table: Person.Address trong Database: Adventure Works. Khi đó bạn sẽ thấy màn hình như sau

     Và cuối cùng, bạn hãy thực hiện lệnh sau

    sp_MSforeachtable 'execute sp_spaceused @objname = ''?'' '

    Nó là sự kết hợp của 2 lệnh: sp_MSforeachtable, sp_spaceused mình vừa giới thiệu ở trên và cho biết nó làm mục đích gì ?

  • 3 quyển sách Community Server

    Dạo một vòng trên NET. Kiếm các quuyển sách về chỉ tìm được có 3 quyển sách nói về Community Server, mà các quyển này chủ yếu nói về phiên bản Community Server 2007. Do đó, đối với phiên bản 2008 và đặt biệt là phiên bản Community Server 2008 SP2 thì các bạn phải vào trang chủ để tìm hiểu thôi.

    Nhưng dù sau thì nếu bạn đọc xong 3 quyển này rồi thì mình nghĩ rằng bạn cũng nắm rõ về Community Server mà thôi.

    Đây là link download cho 3 quyển sách này

    1. Wrox.Professional.Community.Server.Themes.pdf

    2. Wrox.Professional.Community.Server.pdf

    3. Manning.Community.Server.Quickly.pdf

    Hy vọng 3 quyển sách này giúp ít được cho các bạn.

  • Community Server 2008.5 SP2 vừa xuất hiện

    Nếu bạn quan tâm đến Community Server, thì hôm qua Community Server vừa release phiên bản 2008.5 SP2.

    Bạn có thể download ở đây: http://get.communityserver.com/download/moredownloads.aspx và có thể xem những gì mới ở đây: SP2 for CS 2008.5 and Evolution 1.0 now available!

  • Các loại ứng dụng trong Community Server

    Tính đến phiên bản Community Server 2008.5 SP1 thì Community Server có các loại ứng dụng sau:

     

        /// <summary>

        /// Communinty Server Applications

        /// </summary>

        public enum ApplicationType

        {

            Forum = 0,

            Weblog = 1,

            Gallery = 2,

            GuestBook = 3,

            Calendar = 4,

            ContentManagement = 5,

            FileGallery = 6,

            FeedReader = 7,

            BlogRoller = 8,

            Ads = 9,

            Spam = 10,

            Hub = 11,

            Reporting = 12,

            MediaGallery = 13,

            Rest = 14,

            Messaging = 15,

            MyKB = 52,

            Wiki = 53,

            Newsletter = 1000,

            Games = 1001,

            Store = 4120,

            Installer = 9997,

            Admin = 9998,

            Unknown = 9999,

            All = 99999

        };

    Xem ra cũng nhiều vậy, và luôn nhớ rằng khi làm việc các loại ứng dụng thì đừng quên check cái enum: ApplicationType

  • Chống SPAM cho Community Server bằng CAPTCHA

    Một diễn đàn, một bài viết blog, ... khi tác giả viết ra thì đều mong muốn có người bình luận (comment) để làm cho bài viết đó thêm sôi động. Tuy nhiên một vài người không biết vô tình hay cố ý hoặc thường SPAM các lời bình (mà thường là nội dung có những link liên kế đến những trang không tốt chút nào).

    Để giải quyết triệt để vấn đề SPAM các lời bình đối với Community Server, mình hướng dẫn các bạn bài sau và khi đó bạn sẽ chống lại các SPAMER bằng cách dùng CAPTCHA

    1. Trước tiên download addon từ blog của mình về

    2. Giải nén ra, bạn được 2 thư mục là: InstallSource

    3. Thư mục Source dùng để bạn tham khảo hoặc phát triển thêm. Mình qua bước tiếp nhe.

    4. Thư mục Install gồm có thư mục Web và file Install.txt. Sau đây là từng bước để install cho site của bạn

    • Copy file CommunityServer.Hack.Captcha.dll ở thư mục bin vào thư mục bin trên host mà Community Server đang chạy.
    • Copy file prototype.js ở thư mục Utility vào thư mục Utility trên  đang chạy Community Server. (Lưu ý: thư mục Utility là thư mục con của thư mục root mà mình đang host Community Server)
    • Copy file CommunityServer.Hack.Captcha.xml ở thư mục Languages\vi-VN vào thư mục Languages mà site của bạn đang dùng. (Chú ý file: CommunityServer.Hack.Captcha.xml phải nằm cùng cấp với file Resource.xml)
    • Copy file: communityserver_override.config vào thư mục root mà Community Server của bạn đang chạy. Chú ý: nếu site của bạn đã có file: communityserver_override.config rồi thì tuyệt đối không copy và ghi chồng vào file cấu hình của bạn nhe. Mà hãy mở file: communityserver_override.config bằng Notepad sau đó copy đoạn sau và paste lại vào cuối file communityserver_override.config của bạn. (Về file: communityserver_override.config ở các bài viết sau mình sẽ hướng dẫn cụ thể hơn vấn đề này.). Sau đây là đoạn code override nếu dùng:

    <Override xpath="/CommunityServer" mode="add" where="end">
        <Captcha CaptchaLength="4" Chars="a;b;c;d;e;f;g;h;j;k;m;n;q;r;s;t;2;3;4;5;6;7;8;9" Fonts="Georgia;Verdana;Tahoma;Arial;Times New Roman;Garamond;Agency FB" IsAuthenticated="true" SubmitButtonID="btnSubmit;PostButton"/>
    </Override>

    5. Từng bước cài đặt CAPTCHA cho các form của Community Server

    • Xác định page nào cần cài đặt CAPTCHA bằng cách view page đó và dùng kỹ thuật CS Tip: Làm sao biết đường dẫn file gốc đang xem. Ví dụ ở đây mình muốn cài đặt CAPTCHA cho form bình luận của 1 blog. Khi đó mình xác định được filename là: /themes/blogs/hack/post.aspx
    • Giờ tìm đúng đường dẫn file name này (/themes/blogs/hack/post.aspx) và mở bằng Notepad lên. Sau đó tìm đến control có name là: <CSBlog:WeblogPostCommentForm />, bạn để ý kỹ các form control của: Community Server luôn kết thúc với suffix: Form
    • Tại đây bạn ghi nhớ các đều sau đây
      • Bạn sẽ thấy 1 thuộc tính là: SubmitButtonId="btnSubmit", nhớ cái: "btnSubmit" lại, và vào file: communityserver_override.config phần xem thuộc tính: SubmitButtonIDbtnSubmit chưa ? Nếu chưa thì thêm vào cuối thuộc tính đó giá trị sau: ";btnSubmit" (chú ý: có dấu ; ở phía trước btnSubmit). Chú ý thuộc tính SubmitButtonId luôn luôn phải có đối với các form của: Community Server
      • Tiếp tục tìm đến thuộc tính thứ 2 là: ValidationGroup, nếu bạn thấy có rồi thì bỏ qua, còn chưa thấy thì phải thêm vào thuộc tính ValidationGroup này với giá trị là giá trị của 1 ValidationGroup của 1 textbox nào đó trong form của Community Server. Ví dụ bạn sẽ thấy 1 asp control textbox như sau: <asp:TextBox id="tbName" runat="server" Columns="60" ValidationGroup="CreateCommentForm" /> thì khi đó giá trị của ValidationGroupCreateCommentForm. Khi đó bạn phải thêm vào cho control WeblogPostCommentForm này giá trị như sau: ValidationGroup="CreateCommentForm" (giống với ValidationGroup của cái texbox này)
      • Tiếp theo tìm đến đường dẫn cụ thể của form control này. Cụ thể ở đây là: WeblogPostCommentForm, mở Community Server mà bạn có thể run bằng source (xem bài hướng dẫn). Sau đó dùng chức năng: Find All files... của Visual Studio, tìm chữ: WeblogPostCommentForm nó sẽ trả về cho bạn rất nhiều kết quả, tuy nhiên bạn chỉ cần tìm đến kết quả có chữ: public class WeblogPostCommentForm, double vào chữ này sẽ mở ra class mà mình cần xem. Khi đó bạn sẽ thấy được cái gọi là namespace, lúc này là: CommunityServer.Blogs.Controls, giờ kết hợp lại với  WeblogPostCommentForm  bạn sẽ có là: CommunityServer.Blogs.Controls.WeblogPostCommentForm. Nhớ cái này lại.
      • Mở file:App_Browsers\default.browser bằng Notepad, tại phần <controlAdapters> thêm vào 1 hàng như sau. (Đương nhiên khi thêm xong thì phải lưu lại rồi nhỉ)
        <adapter controlType="CommunityServer.Blogs.Controls.WeblogPostCommentForm" adapterType="CommunityServer.Hack.Captcha.CaptchaControlAdapter, CommunityServer.Hack.Captcha" /> 
        chú ý: cái controlType="CommunityServer.Blogs.Controls.WeblogPostCommentForm" đó chính là cái mà mình đã xác định ở bước trên.

    6. Đã hoàn thành, giờ mở page này lại và test thử xem thế nào ! Khi đó bạn sẽ thấy như hình dưới đây.

    Các thông số trong file communityserver_override.config và file CommunityServer.Hack.Captcha.xml 

    • communityserver_override.config
      • CaptchaLength: Chiều dài của các ký tự khi random ngẫu nhiên ra.
      • Chars: Chỉ random trong những ký tự này, cách nhau bằng dấu chấm phẩy
      • Fonts: font sử dụng là gì
      • IsAuthenticated: nếu true thì tất cả các user đều phải nhập CAPTCHA code mới submit form về server. false chỉ cho những user chưa login vào hệ thống (các user nặc danh). (Khuyến khích: true)
      • SubmitButtonID: đó là các ID của button trên các form của Community Server (mình không hiểu sao Community Server nó dùng nhiều cái ID name như vậy ? không thống nhất gì hết --> chỗ này họ coding hơi bị "chuối")
    • CommunityServer.Hack.Captcha.xml
      • Captcha_Prompt: text hiện thị trên form yêu cầu user nhập vào textbox
      • Captcha_Error: Khi user nhập sai chữ CAPTCHA, thì chuỗi này sẽ hiện thị thông báo.

    Hy vọng bài viết này giúp ích cho bạn, và nhớ rằng mình vừa phát hiện ra Community Server version 2008.5 SP1 có đến 194 form lận đó nhe. (Quá nhiều thứ để bạo vệ).

    Nếu có gì thắc mắc thì liên hệ với mình nhe.

    Ghi chú: bạn hãy tập làm cho form ở đường dẫn sau: /themes/blogs/hack/contact.aspx xem có được không ?

  • Mở rộng toolbar editor của graffiticms

    Bình thường, khi cài đặt GraffitiCMS, thì GraffitiCMS sử dụng toolbar editor khi ta post bài mặc định ở mức các toolbar đơn giản nhất như bạn thấy ở hình sau:

    Điều này dẫn đến, nhiều khi ta viết một bài blog và muốn trình bày cho đẹp, hiệu ứng, ... sẽ làm cho ta rất khó khăn. (Lúc đó ta phải view source để xem và sửa bài viết theo dạng HTML tag và điều này bắt buộc bạn phải có một kiến thức về HTML nhất định).

    Vậy làm sao để được có như hình sau:

    Vâng giờ đây toolbar của ta có rất nhiều button và khi đó ta có thể nói toolbar của ta giống như một trình soạn thảo Word rồi phải không ?

    Cách làm thì rất đơn giản, bạn chỉ cần mở file ở đường dẫn: \graffiti-admin\posts\write\default.aspx, sau đó tìm từ: GlowEditor, nó sẽ cho ta ra 2 kết quả: và lần lượt thay thế cụm từ: ToolbarSet="Simple" thành ToolbarSet="Default"

    Xong lưu lại và check lại bằng các thêm mới 1 bài viết trong GraffitiCMS xem thế nào ? có giống toolbar như hình ở trên không ?

    Hy vọng Tip này giúp ích cho bạn trong việc định dạng các bài viết của mình nhìn đẹp mắt hơn.

  • CS Tip: Làm sao biết đường dẫn file gốc đang xem.

    Ở bài trước, mình đã hướng dẫn tạo theme hack. Hôm nay,  mình viết bài đầu tiên về chỉnh sửa theme hack này. Đó là: làm sao biết đường dẫn vật lý file mình đang xem ?

    Như các bạn biết, Community Server dùng URL là các url theo dạng viết lại (dùng để tối ưu hoá các search engine, tham khảo bài: Community Server với URL thân thiện với SEO để biết thêm chi tiết). Do đó, khi bạn đang xem 1 page một câu hỏi đặt ra là làm sao tôi biết được đường dẫn file gốc này nằm ở đâu trong thư mục themes ?

    Vâng, đối với nhiều bạn khi bắt đầu với Community Server để biết được điều này theo tôi nghĩ không phải là chuyện dễ (vì tôi đã từng trải qua rồi, lúc mới bắt đầu làm quen với Community Server để xác định được đường dẫn một page nào đó tôi đang xem trên web browser tôi cũng mất chừng ..... ấy thời gian).

    Tại sao mình cần phải biết đường dẫn file gốc ? đương nhiên bạn phải biết đường dẫn của nó để bạn mở nó lên và chỉnh sửa theme của nó chứ ! :)

    Bài viết này, tôi hướng dẫn bạn chỉ cần chỉnh sửa code một chút ở theme hack và từ đó trở về sau khi bạn xem bất kỳ page nào trên web browser thì bạn sẽ biết liền ngay tức khắc mình đang: sử dụng theme tên là gì, và đường dẫn file này nằm ở đâu.

    Sau đây là các bước thực hiện

    1. Mở file: \Web\Themes\hack\common\master.Master bằng trình text editor hoặc dùng Visual Studio 2008 (xem bài: Cài đặt Community Server 2008 SP1 SDK và Run code bằng Visual Studio 2008)

    2. Tìm đến tag: <div id="CommonFooter">, sau đó bạn sẽ thấy tag <asp:ContentPlaceHolder id="BodyFooterRegion" runat="server" >........</asp:ContentPlaceHolder>

    3. Tiếp đến bạn thêm đoạn code sau vào dòng bên dưới tag: </asp:ContentPlaceHolder> khi đó sẽ là 

    ....
    </asp:ContentPlaceHolder>

    <%-- Begin HACK --%>
    <% if(CSContext.Current.User.IsAdministrator)
    {
            Response.Write("<br/>" + Page.Request.Url.LocalPath);
    }    
    %>
    <%-- End HACK --%>
    .....

    4. Giờ lưu file này lại (và nhớ upload lên host nếu site mình đã hoạt động thật).

    5. Wowo, giờ ở cuối màn hình bạn có thể thấy được đường dẫn file gốc mình đang xem page trên web browser rồi đó, tham khảo hình sau

    Hy vọng Tip này giúp ích được cho các bạn khi mới bắt đầu làm quen và HACK Community Server

    Ghi chú: đường dẫn tên file name này chỉ hiện ra khi bạn có quyền là: Administrator của Community Server

  • Tạo một theme mới cho Community Server

    Bài viết sau mình hướng dẫn các bạn tạo 1 theme với tên là hack để dùng cho sau này chỉnh sửa, cũng như dễ dàng cho việc nâng cấp Community Server sao này. (Nếu chúng ta chỉnh sửa theme gốc hawaii thì sau này khi muốn nâng cấp Community Server lên phiên bản mới hơn sẽ rất khó khăn).

    Sau đây là các bước hướng dẫn chi tiết 

    A. Chuẩn bị theme mới từ theme chuẩn hawaii, lần lượt làm như sau: 

    • Vào đường dẫn \Web\themes\ copy theme hawaii vào 1 thư mục tạm khác (ở đây tôi copy sang: E:\tmp\themes) và đặt tên là hack (cái tên theme mới của tôi)
    • Vào đường dẫn \Web\themes\Hubs copy thư mục hawaii vào 1 thư mục tạm khác, (ở đây tôi copy sang: E:\tmp\themes\Hubs) và đặt lại tên là hack
    • Vào đường dẩn: \Web\themes\Blogs copy thư mục hawaii vào 1 thư mục tạm khác nữa (ở đây tôi copy sang: E:\tmp\themes\Hubs) và đặt lại tên là hack

    Đến đây ta sẽ có các thư mục như sau: E:\tmp\themes\hack, E:\tmp\themse\Hubs\hack, E:\tmp\themes\Blogs\hack.

    B. Tạo theme mới: hack

    1.    Dùng một chương trình text editor có chức năng: Find and Replace in files. (ở đây tôi dùng EmEditor, các bạn có thể dùng phiên bản Notepad++ free cũng được).
    2.    Sau đó dùng chức năng tìm: Find in files. Tìm từ: hawaii ở tất cả các file (*.*) và ở thư mục gốc (E:\tmp\themes\hawaii). Khi đó bạn sẽ thấy như hình sau:


    4.    Sau khi tìm ta sẽ thấy rất nhiều kết quả trả về như hình sau (ở đây tôi cắt bỏ bớt cái hình)


    5.     OK. Mình đã xác định được  dữ liệu, bây giờ chúng ta dùng chứ năng: Find and Replace in files. Tương tự ở trên nhưng trường Replace to:  ta enter cái tên theme mới là: hack. Khi đó các bạn sẽ thấy như hình sau.

    Đến đây quá trình tìm và thay thế các từ: hawaii thành hack sẽ tác động lên cả 3 thư mục: E:\tmp\themes\hack, E:\tmp\themse\Hubs\hack, E:\tmp\themes\Blogs\hack


    6.    Tiếp theo sửa cái hình: preview.png (E:\tmp\themese\hack\preview.png) một ít bằng cách thêm vào 1 text là: hack để phân biệt với theme hawaii. Các bạn có thể thấy như sau:

    Nếu muốn bạn có thể sửa thêm 1 cái hình preview của Blogs nữa ở đường dẫn: E:\tmp\themes\blogs\hack\preview.png


    7.    Giờ thì copy lại các thư mục hack vừa tạo ở trên lần lượt đúng vào các thư mục: Web\themes, Web\themes\Hubs, Web\themes\Blogs (đương nhiên là phải upload lại lên host nếu site bạn đang chạy thật rồi)
    8.    Sau đó vào Control panel và cập nhật site của mình với theme mới: hack này bằng cách cách truy cập:

    • Đối với stie: Dashboard  »  Administration  »  Site Administration »  Site Theme. Tại phần, Select Site Theme: ta chọn theme hack vừa thêm vào, các bạn sẽ thấy như hình dưới đây.

    • Đối với Groups: Dashboard  »  Administration  »  Group Administration  »  Default Group Presentation.  Tại phần, Default Theme, ta chọn theme hack vừa thêm vào ở trên.
    • Đối với Blogs: (tuỳ theo administrator có setup cho chọn theme không, ở đây tôi ví dụ là administrator cho ta chọn theme khác). Dashboard  »  My Blogs  » Lê Văn Phước  »  Personalize your Blog, tại phần: Available themes, ta chọn theme hack mới vừa add vào ở trên.


    Chú ý: do đây là theme clone (nhân bản) từ theme hawaii do đó hiện tại bạn sẽ không thấy có bất cứ sự khác biệt gì so với theme hawaii. Tuy nhiên ở các bài viết tiếp theo, khi tôi hướng dẫn các bạn tôi sẽ dùng theme hack để chỉnh sửa, thêm mới, ....

  • Cài đặt email cho GraffitiCMS

    Bài viết này mình hướng dẫn bạn cài đặt email settings cho GraffitiCMS. Email mình dùng ở đây là Gmail.

    Trước tiên login vào GraffitiCMS với user admin của mình. Sau đó chọn phần Site Optons -> Email Settings. Sau đó nhập vào các giá trị như hình sau:

    Đương nhiên là bạn phải sửa lại username password GMAIL của bạn rồi. Cuối cùng send một test email thử bằng cách nhập địa chỉ email cần test sau đó nhấn Send email.

    Rất đơn giản phải không !

     

  • Community Server với URL thân thiện với SEO

    Khi bạn viết một bài viết trên blog của mình, bạn (cũng như tôi) đều muốn có nhiều người vào xem bài viết của mình. Tuy nhiên không phải ai cũng có thể biết được địa chỉ của trang web của mình phải không ? 90% khách viếng thăm trang web của mình là nhờ vào Search Engine. Do đó, nếu bạn là developer và bạn có blog, có viết ứng dụng Web thì khi đó bạn có quan tâm đến SEO không ? Và khi bạn tìm hiểu Search Engine thì chắc chắn bạn phải hiểu đến lúc này URL của trang web của bạn quan trọng như thế nào phải không ?

    Ví dụ với bài viết này có đường dẫn URL: ..../community-server/community-server-voi-url-than-thien-voi-seo/

    Và khi được một Search Engine nào đó index vào thì URL chứa các keywords như: Community Server, URL, SEO, than thien, voi (và thường thì Tiếng Việt khi được tìm sẽ tìm theo dạng Tiếng việt không dấu nhiều hơn có dấu!)

    Quay trở lại với Community Server. Bài viết này tôi hướng dẫn bạn fixed một bug nhỏ nhưng là một bước tiến rất lớn đối với Community Server. Vì sao tôi nói như vậy ? Nếu bạn để ý thì khi bạn post 1 bài viết trong blog của mình trong Community Server với tiêu đề là Tiếng Việt thì lúc đó bạn có nhìn kỹ vào URL của bài viết của mình không ? Và nếu nhìn kỹ thì bạn cố gắng lắm còn đọc không được nữa à! Bạn đã không đọc nỗi thì làm sao Search Engine đọc được hả.

    Bây giờ thì bắt tay vào làm như sau:

    Login vào Community Server với user mà bạn có thể post được bài trên blog của mình. Khi đó post bài test với tiêu đề (Title) như sau: Bí mật trong máy tính một trăm năm trước công nguyên. (nội dung không quan trọng, post TEST chẳng hạn). Lúc đó bạn sẽ thấy giống như hình sau:
     

    Sau đó lưu lại, và view lại bài post mới test, nhìn vào URL trên trình duyệt của bạn sẽ thấy như hình sau



    Wowo, bạn thử copy đoạn tôi gạch đích, gửi cho bạn thân của bạn qua yahoo messenger và hỏi họ đọc được đó là gì ? A a a a.... họ đọc được không ? nếu họ đọc không được thì làm sao SEO đọc được nữa đây. Đúng vậy, vấn đề tôi muốn URL của tôi lúc này phải là

    Vì sao có sự khác biệt như thế. Thật ra đó là do Community Server khi thiết kế là họ thiết kế cho ngôn ngữ Tiếng Anh. Do đó họ chỉ cần dùng các ký tự ASCII là đủ. Còn mình khi post bài lại dùng Tiếng Việt Unicode nên mới có sự xảy ra như thế. Và khi bài viết của bạn được published lên blog thì đều đó có nghĩa là nó đã được lưu xuống database và không có khả năng fixed lại (nếu có thì phải can thiệp trực tiếp xuống database, và điều này chỉ làm khi bạn thật sự có kinh nghiệm nhiều về Community Server).

    Vậy có cách nào khác phục không ? và tôi muốn URL của tôi phải đọc được giống như là: Tiếng Việt không dấu ? OK, Tiếng Việt không dấu đọc cũng hiểu mà (nhiều khi bạn chat cũng dùng Tiếng Việt không dấu nhiều mà).

    Cách khác phục thì đương nhiên là có và cách này yêu cầu bạn phải sửa Core code của Community Server và khi đó phải phải build lại DLL và upload nó vào lại thư mục bin trong host của mình.

    Sau đây mình hướng dẫn bạn cách khắc phục (fixed) lỗi này nhe.

    + Mở solution Community Server 2008 SP1 SDK bằng Visual Studio 2008
    + Click vào project CommunityServerComponents20, sau đó chọn file  \Components\Globals.cs  và thêm vào method sau. (Nên thêm ở đầu class này).

       27         public static string RemoveDiacritics(string input)

       28         {

       29             input = input.Replace('đ', 'd');

       30             input = input.Replace('Đ', 'D');

       31             string stFormD = input.Normalize(NormalizationForm.FormD);

       32             int len = stFormD.Length;

       33             System.Text.StringBuilder sb = new StringBuilder();

       34             for (int i = 0; i < len; i++)

       35             {

       36                 UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[i]);

       37                 if (uc != UnicodeCategory.NonSpacingMark) { sb.Append(stFormD[i]); }

       38             }

       39             return (sb.ToString().Normalize(NormalizationForm.FormC));

       40         }

    + Tiếp tục, click chọn project: CommunityServerBlogs20, sau đó chọn file: WeblogPosts.cs.
    + Sau đó đi đến dòng 212. Lúc đó là method sau

      212 internal static void PostFormatting(WeblogPost post)

    + Cẩn thận sửa lại trong method này như sau: (comment dòng code gốc, sau đó edit lại thành dòng mới)

      223  //string name = spacer.Replace(postNameInvalidChars.Replace(post.Subject, " "), " ").Trim().ToLower();

      224  string name = spacer.Replace(postNameInvalidChars.Replace(Globals.RemoveDiacritics(Globals.HtmlDecode(post.Subject)), " "), " ").Trim().ToLower();

    + Cuối cùng chọn Release_Obfuscate để build solution.
    + Sau đó, vào thư mục bin của project  CommunityServerWeb20 (Internal) để copy 2 file:  CommunityServer.Blogs.dll, CommunityServer.Components.dll lên thư mục bin của host (nếu đã published lên host)
    + Test thử post một bài và các bạn có thể xem kết quả như hình dưới đây
     

    Bạn có ý kiến gì không ?