Hi, [FYI, my problem is SOLVED -- But I still wonder about this...]
I have been using a menu with web2py since v1.8x (currently 1.98.2). I now have 3 different versions running on three different servers. PRODUCTION -- 1.98.2 -- menu is OK TEST - 1.99.3 -- menu is screwy DEV - 1.99.4 -- menu is screwy Now the problem is that when I created a menu, it didn't load properly unless I had subitems in it -- I have dividing images that load between the top level menu items, and if the top level item doesn't contain children, then the dividing images wouldn't load. Ok, so I managed to get past that by adding an "empty" menu row: empty = (T(''), False, URL(), []) Now, on web2py<=1.98.2 this is fine -- the menu class decides not to create a dropdown and all is well. However, on 1.99.{3,4} the menu is "screwy": it creates an empty dropdown with a computed height of 4px, which contains an li and anchor, but no text nodes. Now, removing the "empty" and just using an empty list gives me the image issue (so maybe that's my fault and I should relook at that and choose different css selectors). So I guess I'm wondering if anyone else had a problem with Top-Level Menu items with NO children not getting the proper class they need to style their menus appropriately? Anyone have an inkling as to what I'm doing wrong from what I've described? I'm wondering if it has anything to do with the new "mobile" code for menus? If not, then I guess this whole post is moot, and I'm doing something stupid somewhere, but if so, lemme know! Thanks! PS: here's my solution that allows you to use "None" or an empty tuple "()" inside of the list arg: In web2py/gluon/html.py, COPY (don't modify in place!!) the entire MENU class into your models file (or modules and import in models, but it really doesn't matter), and add these lines inside of the "serialize" function: if not item or len(item)<3: continue right after the "for item in data" loop, so serialize would look like so: def serialize(self, data, level=0): if level == 0: ul = UL(**self.attributes) else: ul = UL(_class=self['ul_class']) for item in data: if not item or len(item) < 3: continue (name, active, link) = item[:3] if isinstance(link,DIV): li = LI(link) elif 'no_link_url' in self.attributes and self['no_link_url']== link: li = LI(DIV(name)) elif link: li = LI(A(name, _href=link, _title=name)) else: li = LI(A(name, _title=name, _href='#', _onclick='javascript:void(0):return false')) if len(item) > 3 and item[3]: li['_class'] = self['li_class'] li.append(self.serialize(item[3], level+1)) if active or ('active_url' in self.attributes and self[ 'active_url']==link): if li['_class']: li['_class'] = li['_class']+' '+self['li_active'] else: li['_class'] = self['li_active'] ul.append(li) return ul Then in your Menu do: empty = None # or empty = () response.menu = [ (T('Whatever'), False, URL(...wherever...), [empty]), ... ]