Hi Richard, What you suggest is easy to do -- for us, but this could not
be maintained by one of my average users. I was making a solution which
would be easy for anyone to maintain, and the plugin_wiki style menu is
great for that. I am not sure what Alan's underlying requirements are (the
OP), but he possibly has a very complex requirement that cannot be
accommodated with a simple solution. However, what he suggests can be
done with a parent_id field and a bit recursion, I will post something I
made for another project.
Regards, David
On Tuesday, July 10, 2012 1:59:19 PM UTC+1, Richard wrote:
>
> In order to have some kind of conditionnal menu I do that :
>
> menu_entry1 = [T('entry1',
> False,
> '', # First level goes no where
> [
> [T('sub1_1'),
> False,
> URL(request.application,
> 'CONTROLLER',
> 'FUNCTION/TABLE'),
> []],
> [T('sub1_2'),
> False,
> URL(request.application,
> 'CONTROLLER',
> 'FUNCTION/TABLE'),
> []],
> ]]
>
> Etc.
>
> if auth.has_membership('GROUP/ROLE'):
> response.menu = [menu_index,
> menu_entry1,
> menu_entry2,
> menu_entry_etc
> ]
>
> Richard
>
> On Tue, Jul 10, 2012 at 8:15 AM, villas wrote:
>
>> I also tried implementing menus based on a DB table so that I could
>> display options which related to user permissions. However, in the end it
>> became rather complicated and I decided it wasn't worth the effort and I
>> went back to some kind of simple text representation.
>>
>> For simplicity, I really like the plugin_wiki menu idea and would
>> recommend that you also consider that method. I found it is relatively
>> easy to have a few different text menus which may be selected for each
>> different user group. When I thought about it, I only need three menus so
>> this is really easy to maintain. The menus can still be kept in the DB.
>>
>> Sorry that this doesn't directly answer your question but it may have
>> given you another idea :)
>> Regards, David
>>
>>
>>
>>
>> On Tuesday, July 10, 2012 11:22:06 AM UTC+1, Alan wrote:
>>>
>>> hi,
>>>
>>> wonder if i could have some input please on where im going wrong, spent
>>> a few hours getting my head round this, but can't seem to get it right.
>>>
>>> taking inspiration from this: http://**wizardinternetsolutions.com/**
>>> web-database-design/single-**query-dynamic-multi-level-**menu/<http://wizardinternetsolutions.com/web-database-design/single-query-dynamic-multi-level-menu/>
>>>
>>> I am trying to build up a array of elements that replicates the static
>>> method in menus.py:
>>>
>>> response.ttt = db((db.page.showinmenu==1)&(db**.page.active==1)).select(
>>> db.pa**ge.id, db.page.menutext, db.page.pageurl, db.page.parent, orderby
>>> =db.page.parent|db.page**.sort|db.page.menutext)
>>> response.tttmenu = [[],dict()]
>>> for subpage in response.ttt:
>>> response.tttmenu[0].append({su**bpage.id: [subpage.menutext, subpage
>>> .pageurl, subpage.parent]})
>>> if subpage.parent in response.tttmenu[1]:
>>> response.tttmenu[1][subpage.pa**rent].append(subpage.id)
>>> else:
>>> response.tttmenu[1][subpage.pa**rent] = [subpage.id]
>>>
>>> def buildmenu(parent, menu):
>>> html = ''
>>> if menu[1][parent]:
>>> html += '<ul>'
>>> for itemid in menu[1][parent]:
>>> if itemid in menu[1]:
>>> html += str(menu[0][itemid])
>>> #html += '<li>'+str(menu[0][itemid])
>>> #html += buildmenu(menu[0][itemid][1][**0], menu)
>>> html += '</li>'
>>> else:
>>> #html += '<li>'+str(menu[0][itemid])+'<**/li>'
>>> html += 'Badgers'
>>> html += '</ul>'
>>> return html
>>>
>>> response.tttnewmenu = buildmenu(0, response.tttmenu)
>>>
>>> so the first bit sticks the query results into a array, the page
>>> elements into array index 0 as arrays and then the list of parents into
>>> array index 1 as dictionaries for each element that has parents.
>>> tttmenu outputs:
>>>
>>> [[{1: ['Home', 'home', 0]}, {3: ['page3', 'page3', 0]}, {2: ['page2',
>>> 'page2', 1]}], {0: [1, 3], 1: [2]}]
>>>
>>> which seems right compared to the link above, but i just can't get the
>>> second bit right.
>>>
>>> that is supposed to query through the parents dictionary keys and for
>>> each array element inside the key, check if it is a parent and if so go
>>> through the function again, so that it puts order into the output to the
>>> same standard as the static response.menu example. the intention is to
>>> replace all the html in the function and turn it into an array, but wanted
>>> to walk through and get the code right.
>>> The main problem i've got is calling the page array element 0 (the page
>>> title) based on the dictionary key element that is being looped, just can't
>>> get the syntax right no matter how much i try.
>>>
>>> any help would be greatly appreciated, even if you just tell me im doing
>>> it wrong and should look at something else.
>>>
>>> was looking at doing things this way to first prevent too many database
>>> queries on menu building and also to save having an additional table in the
>>> database dedicated to the menu.
>>>
>>> all part of a cms im making and intend to release once it's any good.
>>>
>>> Thank you,
>>>
>>> Alan
>>>
>>>
>>>
>