0

基本的に、各子メニューを親メニュー ID にのみ表示したいと考えています。しかし、これまでのところ、私がli設定したすべての子が親メニューに接続しているだけです。

メニューが現在どのように表示されているかを説明する図を次に示します。

  • 概要 > 求人とモバイル (求人のみを表示したい)

    サービス > 雇用 & モバイル (モバイルのみ表示したい)

  • コンタクト

したがって、クエリはデータベースから次の変数を出力します

  • pg_LinkName
  • pg_MenuTitle
  • pg_ParentMenu (親メニューの名前)、
  • pg_MenuType (親/サブメニューかどうかのはい/いいえ)、
  • pg_SubMenu (メニューが親メニューかどうかを指定する yes/no)

子を親に動的に接続する方法があるかどうか知りたいです。例えば。ページを親に添付することを選択した場合、ドロップダウンでその親にのみ表示されます。

ここに私の質問があります:

<cfquery name="qry_GetMenu" datasource="#request.dsn#"> 
    SELECT *
    FROM tbl_pages 
    WHERE pg_MenuType = TRUE AND pg_Display = TRUE AND pg_AutoMenu = TRUE AND pg_Horiz_VertMenu = TRUE
    ORDER BY pg_sort
</cfquery>

<cfquery name="qry_GetSubMenus" datasource="#request.dsn#"> 
    SELECT *
    FROM tbl_pages 
    WHERE pg_MenuType = FALSE 
    ORDER BY pg_sort
</cfquery>

<cfquery name="qry_SubMenu" datasource="#request.dsn#"> 
    SELECT *
    FROM tbl_pages
    WHERE pg_SubMenu = TRUE
    ORDER BY pg_sort
</cfquery>

そして、これは私がメニューに持っているものです:

<ul class="menu">     
    <cfoutput query="qry_GetMenu">
        <li <cfif cgi.path_info contains "#pg_LinkName#"> class="current-menu-parent"</cfif>>
        <a href="#systemurl#/index.cfm/#pg_LinkName#/">#pg_MenuTitle#</a>
        <cfif pg_SubMenu gt 0>
            <ul class="sub-menu">
                <cfloop query="qry_GetSubMenus">
                    <li><a href="#systemurl#/index.cfm/#pg_ParentMenu#/#pg_LinkName#/">#pg_MenuTitle#</a></li>
                </cfloop>
            </ul>
        </cfif>
        </li>
    </cfoutput>
</ul>
4

1 に答える 1

0

私が正しく理解していれば、対応する親の下に割り当てられた子のみを表示したいのですが、コードは現在、表示されているすべての親の下に子要素を表示していますか?

現在のコードでは、クエリの 1 つを並べて移動する必要があります。

<ul class="menu">     
<cfoutput query="qry_GetMenu">
    <li <cfif cgi.path_info contains "#pg_LinkName#"> class="current-menu-parent"</cfif>>
    <a href="#systemurl#/index.cfm/#pg_LinkName#/">#pg_MenuTitle#</a>
    <cfif pg_SubMenu gt 0>
        <ul class="sub-menu">
        <!---moved inline to add additional conditional pg_ParentMenu clause--->
        <cfquery name="qry_GetSubMenus" datasource="#request.dsn#">  
            SELECT * FROM q WHERE pg_MenuType = 0 AND pg_ParentMenu = '#pg_ParentMenu#'
        </cfquery>
            <cfloop query="qry_GetSubMenus">
                <li><a href="#systemurl#/index.cfm/#pg_ParentMenu#/#pg_LinkName#/">#pg_MenuTitle#</a></li>
            </cfloop>
        </ul>
    </cfif>
    </li>
</cfoutput>

これにより、すべての親メニューではなく、現在の親メニューに限定してクエリをフィルター処理できます。巨大なデータセットの場合、これはかなり非効率になります。その時点で多くのオプションがあります(ループを実行し、親と子のキーを持つ構造体の配列のような別のオブジェクトに割り当て、子を別の配列にするか、データベースを再加工してサブメニューを作成しますリレーショナルなど)。

それが正しい方向に進んでいることを願っています。

于 2013-05-06T15:02:19.923 に答える