2013-03-25 47 views
-1

對於構建導航的項目。該表是這樣的使用列表標題構建動態導航(coldfusion&cfscript)

SELECT TOP 1000 
    [id] 
    ,[title] 
    ,[action] 
    ,[listOrder] 
    ,[fk_parentId] 
FROM [portfolio].[dbo].[menu] 

其中Fk_parentId指的是一個ID ...建立一個層級菜單。 Listorder包含許多

現在我想我的導航輸出這樣

<ul class="nav nav-list"> 
     <li class="nav-header active">List header</li> 
     <li class="active"><a href="#">Home</a></li> 
     <li><a href="#">Library</a></li> 
     <li><a href="#">Applications</a></li> 
     <li class="nav-header">Another list header</li> 
     <li><a href="#">Profile</a></li> 
     <li><a href="#">Settings</a></li> 
     <li class="divider"></li> 
     <li><a href="#">Help</a></li> 
</ul> 

所以NAV頭必須被檢測爲導航標題和菜單項子。現在我有這樣的代碼

public void function main(struct rc) { 

    queryService = new query(); 
    queryService.setDatasource("portfolio"); 
    result = queryService.execute(sql="SELECT * FROM menu ORDER by listOrder"); 


    // result 
    GetMenuData = result.getResult(); 


    // Loopen over result 
    writeOutput("<ul class='nav nav-list>'"); 
    for (i = 1; i LTE GetMenuData.RecordCount; i = (i + 1)) 
    { 

     // Output 
     WriteOutput(
     "<li><a href='"& GetMenuData[ "action" ][ i ] & "'>" & GetMenuData[ "title" ][ i ] & "</a></li>" 
     ); 

    } 
    writeOutput("</ul>'"); 

} 

這個結果:

<ul class='nav nav-list>' 
     <li><a href='alk.profile'>PROFILE</a></li> 
     <li><a href=''>List header</a></li> 
     <li><a href='main.'>home</a></li> 
     <li><a href=''>Another List header</a></li> 
     <li><a href='alh.settings'>settings</a></li> 
     <li><a href='main.library'>librarY</a></li> 
     <li><a href='help.main'>Help</a></li> 
     <li><a href='main.applications'>applications</a></li> 
    </ul>' 

如何,我可以添加類的頭一個「頭」 <li>像listheader,另一個列表頭?

如何動態添加設置和幫助之間的分隔線?

title     action    listOrder fk_parentId 
Another List header  NULL    20   NULL 
PROFILE     alk.profile   5   539BB1A4-5AB5-4059-93AD-17DD8EABAF60 
Help     help.main   40   NULL 
settings    alh.settings  20   539BB1A4-5AB5-4059-93AD-17DD8EABAF60 
applications   main.applications 50   C5EFAE69-FD2A-4B35-A613-B8D429091A8F 
List header    NULL    10   NULL 
home     main.    20   C5EFAE69-FD2A-4B35-A613-B8D429091A8F 
librarY     main.library  30   C5EFAE69-FD2A-4B35-A613-B8D429091A8F 
+1

看。它有一個組屬性,可能會使這更容易。 – 2013-03-25 12:02:32

+1

FYI @ r2get http://meta.stackexchange.com/questions/25088/how-can-i-delete-my-post-on-stack-overflow - 你意識到你的所有文字仍然可見,只是看到編輯的日誌是否正確? – 2013-03-26 08:51:02

回答

0

我看不到你是如何從你發佈的內容中指定活動的,但以下至少會導致函數返回包含頭類的列表。

public string function main(struct rc) { 

    // Set up the return string 
    var strReturn = '<ul class="nav nav-list">'; 

    // Set up the query 
    var queryService = new Query(
     datasource='portfolio' 
    ); 

    // Execute and get result, specifying field names 
    var GetMenuData = queryService.execute(sql=' 
     SELECT 
      id, 
      action, 
      title, 
      fk_parentId 
     FROM menu 
     ORDER by listOrder ASC 
    ').getResult(); 

    // Loop over result 
    for (var i = 1; i <= GetMenuData.RecordCount; i++) { 

     // For this result, what classes are needed? 
     var strClasses = ''; 

     // Header class 
     if (
      Len(GetMenuData['fk_parentId'][ i ]) == 0 // Null/len 0 parent == header 
     ) { 
      strClasses = ListAppend(strClasses,'nav-header',' '); 
     } 

     // Add in some logic here for 'active' later on probably a good idea? 
     // strClasses = ListAppend(strClasses,'active',' ') if id == active id? May need adjustment to query for parent 

     if (
      Len(strClasses) > 0 
     ) { 
      strClasses = ' class="'&strClasses&'"'; 
     } 

     // Output list item 
     strReturn &= '<li'&strClasses&'>'; 

      // Add href if needed 
      if (
       Len(GetMenuData['action'][ i ]) > 0 
      ) { 
       strReturn &= '<a href="'&GetMenuData['action'][ i ]&'">'; 
      } 

      strReturn &= GetMenuData['title'][ i ]; 

      if (
       Len(GetMenuData['action'][ i ]) > 0 
      ) { 
       strReturn &= '</a>'; 
      } 

     // Close off the list item 
     strReturn &= '</li>'; 
    } 

    // End the return string 
    strReturn &= '</ul>'; 

    // And return it 
    return strReturn; 
} 

上的變化

  • 更改的功能的幾個注意事項有返回類型「串」,而不是「無效」,並修改它,因此它返回一個字符串,而不是直接書寫。這通常可以更精確地控制列表輸出的位置。
  • 爲函數內調用的所有變量添加了範圍(使用'var'關鍵字)。請注意,以下示例僅適用於CF9/railo。如果使用的是以前的版本,則VAR定義需要在函數的頂部,如果不確定,只是問
  • 左一個空間,指明你會在邏輯添加檢舉「活動」
  • 代替i = (i + 1)使用i++ (見What is the difference between ++i and i++?爲,做什麼的一些信息)
  • 用於strReturn &= ...在CFOUTPUT爲文檔添加到字符串,功能equivilant到strReturn = strReturn & ....
+0

由於某種原因,它什麼都不返回?但是查詢的工作原理是 – r2get 2013-03-25 13:14:37

+0

而不是僅僅執行'main()',你需要執行'WriteOutput(main());'或''(例如)字符串以某種方式在其他地方使用,而不是直接輸出到輸出緩衝區:) – 2013-03-25 13:35:33