# sfMenuGeneratorPlugin ## Overview Simple menu structure generator. * No javascripts * No fancy behaviors * No css * Just plain old html ## Installation symfony plugin-install http://plugins.symfony-project.com/sfN1IterationPlugin ## Quick & Dirty Configuration at 'app.yml' and 'module.yml' all: ... ... sf_menu_generator: root: text: 'Choose' items: [contacts](users,) contacts: text: 'Contacts' users: text: 'Users Menu Node' link: 'users/list' items: [newuser, modifyuser](listusers,) listusers: text: 'User List' link: 'users/list' newuser: text: 'New user' link: 'users/new' modifyuser: text: 'Modify user' link: 'users/modify' Use of the helper <?php echo mg_menuitem(array('root'),array('class'=>'menu'))?> Generated HTML <ul class="menu"> <li> <ul> <li> <ul> <li> <a href="users/list">User List</a> </li> <li> <a href="users/new">Nuew user</a> </li> <li> <a href="users/modify">Modify user</a> </li> </ul> <a href="users/list">Users Menu Node</a> </li> <li> <a href="#">Contacts</a> </li> </ul> <a href="#">Choose</a> </li> </ul> ## config explained The plugins use 'menu items' defined in app.yml or module.yml. These items are not defined hierarchically. Instead of that each menu item has an **items** sections which refers to the other menu items that are to be considered childs. Each menu item is defined as follows: itemName: text: 'text to show' link: 'link to be fed into link_to()' items: [subitem2](subitem1,) html_id: 'idItem' html_style: 'float:left;color:#FF00FF;' html_class: 'mypersonalclassname' a_id: 'idAItem' a_target: 'blank' ### params explained * **text**: this is the text meant to be inside the *li* element. Can be anything, even html tags. *Not mandatory*. * **link**: this is the link the menu item will point to. *it's not mandatory* if nothing is set, then an '#' is generated. * **items**: this is an array of the menu items (defined just like this one elsewhere in the yml file) which are supposed to be the childs of this one. * **a_***: attributes for the "a" tag. can be anything . * **html_***: attributes for the "li" tag. ### default classnames If no 'html_class' is providen, the "li" tags have the class="mg node_<nodename>". If there is an 'html_class' parameter, then the "li" tag will have that class name, plus "node_<nodename>". user: text: 'Users' html_class: 'soft' will generate .. ... <li class="soft node_user"> .... <a ..>Users</a> </li> ### parameters preference . Use of the *module.yml* The helper will read its configuration from both **app.yml** and **module.yml**. Items can be defined in both files. app.yml: user: text: 'users' items: [user2](user1,) user1: text: 'user1' module.yml: user2: text: 'user2' As you see in the previous example, you can use child items that are defined elsewhere. In case of overlapping, the module.yml definitions have precedence. app.yml: user: text: 'user from the root menu' items: [user2](user1,) .. module.yml: user: text: 'user from the module' is equivalent to: user: text: 'user from the module' items: [user2](user1,) **Overlapping the items section** Regarding the 'items' section, special rules apply when there is overlapping. The syntax is similar to the one used on stylesheets section of view.yml. * The *items* section defined for an overlapping menu item at *module.yml* file are added to the *items* section defined at the *app.yml* configuration file. * If there is a '-' prefix for one of the elements of the *items* array, then that element is removed from the childs. * The special '-*' instructs to remove all the elements that are already defined at the *items* section , at the moment the parser reads that special character. (The following elements are not affected). so, if we have these two overlapping menu items: app.yml: user: ... items: [user2, user3, user4](user1,) module1.yml: user: items: [-user2](user5,) module2.yml: user: items: [-*,user6] * In *module1.yml*, the 'user5' child will be added, and the 'user2' will be removed. * In *module2.yml* all the childs defined in *app.yml* will be removed, and the 'user6' child will be added. ## helper explained The helper is fairly simple to use: <?php use_helper('MenuGenerator')?> .... <?php echo mg_menuitem(array('node1','node2'),array('class'=>'menu','style'=>'display:inline;'))?> The first argument is an array with the menu nodenames, as they are defined and discussed in the previous section. The second argument are html attributes to pass to the main "ul" tag of the menu.