db.define_table('store_catelog')
db.define_table('store_catelog',
Field('title', 'string'),
Field('description', 'text'),
Field('parent_catelog', 'reference store_catelog', default=None),
format='%(title)s',
redefine=True)
response.menu = []
categories = db(db.store_catelog.parent == None).select(orderby=db.store_catelog.id)
for category in categories:
response.menu+=[ (T(category.title), True if active_page == str(category.title.lower()) else False, URL('default','page/%s' % (category.title.lower())), [
(T(i.title), True if active_page == str(i.id) else False, URL('default','page/%s' % (i.id)), []) for i in db((db.stored_category.parent == category.id)).select(db.store_category.ALL) if i.parent == category.id
]) ]
First of all notice that if you use web2py2.8.2 you can do this:db.define_table('store_catalog',Field('title'),Field('slug',requires=IS_SLUG(),compute=lambda row: IS_SLUG.urlify(row.title)),Field('parent_id','reference store_catalog'))def menu_rec(items): return [(x.title,None,URL('action',args=x.slug),menu_rec(x.children)) for x in items or []]
response.menu = menu_rec(db(db.store_catalog).select().as_tree())
And you get a recursive menu with arbitrary depth and a web interface to edit it with slugs.
On Tuesday, 21 January 2014 00:11:59 UTC-6, James Burke wrote:
Set it to false.
First of all notice that if you use web2py2.8.2 you can do this:db.define_table('store_catalog',Field('title'),Field('slug',requires=IS_SLUG(),compute=lambda row: IS_SLUG.urlify(row.title)),Field('parent_id','reference store_catalog'))def menu_rec(items): return [(x.title,None,URL('action',args=x.slug),menu_rec(x.children)) for x in items or []]response.menu = menu_rec(db(db.store_catalog).select().as_tree())And you get a recursive menu with arbitrary depth and a web interface to edit it with slugs.
On Tuesday, 21 January 2014 00:11:59 UTC-6, James Burke wrote:
First of all notice that if you use web2py2.8.2 you can do this:db.define_table('store_catalog',Field('title'),Field('slug',requires=IS_SLUG(),compute=lambda row: IS_SLUG.urlify(row.title)),Field('parent_id','reference store_catalog'))def menu_rec(items): return [(x.title,None,URL('action',args=x.slug),menu_rec(x.children)) for x in items or []]response.menu = menu_rec(db(db.store_catalog).select().as_tree())And you get a recursive menu with arbitrary depth and a web interface to edit it with slugs.
On Tuesday, 21 January 2014 00:11:59 UTC-6, James Burke wrote:
db.define_table('store_catalog',Field('title'),Field('slug',requires=IS_SLUG(),compute=lambda row: IS_SLUG.urlify(row.titl\e)),Field('parent_id','reference store_catalog'))id1 = db.store_catalog.insert(title='main')id2 = db.store_catalog.insert(title='one',parent_id=id1)id3 = db.store_catalog.insert(title='two',parent_id=id2)def menu_rec(items): return [(x.title,None,URL('action',args=x.slug),menu_rec(x\.children)) for x in items or []]response.menu = menu_rec(db(db.store_catalog).select().as_trees())print response.menu
Paraphrase the question, can anyone explain how to create
a drop-down menu from a database table or show a working example?
But this example makes the menu items in one line with one drop-down menu item.
Like this:
Menuitem Menuitem
- submenuitem - submenuitem
I have three fields, they must be somthing like this (anothermenu - just for example - to understand that is top menu):
<topmenuitem> <anothermenu> <anothermenu> <Log In>
Menuitem
- submenuitem
- subsubmenuitem
- submenuitem
- submenuitem
Menuitem
-submenuitem
-submenuitem
- subsubmenuitem
- subsubmenuitem
- subsubmenuitem
-submenuitem
-submenuitem
Please, can you tell me how to do this?
Hi, Dave S, maybe you right! But How to create in submenuitem - submenuitem?
I'm using bootstrap css/js form wellcom app, about stupid.css - now reading, but it's a little different,
I need to build a menu from the database table (three fields), as in the example above.
if auth.is_logged_in():
rows = db(db.map).select(db.map.menu1, db.map.menu2, db.map.mnm_name, orderby=db.map.num, distinct=True)
from collections import defaultdict
d = defaultdict(list)
for row in rows:
d[row.menu1].append(row.menu2)
response.menu = [('Shema', True, URL('default'),[[key, False, None, [[sub, False, None, [[sub, False, 'link']]] for sub in sorted(d[key])]] for key in sorted(d)])]in layout.html add style and js:{{=MENU(response.menu, _class='nav navbar-nav web2py-menu web2py-menu-horizontal',
li_class='dropdown', ul_class='dropdown-menu')}}<style>
.dropdown-submenu{position:relative;}
.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
.dropdown-submenu:hover>.dropdown-menu{display:block;}
.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
.dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
</style>
<script src="{{=URL('static','js/bootstrap-submenu.min.js')}}"></script>
How to add db.map.mnm_name to row.menu2, somthing like that -
d[row.menu1].append(row.menu2).append(db.map.mnm_name) (i know - that's is not working)?????
Have some idea about this?
Me personally, no, but I understand BS3 limits the number of menu levels./dps
In Wiki menus:
- Home > @////index
- Info > @////info
- web2py > http://www.web2py.com
- - About us > @////aboutus
- - - Contact us > @////contactus -
If I add a third minus - THIS NOT WORKED!
db = DAL('sqlite://storage.sqlite')
db.define_table('map',Field('menu1'),Field('menu2'),Field('mnm_name'),Field('link'))
import collections
def build_menu():
m1, m2 = [], [] # to preserve orders
m = collections.defaultdict(lambda: collections.defaultdict(list))
for row in db(db.map).select(orderby=db.map.menu1|db.map.menu2):
if not row.menu1 in m1: m1.append(row.menu1)
if not row.menu2 in m2: m2.append(row.menu2)
m[row.menu1][row.menu2].append((row.mnm_name, row.link))
menu = []
for a in m1:
submenu = []
menu.append([a, None, None, submenu])
for b, items in m[a].items():
subsubmenu = [[key, None, link] for key, link in items]
submenu.append([b, None, None, subsubmenu])
return menu
response.menu = cache.ram('menu', lambda:build_menu(), None) # to cache it!
Hi Massimo! Thanks so much! It Works! But it generate menu in inline, like this:
menu1 menu1 menu1
In menu1-menu2 in menu2-mnm_name (thats all right) But how menu1 insert in
response.menu =[
('Main', False, URL('default', 'index'), [here]]