Thanks for the generous code sharing..
Have great day
--- Max Larsson <[EMAIL PROTECTED]> wrote: >
Hi,
>
> well here is my solution, which is completly
> serverside.
> Thus no javascript is needed.
>
> First some description to the attached files.
>
> menu.sql contains the sql command for postgresql
> 7.1.
> It has a table containing the sql tree, based on the
> nested set model from SQL for smarties. Then there
> are
> two views for easily getting the direct parent of a
> menu.
> Actually i would like to have one view does it, but
> couldn't
> achieve it. Any ideas or improvements are welcome.
> At last there are 4 methods for insert,delete and
> moving
> a child menu to be the first or last child of menu.
>
> menu.xsp procuces a flat dump of the menu from the
> database.
>
> menu2hier.xsl transforms a flat dump to a
> hierarchily menu.
>
> menu2html.xsl transfomrs the hierarchily menu to
> html.
>
> The configuration in the sitemap is the following:
>
> <map:match pattern="navigate">
> <map:act type="menu-management">
> <map:generate type="serverpages"
> src="menu.xsp"/>
> <map:transform
> src="stylesheets/menu2hier.xsl"/>
> <map:transform src="stylesheets/menu2html.xsl">
> <map:parameter name="menu_ids"
> value="{menu_ids}"/>
> </map:transform>
> <map:serialize/>
> </map>
> </map:match>
>
> the Action menu-managment if the following:
>
> public class MenuManagementAction extends
> AbstractComplementaryConfigurableAction {
>
> public Map act( Redirector
> redirector,SourceResolver resolver,Map
> objectModel,String source,Parameters param ) throws
> Exception {
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : start" );
>
> HashMap result = new HashMap();
> HttpRequest request =
> (HttpRequest)objectModel.get(
> Constants.REQUEST_OBJECT );
> Session session = request.getSession();
>
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : request object
> = " + request );
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : session object
> = " + session );
>
> String id_add_str = request.getParameter(
> "addid" ) != null ?
> request.getParameter( "addid" ) : "0";
> String id_rem_str = request.getParameter(
> "remid" ) != null ?
> request.getParameter( "remid" ) : "0";
> String menu_ids = session.getAttribute(
> "menu_ids" ) != null ?
> (String)session.getAttribute( "menu_ids" ) : "$1$";
>
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : add id string
> = " + id_add_str );
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : remove id
> string = " + id_rem_str );
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : show ids = " +
> menu_ids );
>
> if( id_add_str.equals( "" ) )
> id_add_str = "0";
>
> int id_add = Integer.parseInt( id_add_str.trim()
> );
>
> if( id_rem_str.equals( "" ) )
> id_rem_str = "0";
>
> int id_rem = Integer.parseInt( id_rem_str.trim()
> );
>
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : add id int = "
> + id_add );
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : remove id int
> = " + id_rem );
>
> // decompose
> Vector menu_ids_vec = new Vector();
> for( StringTokenizer tokens = new
> StringTokenizer(
> menu_ids.trim(),"$" );tokens.hasMoreTokens(); )
> menu_ids_vec.add( (String)tokens.nextToken()
> );
>
> // add
> if( id_add > 0 ) {
> boolean found = false;
> for( Enumeration ids =
> menu_ids_vec.elements();ids.hasMoreElements()
> && !found; ) {
> if( ((String)ids.nextElement()).equals(
> Integer.toString(
> id_add ) ) )
> found = true;
> }
>
> if( !found )
> menu_ids_vec.add( Integer.toString( id_add )
> );
> }
>
> // rem
> if( id_rem > 1 ) {
> for( Enumeration ids =
> menu_ids_vec.elements();ids.hasMoreElements(); ) {
> String id = (String)ids.nextElement();
>
> if( id.equals( Integer.toString( id_rem ) )
> ) {
> menu_ids_vec.removeElement( id );
> break;
> }
> }
> }
>
> // compose
> menu_ids = "$";
> for( Enumeration ids =
> menu_ids_vec.elements();ids.hasMoreElements(); )
> menu_ids += (String)ids.nextElement() + "$";
>
> session.setAttribute( "menu_ids",menu_ids );
> result.put( "menu_ids",menu_ids );
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : show ids
> composed = " + menu_ids );
>
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : result = " +
> result );
> getLogger().debug( "HelpDesk :
> MenuManagementAction/act : end != null" );
>
> return Collections.unmodifiableMap( result );
> }
> }
>
> And no some explainantion.
> The actions computes a session attribute menu_ids,
> which is even
> forwarded to the second stylesheet. It contains a $
> seperated
> id from mneu table, which should be displayed
> expanded.
>
> Have a lot of fun with it. It may not be the best
> solution, but i like
> it and suggestion and improvments are as stated
> welcome.
>
> Max
>
>
>
>
> Hi.,
> I appreciate if anyone is generous enough to
> share
> xsl code for building collapsing menu structure for
> my
> sample project...
>
>
> Thanks
>
> --- Vadim Gritsenko <[EMAIL PROTECTED]> wrote: >
> If
>
=== message truncated ===
> ATTACHMENT part 2 application/octet-stream
name=menu.sql
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="xml" encoding="ISO-8859-1"/>
>
> <xsl:template match="menu-container[ @type = 'flat'
> ]">
> <menu-container type="hierarchy">
> <xsl:apply-templates select="menu[ position() = 1
> and @level = 1]"/>
> </menu-container>
> </xsl:template>
>
> <xsl:template match="menu[ @subs > 0 ]">
> <xsl:variable name="level" select="@level"/>
> <xsl:variable name="subs" select="@subs + 1"/>
> <menu>
> <xsl:apply-templates
> select="node()|@*"/>
> <xsl:for-each select="following-sibling ::menu[
> position() < $subs and @level = $level + 1]">
> <xsl:apply-templates select="."/>
> </xsl:for-each>
> </menu>
> </xsl:template>
>
> <xsl:template match="menu[ @subs = 0 ]">
> <menu>
> <xsl:apply-templates
> select="node()|@*"/>
> </menu>
> </xsl:template>
>
> <xsl:template match="node()|@*" priority="-1">
> <xsl:copy>
> <xsl:apply-templates select="node()|@*"/>
> </xsl:copy>
> </xsl:template>
>
> </xsl:stylesheet>
> > <?xml version="1.0" encoding="ISO-8859-1"?>
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:fo="http://www.w3.org/1999/XSL/Format">
> <xsl:output method="xml" encoding="ISO-8859-1"/>
>
> <xsl:param name="menu_ids">$1$</xsl:param>
>
> <xsl:template match="page">
> <html>
> <!-- These HTML-pages and the information herein
> are property of GM Service Operations. Distribution
> without prior consent is prohibited. Internal use
> only. -->
> <head>
> <meta http-equiv="Content-Type"
> content="text/html; charset=iso-8859-1"/>
> <meta http-equiv="expires" content="0"/>
> <meta http-equiv="pragma" content="no-cache"/>
> <title><xsl:value-of select="normalize-space(
> @title )"/></title>
> <style type="text/css">
> <xsl:comment>
> a:active { font-weight:bold; }
> a:hover { font-weight:bold; }
> span { font-family:Arial;
>font-size:9pt; }
> a { text-decoration:none; }
> td { font-family:Arial; font-size:9pt;
>}
> input { font-family:Arial;
>font-size:9pt; }
> </xsl:comment>
> </style>
> </head>
> <body bgcolor="#A6CAF0" text="#000000"
> alink="#FF0000" vlink="#0000FF" link="#000000">
> <xsl:apply-templates select="node()|@*"/>
> </body>
> </html>
> </xsl:template>
>
> <xsl:template match="menu-container[ @type =
> 'hierarchy' ]">
> <xsl:apply-templates select="menu"/>
> </xsl:template>
>
> <xsl:template match="menu[ menu and contains(
> $menu_ids,@id ) ]">
> <xsl:param name="indent" select="1"/>
> <!-- menu with opened submenu -->
> <nobr>
> <img src="/icon/1x1.gif" alt="" border="0"
> width="{$indent}" height="1"/>
> <a href="navigate?remid={@id}"
> target="Navigation">
> <img src="/icon/symb_folder_opened.gif"
> border="0" width="9" height="9"
> alt="{normalize-space( description ) }"/>
> </a>
> <img src="/icon/1x1.gif" alt="" border="0"
> width="6" height="1"/>
> <a href="{normalize-space( link )}"
> target="{normalize-space( target )}"
> title="{normalize-space( description )}">
> <span>
> <xsl:value-of select="normalize-space( title
> )"/>
> </span>
> </a>
> </nobr>
> <br/>
> <xsl:apply-templates select="menu">
> <xsl:with-param name="indent" select="$indent +
> 15"/>
> </xsl:apply-templates>
> </xsl:template>
>
> <xsl:template match="menu[ menu and not(
> contains( $menu_ids,@id ) ) ]">
> <xsl:param name="indent" select="1"/>
> <!-- menu with opened submenu -->
> <nobr>
> <img src="/icon/1x1.gif" alt=""
> border="0" width="{$indent}" height="1"/>
> <a href="navigate?addid={@id}"
> target="Navigation">
> <img
> src="/icon/symb_folder_closed.gif" border="0"
> width="9" height="9" alt="{normalize-space(
> description ) }"/>
> </a>
> <img src="/icon/1x1.gif" alt=""
> border="0" width="6" height="1"/>
> <a href="{normalize-space( link )}"
> target="{normalize-space( target )}"
> title="{normalize-space( description )}">
> <span>
> <xsl:value-of
> select="normalize-space( title )"/>
> </span>
> </a>
> </nobr>
> <br/>
> </xsl:template>
>
> <xsl:template match="menu[ not( menu )]">
> <xsl:param name="indent" select="1"/>
> <!-- Leaf -->
> <nobr>
> <a href="{normalize-space( link )}"
> target="{normalize-space( target )}"
> title="{normalize-space( description )}">
> <img src="/icon/1x1.gif" alt="" border="0"
> width="{$indent}" height="1"/>
> <img src="/icon/symb_document.gif" border="0"
> width="9" height="9" alt="{normalize-space(
> description ) }"/>
> <img src="/icon/1x1.gif" alt="" border="0"
> width="6" height="1"/>
> <span>
> <xsl:value-of select="normalize-space( title
> )"/>
> </span>
> </a>
> </nobr>
> <br/>
> </xsl:template>
>
> <xsl:template match="node()|@*" priority="-1">
> <xsl:copy>
> <xsl:apply-templates select="node()|@*"/>
> </xsl:copy>
> </xsl:template>
> </xsl:stylesheet>
>
> ATTACHMENT part 5 application/octet-stream
name=menu.xsp
>
---------------------------------------------------------------------
> Please check that your question has not already been
> answered in the
> FAQ before posting.
> <http://xml.apache.org/cocoon/faqs.html>
>
> To unsubscribe, e-mail:
> <[EMAIL PROTECTED]>
> For additional commands, e-mail:
<[EMAIL PROTECTED]>
=====
Thanks and have great day
srini
____________________________________________________________
Do You Yahoo!?
For regular News updates go to http://in.news.yahoo.com
---------------------------------------------------------------------
Please check that your question has not already been answered in the
FAQ before posting. <http://xml.apache.org/cocoon/faqs.html>
To unsubscribe, e-mail: <[EMAIL PROTECTED]>
For additional commands, e-mail: <[EMAIL PROTECTED]>