This seems to be working now:

class PageManager(object):
    def __init__(self, response):
        self.response = response
        self.response.scripts=[]
        self.response.pagescripts=[]
        self.response.stylesheets=[]
    def addscript(self,script):
        if not script in self.response.scripts:
            self.response.scripts.append(script)
    def addpagescript(self,pagescript):
        if not pagescript in self.response.pagescripts:
            self.response.pagescripts.append(pagescript)
    def addstylesheet(self,stylesheet):
        if not stylesheet in self.response.stylesheets:
            self.response.stylesheets.append(stylesheet)
    @staticmethod
    def includescripts(scripts):
        allscripts = scripts
        outscript = ''
        for script in allscripts:
            outscript += XML(script).xml()
        return outscript
    @staticmethod
    def includepagescripts(pagescripts):
        allpagescripts = pagescripts
        outscript = ''
        for file in allpagescripts:
            if file[-3:]=='.js':
                outscript += SCRIPT(_src=file, _type="text/
javascript").xml()
        return XML(outscript)
    @staticmethod
    def includestylesheets(stylesheets):
        allstylesheets = stylesheets
        outsheets = ''
        for file in allstylesheets:
            if file[-4:]=='.css':
                outsheets += LINK(_href=file,
                        _rel="stylesheet",
                        _type="text/css",
                        _charset="utf-8").xml()
        return XML(outsheets)

Just add in the appropriate sections of web2py_ajax.html(static
methods now):

{{if response.stylesheets:}}
{{=PageManager.includestylesheets(response.stylesheets)}}
{{pass}}

{{if response.pagescripts:}}
{{=PageManager.includepagescripts(response.pagescripts)}}
{{pass}}

{{if response.scripts:}}
{{=PageManager.includescripts(response.scripts)}}
{{pass}}

Then in a model:

from gluon.clientutils import PageManager
pagemanager=PageManager(response)

And in your controller you can do:

pagemanager.addscript("$('#test').slideToggle()")
pagemanager.addpagescript('/test/static/test.js')
pagemanager.addstylesheet('/test/static/test.css')




On Feb 12, 11:18 am, mdipierro <[email protected]> wrote:
> This is not an easy one.
>
> On Feb 12, 10:50 am, "mr.freeze" <[email protected]> wrote:
>
> > Maybe a static method JQuery.function(body, *args) that just wraps a
> > JQuery object with function(args){body}? There's probably a better
> > way.
> > You would also need to add logic to handle the 'this' keyword and line
> > termination I think.
>
> > On Feb 12, 9:28 am, mdipierro <[email protected]> wrote:
>
> > > Not quite. This works:
>
> > > print JQuery("a").filter(".clickclass").click('xxx').end().filter
> > > (".hideclass").click('yyy').end();
>
> > > but here is no mechanism to pass a function yet....
>
> > > Massimo
>
> > > On Feb 12, 9:14 am, "mr.freeze" <[email protected]> wrote:
>
> > > > OMG, you just ported JQuery to Python in about 20 lines of code.
> > > > Speechless...
>
> > > > Would this work for more complicated jQuery like this?:
> > > > $("a")
> > > >    .filter(".clickclass")
> > > >      .click(function(){
> > > >        alert("web2py rocks!");
> > > >      })
> > > >    .end()
> > > >    .filter(".hideclass")
> > > >      .click(function(){
> > > >        $(this).hide();
> > > >        return false;
> > > >      })
> > > >    .end();
>
> > > > On Feb 12, 12:33 am, mdipierro <[email protected]> wrote:
>
> > > > > from gluon.html import *
>
> > > > > class JQuery:
> > > > >     def __init__(self,name,attr=None,*args):
> > > > >         self.name=name
> > > > >         self.attr=attr
> > > > >         self.args=args
> > > > >     def __str__(self):
> > > > >         import gluon.contrib.simplejson as json
> > > > >         def encode(obj):
> > > > >             if isinstance(obj,JQuery): return str(obj)
> > > > >             return json.dumps(obj)
> > > > >         if not self.attr:
> > > > >             return "$('%s')" % self.name
> > > > >         args=', '.join([encode(a) for a in self.args])
> > > > >         return '%s.%s(%s)' % (self.name, self.attr, args)
> > > > >     def xml(self):
> > > > >         raise AttributeError
> > > > >     def __getattr__(self,attr):
> > > > >         def f(*args):
> > > > >             return JQuery(self,attr,*args)
> > > > >         return f
>
> > > > > ### examples
>
> > > > > >>> print JQuery('test').set(1,'',{},JQuery('#12').val()).get(45)
>
> > > > > $('test').set(1, "", {}, $('#12').val()).get(45)
>
> > > > > >>> print 
> > > > > >>> DIV(H1('clickme',_onclick=JQuery('#1').slideToggle()),P('bla 
> > > > > >>> '*10,_id=1))
>
> > > > > <div><h1 onclick="$('#1').slideToggle()">clickme</h1><p id="1">bla bla
> > > > > bla bla bla bla bla bla bla bla </p></div>
>
> > > > > On Feb 11, 11:56 pm, mdipierro <[email protected]> wrote:
>
> > > > > > Try something like this:
>
> > > > > > class JQuery:
> > > > > >    def __init__(self,name,attr=None,*args):
> > > > > >        self.name=name
> > > > > >        self.attr=attr
> > > > > >        self.args=args
> > > > > >    def __str__(self):
> > > > > >        if not self.attr:
> > > > > >            return "$('%s')" % self.name
> > > > > >        import gluon.contrib.simplejson as json
> > > > > >        args=', '.join([json.dumps(a) for a in self.args])
> > > > > >        return "%s.%s(%s)" % (self.name, self.attr, args)
> > > > > >    def __getattr__(self,attr):
> > > > > >        def f(*args):
> > > > > >            return JQuery(self,attr,*args)
> > > > > >        return f
>
> > > > > > print JQuery('test').set(1,"",{}).get(45)
>
> > > > > > On Feb 11, 11:37 pm, "mr.freeze" <[email protected]> wrote:
>
> > > > > > > All together now... (gluon/clientutils.py)...
>
> > > > > > > class PageManager(object):
> > > > > > >     def __init__(self, response):
> > > > > > >         self.response = response
> > > > > > >         self.response.scripts=[]
> > > > > > >         self.response.pagescripts=[]
> > > > > > >         self.response.stylesheets=[]
> > > > > > >     def addscript(self,script):
> > > > > > >         if not script in self.response.scripts:
> > > > > > >             self.response.scripts.append(script)
> > > > > > >     def addpagescript(self,pagescript):
> > > > > > >         if not pagescript in response.pagescripts:
> > > > > > >             response.pagescripts.append(pagescript)
> > > > > > >     def addstylesheet(self,stylesheet):
> > > > > > >         if not stylesheet in response.stylesheets:
> > > > > > >             response.stylesheets.append(stylesheet)
> > > > > > >     """
> > > > > > >     The three methods below should not be used because
> > > > > > >     they require an instance variable in
> > > > > > >     the view making it non-generic.  Here for testing.
> > > > > > >     """
> > > > > > >     def includescripts
> > > > > > >         scripts = ''
> > > > > > >         for script in self.response.scripts:
> > > > > > >             scripts += script
> > > > > > >         return scripts
> > > > > > >     def includepagescripts
> > > > > > >         pagescripts = ''
> > > > > > >         for file in self.response.pagescripts:
> > > > > > >             pagescripts += SCRIPT(_src=file).xml()
> > > > > > >         return pagescripts
> > > > > > >     def includestylesheets
> > > > > > >         stylesheets = ''
> > > > > > >         for file in self.response.stylesheets:
> > > > > > >             stylesheets += LINK(_href=file,
> > > > > > >                         _rel="stylesheet",
> > > > > > >                         _type="text/css",
> > > > > > >                         _charset="utf-8").xml()
> > > > > > >         return stylesheets
>
> > > > > > > Now if I could just mimic jQuery's sweet chaining in Python...
>
> > > > > > > On Feb 11, 3:55 pm, "mr.freeze" <[email protected]> wrote:
>
> > > > > > > > Sure.  I think it would look something like this (in gluon/
> > > > > > > > clienttools.py):
>
> > > > > > > > class PageManager(object):
> > > > > > > >     def __init__(self, response):
> > > > > > > >         if not response.scripts: response.scripts = []
> > > > > > > >     def addscript(self,script):
> > > > > > > >         response.scripts.append(script)
>
> > > > > > > > Then in web2py_ajax.html as the last thing in the 
> > > > > > > > $(document).ready
> > > > > > > > function:
>
> > > > > > > > {{if response.scripts:}}
> > > > > > > > {{for s in response.scripts:}}
> > > > > > > > {{=s}}
> > > > > > > > {{pass}}
> > > > > > > > {{pass}}
>
> > > > > > > > Then in your db.py model:
>
> > > > > > > > from gluon.clienttools import PageManager
> > > > > > > > pagemanager=PageManager(response)
>
> > > > > > > > Then in your controller:
>
> > > > > > > > def index():
> > > > > > > >     pagemanager.addscript("$('test').hide();")
> > > > > > > >     response.flash=T('Welcome to web2py')
> > > > > > > >     return dict(message=T('Hello World'))
>
> > > > > > > > Ideally, the clienttools module would be chocked full of jquery
> > > > > > > > helpers too :)
>
> > > > > > > > On Feb 11, 1:40 pm, mdipierro <[email protected]> wrote:
>
> > > > > > > > > Can you write the addscript function?
>
> > > > > > > > > On Feb 11, 1:31 pm, "mr.freeze" <[email protected]> wrote:
>
> > > > > > > > > > Good stuff.  That reminds me...I think a good addition to 
> > > > > > > > > > web2py would
> > > > > > > > > > be some kind of page/script manager (like t2's 
> > > > > > > > > > response.files on
> > > > > > > > > > steroids). Just thinking off the top of my head here but...
>
> > > > > > > > > > response.stylesheets (list rendered in the head of 
> > > > > > > > > > we2py_ajax.html)
> > > > > > > > > > response.pagescripts(list rendered in the head of 
> > > > > > > > > > we2py_ajax.html)
> > > > > > > > > > response.scripts(list rendered after the end of 
> > > > > > > > > > $(document).ready)
>
> > > > > > > > > > pagemanager.includestylesheet(path_to_static_css)
> > > > > > > > > > pagemanager.includescript(path_to_static_js)
> > > > > > > > > > pagemanager.addscript(your_script_snippet)
>
> > > > > > > > > > Each pagemanager method would check to see if the 
> > > > > > > > > > file/snippet already
> > > > > > > > > > exists in the corresponding 
> > > > > > > > > > response.[stylesheets,pagescripts,scripts]
> > > > > > > > > > before adding to prevent duplicates.
>
> > > > > > > > > > Then some jQuery helpers to abstract common 
> > > > > > > > > > selectors,manipulators and
> > > > > > > > > > effects so you could do:
>
> > > > > > > > > > pagemanager.addscript(jquery.getbyid('testid').fadein('slow'))
> > > > > > > > > > pagemanager.addscript(jquery.getbyclass('testclass').setattribute
> > > > > > > > > > ('src','/images/hat.gif'))
>
> > > > > > > > > > Can you tell I'm bent on programming everything in Python?
>
> > > > > > > > > > On Feb 11, 11:26 am, mdipierro <[email protected]> 
> > > > > > > > > > wrote:
>
> > > > > > > > > > > do not miss these:
>
> > > > > > > > > > >http://devsnippets.com/reviews/using-jquery-to-style-design-elements-...-
>
> > > > > - Show quoted text -- Hide quoted text -
>
> > > - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"web2py Web Framework" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/web2py?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to