CHANGES: NEWS DOWNLOAD: SmartyMenu-1.1.tar.gz DEMO: Menu Demo NAME: SmartyMenu: a class/plugin for generating dropdown menus within the Smarty template environment. AUTHOR: Monte Ohrt (monte [AT] ohrt [DOT] com) VERSION: 1.1 DATE: October 18th, 2005 WEBSITE: http://www.phpinsider.com/php/code/SmartyMenu/ DOWNLOAD: http://www.phpinsider.com/php/code/SmartyMenu/SmartyMenu-current.tar.gz ANONYMOUS CVS: (leave password empty) cvs -d :pserver:anonymous@cvs.phpinsider.com:/export/CVS login cvs -d :pserver:anonymous@cvs.phpinsider.com:/export/CVS checkout SmartyMenu SYNOPSIS: index.php --------- session_start(); require('Smarty.class.php'); require('SmartyMenu.class.php'); $smarty =& new Smarty; // attempt to load the menu from the session if(($menu = (SmartyMenu::loadMenu('mymenu'))) === false) { // initialize your menu SmartyMenu::initMenu($menu); // first menu item SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Yahoo'); SmartyMenu::setItemLink($item, 'http://www.yahoo.com/'); SmartyMenu::addMenuItem($menu, $item); // second menu item SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Google'); SmartyMenu::setItemLink($item, 'http://www.google.com/'); SmartyMenu::addMenuItem($menu, $item); // third menu item SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Netscape'); SmartyMenu::setItemLink($item, 'http://www.netscape.com/'); SmartyMenu::addMenuItem($menu, $item); // save the menu into the session SmartyMenu::saveMenu('mymenu', $menu); } $smarty->assign('menu', $menu); $smarty->display('index.tpl'); index.tpl --------- <html> <head> {menu_init css="/css/menu.css"} </head> <body> Menu Test <p> {menu data=$menu} </p> </body> </html> DESCRIPTION: What is SmartyMenu? SmartyMenu is a dropdown menu generator class. Its design goals are to leverage the Smarty templating environment and make dropdown menu generation as easy and flexible as possible. BACKGROUND: Dropdown menus are one of the most saught after and difficult to perform tasks when it comes to web application programming. It is a tedious, time consuming task. SmartyMenu simplifies this effort by abstracting the menu generation process. You basically provide the menu items and a stylesheet, and SmartyMenu does the rest! You assign an array of menu items to your template, then SmartyMenu generates an unordered list from the menu array, then applies a stylesheet that generates the menus. Be aware that although SmartyMenu aids in the dropdown generation, it is still not for the faint of heart. SmartyMenu creates dropdowns based on pure CSS code with a small javascript footprint for browsers that don't handle CSS correctly. That doesn't mean it will work perfectly on every browser, it may take some crafty stylesheet and javascript tweaks to get things looking right, but for the most part SmartyMenu does a good job with CSS compliant browsers. SmartyMenu has been known to work with latest incarnations of Mozilla, Opera and Safari, and works fairly reliably on IE with some javascript help. (Which versions of which will be left as an exercise to the reader.) SmartyMenus are based on the SuckerFish dropdown implementation by Patrick Griffiths and Dan Webb. Please visit their website at http://www.htmldog.com/articles/suckerfish/dropdowns/ for more information. If you want to use new styles outside of the ones that ship with SmartyMenu or you want to take a stab at getting it to work on your Amiga :) then plan on getting your hands dirty in CSS code. DO NOT expect the author (me) to fix your problems, I have limited CSS experience and don't want to support every little nuance that arrives. Please post your problems and findings to the Smarty forum so everyone can help and benefit. FEATURES: All aspects of menu generation are controlled through stylesheets. Include the appropriate .css file within {menu_init} to get the menu you want, or alter one of the existing .css files to your own taste. REQUIREMENTS: SmartyMenu requires the Smarty template environment. If you want persistent menus across invocations via saveMenu() and loadMenu(), you must call session_start() in your PHP script prior to using SmartyMenu. INSTALLATION: It is assumed that you are familiar with the Smarty templating installation and setup, so I will not explain Smarty template directories and such. Please refer to the Smarty documentation for that information. To install SmartyMenu: * Copy the 'SmartyMenu.class.php' file to a place within your php_include path (or use absolute pathnames when including.) * Copy all of the plugins to your Smarty plugin directory. (located in the plugins/ directory of the distribution.) * Copy the stylesheet files to a place under your web server DOCUMENT_ROOT, such as under DOCUMENT_ROOT/css/ EXAMPLE: Please see the SYNOPSIS above for a full working example. CREATING THE MENU ARRAY ----------------------- There are a couple of ways to build the menu array that SmartyMenu will use to build a menu out of. One method is to build the array manually. For example, here is a single-level menu array with two items: $menu = array( array( 'text' => 'Yahoo', 'link' => 'http://www.yahoo.com', 'class' => 'topnav' ), array( 'text' => 'Google', 'link' => 'http://www.google.com', 'class' => 'topnav' ), ); Here is an example with a submenu: $menu = array( array( 'text' => 'Yahoo', 'link' => 'http://www.yahoo.com', 'class' => 'topnav' ), array( 'text' => 'Google', 'link' => 'http://www.google.com', 'class' => 'topnav' 'submenu' => array( array( 'text' => 'Google Groups', 'link' => 'http://groups.google.com/', 'class' => 'subnav' ), array( 'text' => 'Google News', 'link' => 'http://news.google.com/', 'class' => 'subnav' ) ) ), ) Creating the menu array manually can be time consuming and error prone. An alternate way to build the menu array is programatically with the tools available from SmartyMenu. Here is how you would build the above menu array with SmartyMenu: // we create our bottom-level submenus and work our way up. // first we create the submenu SmartyMenu::initMenu($google_menu); // create the first submenu item SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Google Groups'); SmartyMenu::setItemLink($item, 'http://groups.google.com/'); SmartyMenu::setItemClass($item, 'subnav'); // attach the item to the menu SmartyMenu::addMenuItem($google_menu, $item); // repeat process for each item SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Google News'); SmartyMenu::setItemLink($item, 'http://news.google.com/'); SmartyMenu::setItemClass($item, 'subnav'); SmartyMenu::addMenuItem($google_menu, $item); Now we create the top-level menu SmartyMenu::initMenu($menu); // create and add items SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Yahoo'); SmartyMenu::setItemLink($item, 'http://www.yahoo.com/'); SmartyMenu::setItemClass($item, 'topnav'); SmartyMenu::addMenuItem($menu, $item); SmartyMenu::initItem($item); SmartyMenu::setItemText($item, 'Google'); SmartyMenu::setItemLink($item, 'http://www.google.com/'); SmartyMenu::setItemClass($item, 'topnav'); // this one has a submenu SmartyMenu::setItemSubmenu($item, $google_menu); SmartyMenu::addMenuItem($menu, $item); // our $menu array is now ready! Once you have your menu array ready, you assign it to the template. $smarty->assign('menu', $menu); TEMPLATE FUNCTIONS ------------------ menu_init --------- examples: {menu_init} {menu_init css="/css/menu.css"} {menu_init} should be placed inside the <head></head> tags of your web page. This supplies the page with the javascript and stylesheet file link. If you do not supply a stylesheet, it is assumed that these styles are supplied elsewhere on the page, either from another stylesheet link or inline between <style></style> tags. menu ---- examples: {menu data=$menu} The {menu} tag produces the unordered list of menu elements. Place this where you want your menu on the web page. The data parameter is required, it is the array of menu items that was assigned to the template. PUBLIC METHODS: function initMenu(&$menu,) -------------------------- examples: SmartyMenu::initMenu($menu); initMenu() initializes a variable as a menu. Do this first before adding items to your menu. function initItem(&$item) ------------------------- examples: SmartyMenu::initItem($menu); initItem() initializes a variable as a menu item. Do this first before adding informtation to your item. function setItemText($item,$text) --------------------------------- examples: SmartyMenu::setItemText($item,'Yahoo'); setItemText() sets the text value of your menu item. This is the text that shows up in the menu dropdown. function setItemLink($item,$link) --------------------------------- examples: SmartyMenu::setItemLink($item,'http://www.yahoo.com'); setItemLink() sets the link (URL) value of your menu item. This is the link that the user it taken when clicking on the text. function setItemClass($item,$class) ----------------------------------- examples: SmartyMenu::setItemClass($item,'topnav'); setItemClass() applies a CSS class to the item for further presentation control from the CSS file. function setItemSubmenu($item,$submenu) --------------------------------------- examples: SmartyMenu::setItemSubmenu($item,$submenu); setItemSubmenu() adds a submenu to the item. When a user hovers the mouse over the link (or however the css is setup to behave), the submenu will appear. The $submenu variable must be a fully populated menu itself, so you must initialize a menu and add menu items to it before it can be attached as a submenu. function saveMenu($name, $menu) ------------------------------- examples: SmartyMenu::saveMenu('mymenu', $menu); saveMenu() saves the menu to the PHP session so it can be loaded on the next script invocation. This saves the overhead of building the menu every time. function loadMenu($name) ------------------------ examples: if(($menu = SmartyMenu::loadMenu('mymenu')) === false) { /* build menu */ } loadMenu() loads the menu from the PHP session. If no menu is available, this function returns false. function resetMenu($name) ------------------------ examples: SmartyMenu::resetMenu('mymenu'); resetMenu() resets the menu currently saved in the PHP session. CREDITS: Thanks to the people who have submitted bug reports, suggestions, etc. boots (from forums) Anyone I missed, let me know! COPYRIGHT: Copyright(c) 2004-2005 New Digital Group, Inc. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. OTHER PROJECTS: View Monte's other projects