Tạo sitemap với dữ liệu từ database
Posted: 29/3/2010.
Bài viết này sẽ hướng dẫn cách viết hàm lấy dữ liệu từ database dưới dạng SiteMapNode để sử dụng tạo menu đa cấp với MultiSitemap (dữ liệu file.sitemap).
Bài viết này sẽ hướng dẫn cách viết hàm lấy dữ liệu từ database dưới dạng SiteMapNode để sử dụng tạo menu đa cấp với MultiSitemap (dữ liệu file.sitemap).
Thường việc này bạn có thể dùng code asp.net (C# hay VB) để thực hiện bằng vòng lặp hoặc sử dụng System.Xml - XmlTextWriter để thực hiện. Nhưng bạn cũng có thể sử dụng vòng lặp trong SQL để thực hiện việc này. Ở đây mình viết hàm trong SQL kết quả trả về là nội dung của file MenuTop.sitemap. Hàm này lấy đến menu cấp 3. nếu dự án của bạn có nhiều hơn 3 cấp bạn hãy sửa lại hàm cho phù hợp
Bạn chạy hàm sau trong SQL
-
- ALTER FUNCTION [dbo].[fuGetTreeNode_Map]
- (
- )
- RETURNS NVarChar(4000)
- AS
- BEGIN
- DECLARE @SQL nvarchar(4000)
- SET @SQL=''
- -- Khai báo mở sitemap
- SET @SQL=@SQL+N'<?xml version="1.0" encoding="utf-8" ?>
- <siteMap>'
- -- Duyệt cây cấp 1 (Có Decen=0)
- DECLARE @CateID int, @CateName nvarchar(200), @Link nvarchar(200)
- Declare Cursor_Category Cursor For SELECT CateID, CateName, Link FROM TB_Category WHERE Decen=0
- Open Cursor_Category
- Fetch next from Cursor_Category INTO @CateID, @CateName , @Link
- while @@Fetch_Status =0
- BEGIN
- -- Nếu cây cấp 1 không có con thì đóng luôn TreeNode
- IF dbo.fuCountSubMenu(@CateID)=0
- BEGIN
- SET @SQL=@SQL+ '
- <siteMapNode url="'+dbo.ufDomainName() + @Link + '" title="' + @CateName + '" />'
- END
- -- Nếu cây cấp 1 có con thì mở TreeNote và tiếp tục duyệt cây cấp 2
- ELSE
- BEGIN
- SET @SQL=@SQL+ '
- <siteMapNode url="'+dbo.ufDomainName() + @Link + '" title="' + @CateName + '" >'
- -- Duyệt cây cấp 2
- DECLARE @CateID_2 int, @CateName_2 nvarchar(200), @Link_2 nvarchar(200)
- Declare Cursor_Category_2 Cursor For SELECT CateID, CateName, Link FROM TB_Category WHERE Decen=1 AND ParentID=@CateID
- Open Cursor_Category_2
- Fetch next from Cursor_Category_2 INTO @CateID_2, @CateName_2 , @Link_2
- WHILE @@FETCH_STATUS=0
- BEGIN
- -- Nếu cây cấp 2 không có con thì đóng luôn TreeNode
- IF dbo.fuCountSubMenu(@CateID_2)=0
- BEGIN
- SET @SQL=@SQL+ '<siteMapNode url="'+dbo.ufDomainName() + @Link_2 + '" title="' + @CateName_2 + '" />'
- END
- -- Nếu cây cấp 2 có con thì mở TreeNode và tiếp tục duyệt cây cấp 3
- ELSE
- BEGIN
- SET @SQL=@SQL+ '
- <siteMapNode url="'+dbo.ufDomainName() + @Link_2 + '" title="' + @CateName_2 + '" >'
- -- Duyệt cây cấp 3
- DECLARE @CateID_3 int, @CateName_3 nvarchar(200), @Link_3 nvarchar(200)
- Declare Cursor_Category_3 Cursor For SELECT CateID, CateName, Link FROM TB_Category WHERE Decen=2 AND ParentID=@CateID_2
- Open Cursor_Category_3
- Fetch next from Cursor_Category_3 INTO @CateID_3, @CateName_3 , @Link_3
- WHILE @@FETCH_STATUS=0
- BEGIN
- SET @SQL=@SQL+ '
- <siteMapNode url="'+dbo.ufDomainName() + @Link_3 + '" title="' + @CateName_3 + '" />'
- FETCH NEXT FROM Cursor_Category_3 INTO @CateID_3, @CateName_3 , @Link_3
- END
- Close Cursor_Category_3
- DEALLOCATE Cursor_Category_3
- SET @SQL=@SQL+ '</siteMapNode>'
- END
- FETCH NEXT FROM Cursor_Category_2 INTO @CateID_2, @CateName_2 , @Link_2
- END
- Close Cursor_Category_2
- DEALLOCATE Cursor_Category_2
- SET @SQL=@SQL+ '</siteMapNode>'
- END
- FETCH NEXT FROM Cursor_Category INTO @CateID, @CateName , @Link
- END
- Close Cursor_Category
- DEALLOCATE Cursor_Category
- --Đóng sitemap
- SET @SQL=@SQL+'
- </siteMap>'
- -- Print @SQL
- RETURN @SQL
- END
Nếu bảng TB_Category của bạn có nhiều bản ghi thì độ dài chuỗi @SQL có thể quá 4000. Khi đó bạn cần phân tách và ghép chuỗi lại
Kết quả hàm trên (hoặc bạn thử bằng lệnh Print @SQL) như sau (Bạn có thể copy vào Visual Studio để xem đúng cấu trúc)
- <?xml version="1.0" encoding="utf-8" ?>
- <siteMap>
- <siteMapNode url="http://www.hmweb.com.vn" title="Thể thao" >
- <siteMapNode url="http://www.hmweb.com.vn" title="Pháp luật" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Môi trường" />
- </siteMapNode>
- <siteMapNode url="http://www.hmweb.com.vn" title="Thể thao" >
- <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá" >
- <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá trong nước" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá Anh" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá TBN" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Bóng đá Ý" />
- </siteMapNode>
- <siteMapNode url="http://www.hmweb.com.vn" title="Quần vợt" />
- </siteMapNode>
- <siteMapNode url="http://www.hmweb.com.vn" title="Sức khỏe" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Kinh doanh" >
- <siteMapNode url="http://www.hmweb.com.vn" title="Chứng khoán" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Thị trường" />
- <siteMapNode url="http://www.hmweb.com.vn" title="Doanh nghiệp" />
- </siteMapNode>
- <siteMapNode url="http://www.hmweb.com.vn" title="Giải trí" />
- </siteMap>
Khi đã có dữ liệu hàm trên rồi bạn có thể chạy thử bằng câu lệnh SELECT dbo.fuGetTreeNode_Map() để xem kết quả.
Từ kết quả trên để đưa ra file.sitemap bạn chỉ cần viết 1 hàm (C#) write ra file với phát biểu Select là xong.
Chúc các bạn thành công.
Theo hmweb.com.vn
[Nghean-Aptech st]
Các tin mới:
Hướng dẫn tích hợp giao diện trang quản trị SB Admin 2 vào Laravel 5.8.
Hướng dẫn tích hợp Google ReCaptcha v2 vào Laravel bằng curl.
Học lập trình React JS trong vòng 5 phút.
Sử dụng trình soạn thảo CKeditor tích hợp CKFinder với Laravel.
Hướng dẫn cài đặt Apache, PHP, MySQL, PHPMyAdmin trên Windows 10 và cấu hình SendMail.
Các tin cũ hơn:
Giảm kích thước file CSS với .NET.
Sao lưu tất cả database của SQL Server.
10 lý do bạn chọn MySQL.
Hướng dẫn install YetanotherForum trên localhost.
Nhúng reCaptcha vào ASP.NET.