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
>>>
>>>
>>>
>

Reply via email to