2011-05-04 50 views
3

在ASP.Net我通常使用標準web.sitemap文件開我的主導航如下列:到ASP.Net在PHP web.sitemap中最佳替代

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > 
    <siteMapNode url="~/index.html" title="My Awesome Site"> 
     <siteMapNode url="~/About/index.html" title="About"> 
      <siteMapNode url="~/About/Board.html" title="Board"/> 
      <siteMapNode url="~/About/Vision.html" title="Vision"/> 
      <siteMapNode url="~/About/Mission.html" title="Mission"/> 
      <siteMapNode url="~/About/Support.html" title="Support"/> 
      <siteMapNode url="~/About/Locations.html" title="Locations"/> 
      <siteMapNode url="~/About/Funding-Sources.html" title="Funding Sources"/> 
      <siteMapNode url="~/About/Volunteer.html" title="Volunteer"/> 
      <siteMapNode url="~/About/Staff.html" title="Staff"/> 
     </siteMapNode> 
     <siteMapNode url="~/Parents/index.html" title="Parents"> 
      <siteMapNode url="~/Parents/Child-Development.html" title="Child Development"/> 
      <siteMapNode url="~/Parents/Referrals.html" title="Referrals"/> 
     </siteMapNode> 
     <siteMapNode url="~/Resources/index.html" title="Resources"> 
      <siteMapNode url="~/Resources/Resource-Library.html" title="Resource Library"/> 
      <siteMapNode url="~/Resources/Links.html" title="Links"/> 
     </siteMapNode> 
    </siteMapNode> 
</siteMap> 

然後我通常創建用於用戶控制導航,我可以使用SiteMap.CurrentNode和/或SiteMap.CurrentNode.IsDescendantOf將當前頁面標記爲「已選」或其他內容。我正在尋找類似於PHP的東西。在ASP經典中,我們幾乎不得不使用include和一組if語句,但是一旦深入幾級,就會得到一堆代碼。我可能會在每個頁面的頂部創建變量,指定我們正在使用哪個「部分」,「子部分」和「頁面」,但如果可能的話,我想避免這種情況。

我發現this link它通過查詢字符串反彈的事情,但是這不是一個選項。

如果有誰不熟悉web.sitemap文件,如果需要,我可以解釋它的更多細節。

編輯 - 評論對@BrandonS

什麼我要找的核心是能夠定義一個代表我的網站頁面的單個文件。 ASP.Net使用一個XML文件,它很方便捕捉一些潛在的錯誤,但不是必需的。理想情況下,我實際上想使用ASP.Net使用的完全相同的文件格式,以便我可以共享代碼,但仍不是絕對必需的。

在ASP.Net中,使用上面的站點地圖,我將有一個用戶控件(基本上是一個榮耀的包含文件),它在每個頁面上輸出<title>標記。在主頁頁它會輸出只是My Awesome Site,該關於 L2它會輸出My Awesome Site - About頁和董事會 L3它會輸出My Awesome Site - About - Board頁面上。子頁面上的麪包屑可能會使用同樣的想法。 (快速預留,爲我所有的網站頁面只出現一次,因此沒有有兩個家長頁的機會。)

在ASP.Net每個頁面請求的地圖對象被自動創建。 (其實我覺得它的惰性加載意味着它實際上還沒有生成,除非您嘗試訪問,但這種情況發生透​​明。)因此,在任何給定的時刻,我可以存在於Sitemap文件的任何頁面上使用SiteMap.CurrentNode對象。 (如果頁面沒有在網站地圖文件返回null存在)。從我可以要求SiteMap.CurrentNode.ParentNode或者我可以走了SiteMap.CurrentNode.ChildNodes。我也可以獲得代表站點地圖文件根目錄的SiteMap.RootNode。從那我可以走SiteMap.RootNode.ChildNodes知道這些直接的孩子代表我的網站的2級頁面。然後,我可以單獨行走這些孩子,知道每個「孫子」代表一個L3等等。

因此,使用上述遞歸我可以走根節點的孩子定義我的網站的主要導航,如果我在我的資產淨值有下拉菜單然後我就可以走子兒。在步行孩子或孫輩時,我可以根據SiteMap.CurrentNode是否等於或小孩或孫子的後代來設置課程。下面是VB中的一個例子。我如何使用站點地圖爲建設L2導航網:

