-1

ナビゲーションを構築するプロジェクトの場合。テーブルはこんな感じ

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ヘッダーは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
4

1 に答える 1

0

投稿した内容からactiveを指定する方法はわかりませんが、少なくとも次のようにすると、関数はヘッダークラ​​スを含むリストを返します。

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;
}

変更に関するいくつかのメモ

  • 関数を「void」ではなく「string」を返すように変更し、直接書き込む代わりに文字列を返すように変更しました。これにより、一般に、リストを正確に出力する場所をより細かく制御できます。
  • 関数内で呼び出されるすべての変数のスコープを追加しました(「var」キーワードを使用)。以下の例はCF9/railoでのみ機能することに注意してください。以前のバージョンを使用している場合は、var定義を関数の先頭に配置する必要があります。不明な場合は、質問してください。
  • 「アクティブ」にフラグを立てるためのロジックを追加する場所を示すためにスペースを残しました
  • i++の代わりに使用されi = (i + 1)ます(これが何をするかについての情報については、++iとi++の違いは何ですか?を参照してください)
  • 文字列に追加するために使用strReturn &= ...され、機能的には同等ですstrReturn = strReturn & ....
于 2013-03-25T12:33:40.550 に答える