You could accomplish the same thing without angering the MVC gods by putting your ajax code in separate controller. In your ajax controller, just don't run the menu code.
=) achipa wrote: > Just an idea, if you're about to displease the MVC gods anyway, > another trick is to make a menu controller (this can be a separate > menu app/plugin if you think this breaks MVC just a little too much, > but then you've got to take care of session/request/etc objects), and > then you do something like > > @menu > def myfunc(): > ... > ret dict(this=that) > > and in menu > > def menu(f): > ... > ret = f() > ret['menu'] = menudata > return ret > > This way the menu won't get generated all the time (as opposed to > putting it in models), which is good if you do a lot of AJAX, and is > perhaps a bit more universal/isolated from other code. I haven't > actually done this myself, so comments are welcome :) > > > On Feb 11, 3:14 am, Iceberg <iceb...@21cn.com> wrote: > >> Thanks for all the meaningful discussion here. I did learn something. >> >> When talking about generating the menu, perhaps you will like my trick >> here. >> http://groups.google.com/group/web2py/browse_thread/thread/4988b16cb2... >> >> You might already notice that, if your application have only one >> controller (the controllers/default.py), your "menu trick" can just >> appear at the beginning of default.py, so no need to sacrifice a lamb >> to the MVC god for the menu issue. :-) >> >> On Feb 10, 3:54 am, Timothy Farrell <tfarr...@swgen.com> wrote: >> >> >>> I just looked at your code. If you're going application-wide. Why not >>> just put "response.menu = _menu()" in the model file. That way you >>> won't have to call it in the controller. >>> >>> Here's an unrelated Python performance tip...try to avoid using >>> for-loops for building a list. The list.append() method is somewhat >>> expensive. Instead we use something called a list-comprehension. Your >>> code would look like this as a list-comprehension: >>> >>> def _menu(): >>> """ >>> Return the menu as a list of lists where each element >>> takes the form of [strLinkText, boolIsActiveLink, strLinkUrl] >>> """ >>> m = [[text, URL(r=request) == url, url] for text, url in MENU] >>> return m >>> >>> For small loops (such as this one), no one will notice much difference, >>> but it's good to know this for large loops or for areas that just need >>> to run really fast. Also faster code uses less energy and therefore >>> does more to save the planet from Republicans. <g> >>> >>> -tim >>> >>> Timothy Farrell wrote: >>> >>>> Welcome to Python and web2py! >>>> >>>> There are two ways of looking at this issue. >>>> >>>> 1) "Model" refers to execution model upon which the controller is run >>>> and view is rendered. In this view, it is entirely acceptable to put >>>> these application-global things in a model file. >>>> >>>> 2) "Model" refers to data model. In this view, anything other than data >>>> descriptions contained in a model file is a violation of MVC. This is >>>> the view of MVC purists. >>>> >>>> I hold view #2. However, for those of us who hold view #2, web2py >>>> offers no easy way to have application-wide settings without violating >>>> our MVC convictions. I have reconciled my convictions by creating a >>>> separate "model" file called "settings.py" placed all my execution model >>>> stuff in that. Thereby sort of maintaining my view of MVC separation >>>> and still having easy access to application-wide settings. >>>> >>>> I sacrifice a white lamb to the MVC god every month until there is a >>>> better solution. >>>> >>>> =) >>>> >>>> -tim >>>> >>>> hcvst wrote: >>>> >>>>> Hi, >>>>> >>>>> thanks for the new release and all the effort you put in. Even if I am >>>>> new to web2py and not a seasoned Python programmer yet, the release >>>>> notes sound very promising and I look forward to experimenting >>>>> further. >>>>> >>>>> My question: >>>>> >>>>> Model files seem such a convenient location to place functionality >>>>> that is common across controllers, though I suspect that it is bad >>>>> style to do so. >>>>> >>>>> For example to create a model file called helper.py with the following >>>>> contents: >>>>> >>>>> --------------------------------------------------------------------------- >>>>> ------------- >>>>> ## Global Configuration >>>>> # Primary navigation menu >>>>> MENU = [["Home", URL(r=request, c="default", f="index")], >>>>> ["Forum", URL(r=request, c="forum", f="index")], >>>>> ["Test", "http://test"]] >>>>> >>>>> ## Helper functions >>>>> def _menu(): >>>>> """ >>>>> Return the menu as a list of lists where each element >>>>> takes the form of [strLinkText, boolIsActiveLink, strLinkUrl] >>>>> """ >>>>> m = [] >>>>> for text, url in MENU: >>>>> m.append([text, URL(r=request) == url, url]); >>>>> return m >>>>> --------------------------------------------------------------------------- >>>>> ------------- >>>>> >>>>> This enables me to call from every controller function: >>>>> >>>>> response.menu = _menu() >>>>> >>>>> Just the fact that response is in global scope here is very >>>>> convenient. However I do not want to violate the MCV pattern, unless >>>>> it is acceptable here. Moving this logic into a separate module is >>>>> akward, as one has to move varibles back and forth and needs to >>>>> restart web2py every so often for changes to the module to take >>>>> effect. >>>>> >>>>> What is best practice, when it comes to sharing code across >>>>> controllers please? >>>>> >>>>> Best regards, >>>>> HC >>>>> >>> -- >>> Timothy Farrell <tfarr...@swgen.com> >>> Computer Guy >>> Statewide General Insurance Agency (www.swgen.com) >>> > > > -- Timothy Farrell <tfarr...@swgen.com> Computer Guy Statewide General Insurance Agency (www.swgen.com) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "web2py Web Framework" group. To post to this group, send email to web2py@googlegroups.com To unsubscribe from this group, send email to web2py+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/web2py?hl=en -~----------~----~----~----~------~----~------~--~---