''//An array that we append potential CSS class names to such as "first" or "active" 
    Dim Classes As List(Of String) 

    ''//A StringBuild is just an efficient way to work with Strings 
    ''//if you are not familiar with it just now that Append() is basically "&=" and AppenLine() is basically "&= ...\n" 
    Dim Buf As New StringBuilder() 
    Buf.AppendLine("  <ul>") 

    ''//Walk the root child nodes, the N variable will be the current ChildNode of the SiteMap.RootNote 
    For Each N As SiteMapNode In SiteMap.RootNode.ChildNodes 

     ''//For the first and last child we want to add extra classes in case we need to adjust borders, padding, etc 
     Classes = New List(Of String) 
     If N.PreviousSibling Is Nothing Then 
      Classes.Add("first") 
     ElseIf N.NextSibling Is Nothing Then 
      Classes.Add("last") 
     End If 

     ''//See if the page being requested is the current child or if the current page is descended from it so that we can mark it as active 
     If SiteMap.CurrentNode IsNot Nothing Then 
      If SiteMap.CurrentNode.Equals(N) OrElse SiteMap.CurrentNode.IsDescendantOf(N) Then 
       Classes.Add("active") 
      End If 
     End If 

     ''//This code below is just for outputting the <li class="..."><a href="...">...</a></li> code 

     ''//Write the opening list tag 
     Buf.Append("  <li") 
     ''//If the above code created any CSS classes append the class attribute and the space-delimited list of classes 
     If Classes.Count > 0 Then 
      Buf.Append(" class=""" & Join(Classes.ToArray(), " ") & """") 
     End If 
     ''//Close the list tag 
     Buf.Append(">") 

     ''//Append the hyperlink. The "N" object is the current child of the SiteMap.RootNode.ChildNodes 
     ''//All SiteMapNode objects have a Url property and a Title property which is defined in the XML file 
     Buf.AppendFormat("<a href=""{0}"">{1}</a></li>", N.Url.Replace("/index.html", "/"), HttpUtility.HtmlEncode(N.Title)) 

     ''//Append a blank line, I like to keep my code formatted nicely 
     Buf.AppendLine() 
    Next 

    ''//Append the closing list tag 
    Buf.AppendLine("  </ul>") 

附加說明

有些人可能會認爲這是矯枉過正,但是這是所有內置的.Net,這就是爲什麼我詢問是否存在PHP的東西。我可以推出自己的產品,但顯然我希望儘可能避免使用它。

+0

Chris我認爲我可以提供幫助,但是因爲PHP中沒有ASP類的直接端口,因此無法直接訪問正確的PHP類,因此我正在尋找的主要功能是什麼,因爲我知道20這將滿足大多數ASP類的規範,但如果你將成爲一組特定的函數,我可以建議更適合你。我想我在說你想做什麼? – BrandonS 2011-05-06 16:45:33

+2

如果你想使用一個完全像ASP的web.sitemap文件,你將需要編寫一個類來執行此操作。大多數框架都有內置的東西來處理導航。所以也許告訴我們你使用的是什麼框架會有所幫助。 Zend,Symphony,Cake,CodeIgniter? – 2011-05-06 19:07:51

+0

@BrandonS,我回答了上面的一些細節。 @Harmon Wood,我通常以Zend框架爲目標。對於每個人來說,我知道我可以推出我自己的XML解析代碼,我只是希望不能構建某人已經做過的事情,並且迄今爲止我的搜索沒有返回任何內容。此外,我不希望整個CMS(WordPress,Joomla等),我只是尋找一個導航助手。 – 2011-05-06 19:29:13

回答

2

嗯......據我所知,PHP中沒有內置的解決方案。他們有很多框架。

例如在Zend中,我們有navigation containers,可以存儲您選擇的任何格式的所有數據 - 例如xml-config。然後在zend view navigation helpers的幫助下,我們可以在我們的佈局或具體頁面中輸出它。

作爲一個例子,你可以看到它的自動翻譯後here

+0

感謝@Alexander,這是迄今爲止最接近的,我甚至可以在兩種文件格式之間建立映射器。 – 2011-05-09 13:30:04

+0

再次感謝@亞歷山大,我要獎賞你的賞金。其他人,感謝您的意見,並感謝您展示我可以建立自己的方式。最終,我的問題是,如果某件事已經存在,並且@亞歷山大的答案最符合該法案。 – 2011-05-11 12:57:02

0

澄清我是否正確理解您的目標:您是否希望單個文件處理所有頁面的標題和父母?

當然! htaccess :)

RewriteEngine on 
# ROOT 
RewriteRule ^me.html$   me.php?title=Home+Page [L,QSA] 
# ABOUT 
RewriteRule ^about/index.html$ about/index.php?parent=About&title=About [L,QSA] 
RewriteRule ^about/staff.html$ about/staff.php?parent=About&title=The+Staff [L,QSA] 

但是,您不能在文件系統結構中使用.html文件,因爲它是靜態的。這些文件需要在.php中,但是使用該htaccess的配置,URL將保持爲.html。

該網址about/index.html將尋找about/index.php並傳遞兩個變量:父母和標題。這個php文件還需要根據你的URL目錄進行組織,如index.php,staff.php在​​文件夾中。

about/index.php文件,可以輸出:

<?php 
echo $_GET['parent']; 
echo "<br />"; 
echo $_GET['title']; 

研究更多的htaccess如果我的回答不夠,但我認爲這是你在找什麼。

+0

謝謝@dragonjet,但我不認爲這讓我需要去的地方。這確實通過一個變量顯示我的直接父母,但它不處理一個完整的層次結構,而不會變得非常混亂。我試圖找到替代方法的'web.sitemap'文件允許我找出父母和孩子以及兄弟姐妹的信息。 – 2011-05-07 09:24:46

+0

哦,我看到,對於兄弟姐妹,父母和層次結構,那麼您可能希望使用SimpleXML解碼相同的文件並使用SimpleXML庫的內置函數。在所有頁面上使用它,最好將它「包含」爲一個文件。但它不會對標題有幫助,所以將它與上面的htaccess一起使用。 – dragonjet 2011-05-07 10:24:12