Re: [Lift] Re: WebSockets are Coming
I could start an experimental branch for all this. Yeah, go for it, man, go for it! Heiko My job: weiglewilczek.com My blog: heikoseeberger.name Follow me: twitter.com/hseeberger OSGi on Scala: scalamodules.org Lift, the simply functional web framework: liftweb.net -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Beginner Ajax question - redrawing a page fragment
Hello, I'm just starting with Lift, and there's one thing I can't figure out. I want to modify the ToDo example from the tutorial so that the Add button makes an ajax call, adds the element to a list and displays the modified result. The problem is that I don't know how to redraw the list after the button has been pressed. More generally: how to redraw a page fragment with ajax? I could do that with SetHtml if I had the NodeSeq corresponding to the list, but the button is in an unrelated page fragment so it doesn't have it. What's the Lift way to solve such problems? The page roughly is: lift:TD.add form=post !-- fields an submit button bound here -- /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:TD.list all_id=all_todos ... /lift:TD.list I was looking through the list archive but didn't find anything. Sorry if it's a repeated question :) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Beginner Ajax question - redrawing a page fragment
With SetHtml you just provide the parent element ID and the NodeSeq you want to render as a child of that parent. You're saying you don;t have the NodeSeq Corresponding to the List but I assume you do have the list right? So assume this Ajax function: def myCallback(): JsCmd = { val myList = ... val html: NodeSeq = myList.flatMap(e = td{e toString}/td) SetHtml(all_todos, html) } and then in your markup you can just have: div id=all_todos/div If you were referring to something else, please provide more details. Br's, Marius On Dec 23, 10:32 am, Adam Warski a...@warski.org wrote: Hello, I'm just starting with Lift, and there's one thing I can't figure out. I want to modify the ToDo example from the tutorial so that the Add button makes an ajax call, adds the element to a list and displays the modified result. The problem is that I don't know how to redraw the list after the button has been pressed. More generally: how to redraw a page fragment with ajax? I could do that with SetHtml if I had the NodeSeq corresponding to the list, but the button is in an unrelated page fragment so it doesn't have it. What's the Lift way to solve such problems? The page roughly is: lift:TD.add form=post !-- fields an submit button bound here -- /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:TD.list all_id=all_todos ... /lift:TD.list I was looking through the list archive but didn't find anything. Sorry if it's a repeated question :) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Call lift function from html
Hallo I won't mix scala code with html code. So first I have a binding bind(hotel, template,starRating - {getStars (elem.hotelInfo.stars)}) and function def getStars(stars : String) : NodeSeq = { if(stars.length 0) { var style = width: + (stars.toInt * 10) + px; div class=fespHotelStarContainer style={style} div class=fespHotelStars/div /div } else {div/} } in html code then I have only hotel:starRating/ and works fine, but it is possible to call from html function from lift ? Something like tihs: div class=fespHotelStarContainer style=*** div class=fespHotelStars/ /div and in * like getStars(hotel:stars/) def getStars(stars: String) : String = { width: + (stars.toInt * 10) + px; } -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: SHtml.link should work like Shtml.submit
It works fine. Thanks a lot. On 11 Dez., 10:50, Marius marius.dan...@gmail.com wrote: well if you want to use the approach below you can simply have in your html: form id=ajaxy lift:SearchForm // put your fields here /lift:SearchForm /form In this approach we don't tell lift to generate a form but we wrap the snippet into a form. Nonetheless this should also work: lift:SearchForm.send form=POST id=myFormId/ Then put your link anywhere in your page. Br's, Marius On Dec 11, 11:01 am, dominikgr domini...@gmail.com wrote: Sorry for the repetition of posts. And thanks for answer. The last question how can I set form name, or form id when i use form created in such way: lift:SearchForm.send form=POST / and binding start with bind(form, ns, -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Call lift function from html
No but you can use snippets as attributes (something like): div class=fespHotelStarContainer lift:snippet=MySnippet.myStyle /div Br's, Marius On Dec 23, 12:10 pm, dominikgr domini...@gmail.com wrote: Hallo I won't mix scala code with html code. So first I have a binding bind(hotel, template,starRating - {getStars (elem.hotelInfo.stars)}) and function def getStars(stars : String) : NodeSeq = { if(stars.length 0) { var style = width: + (stars.toInt * 10) + px; div class=fespHotelStarContainer style={style} div class=fespHotelStars/div /div } else {div/} } in html code then I have only hotel:starRating/ and works fine, but it is possible to call from html function from lift ? Something like tihs: div class=fespHotelStarContainer style=*** div class=fespHotelStars/ /div and in * like getStars(hotel:stars/) def getStars(stars: String) : String = { width: + (stars.toInt * 10) + px; } -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: Beginner Ajax question - redrawing a page fragment
Hello, With SetHtml you just provide the parent element ID and the NodeSeq you want to render as a child of that parent. You're saying you don;t have the NodeSeq Corresponding to the List but I assume you do have the list right? So assume this Ajax function: def myCallback(): JsCmd = { val myList = ... val html: NodeSeq = myList.flatMap(e = td{e toString}/td) SetHtml(all_todos, html) } But then I'm embedding view logic into the code - I wouldn't really want to do that. Especially once the list becomes anything more fancy then a simple table, I think putting the list-displaying into an html file better. I tried doing something else, expanding your idea. I've put the list-displaying html markup into a template (todo_list.html), so now I can reuse it to both display the list and pass it to the snippet which handles and binds the form: Now my form looks like this: lift:TD.add form=post addForm:form !-- fields and submit button bound here -- /addForm:form addForm:list lift:embed what=todo_list / /addForm:list /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:embed what=todo_list / In TD.add I have then: ... def drawList() = list(chooseTemplate(addForm, list, form)) def reDraw() = SetHtml(all_todos, drawList()) bind(todo, chooseTemplate(addForm, form, form), priority - todo.priority.toForm, desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) ... Is this the right way to go? And is it the lift way? Anyway I can't test it yet because I can't get my form to be submitted with ajax. Both surrounding the bind with SHtml.ajaxForm(...) and replacing submit with ajaxButton causes the form to stop working (the values in the model aren't updated). Adam Br's, Marius On Dec 23, 10:32 am, Adam Warski a...@warski.org wrote: Hello, I'm just starting with Lift, and there's one thing I can't figure out. I want to modify the ToDo example from the tutorial so that the Add button makes an ajax call, adds the element to a list and displays the modified result. The problem is that I don't know how to redraw the list after the button has been pressed. More generally: how to redraw a page fragment with ajax? I could do that with SetHtml if I had the NodeSeq corresponding to the list, but the button is in an unrelated page fragment so it doesn't have it. What's the Lift way to solve such problems? The page roughly is: lift:TD.add form=post !-- fields an submit button bound here -- /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:TD.list all_id=all_todos ... /lift:TD.list I was looking through the list archive but didn't find anything. Sorry if it's a repeated question :) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: The future of lift-core
Tips : in your project call : mvn dependency:analyze you should see the list of dependencies useless and used throught transitive path and to list directly in your pom.xml (may be in place of lift-core). /davidB On Wed, Dec 23, 2009 at 02:31, Peter Robinett pe...@bubblefoundry.comwrote: Indrajit, your post made me realize that I've been using lift-core without realizing it. Thanks. Unfortunately switching to something simpler is giving me some trouble. I believe that I should be able to add lift-base, but while its sub-modules get downloaded (lift-common, lift-util, etc), Maven says that the lift-base module is missing and needs to be installed. This is the entry I'm using: dependency groupIdnet.liftweb/groupId artifactIdlift-base/artifactId version1.1-SNAPSHOT/version /dependency As the resident Maven expert, do you have any idea what's wrong? My entire pom.xml is here: http://gist.github.com/262244 Thanks, Peter On Dec 22, 8:32 am, Indrajit Raychaudhuri indraj...@gmail.com wrote: On 22/12/09 12:23 AM, David Pollak wrote: On Sun, Dec 20, 2009 at 11:39 AM, Indrajit Raychaudhuri indraj...@gmail.com mailto:indraj...@gmail.com wrote: Folks, lift-core is a 'meta' project that can be added as a dependency to a Lift project to pull in all the Lift modules. This serves as a singular configuration point in a Lift based application. However, since lift-core downloads all the Lift modules (irrespective of whether the project needs it), adding this as the dependency slow down things for a standard project that doesn't need some additional modules. In a sense, we have moved quite a bit from the initial purpose of having single dependency on this 'meta' project in a Lift application. Further, the name is a misnomer now! The question, therefore is: Should we consider deprecating this? If not, we need to document when it should be preferred and when not. If yes, what should be the time frame for making the move? With Lift 2.0 coming up, Lift 2.0 is not coming up it's merely a rename of Lift 1.1 based on the naming rules that Heiko proposed and the Lift community adopted. The fact that the next release of Lift is going to be called 2.0 rather than 1.1 does not change the scope of the release. Indeed, poor wordings, Lift 2.0 *restructure* coming up is what I meant. But yes, it ends up sounding different, sorry. With that being said, deprecating lift-core is fine by me as long as there is an easy to understand deprecation message with clear instructions as to how to replace lift-core with whatever is necessary. For deprecating dependencies, it's just matter of persuasion (Announcement, wiki etc.) for at least two releases, or more (could be milestone releases). And eventually, dropping it from the build beyond an agreeable release time frame. I couldn't figure out a clean way of deprecating 'meta' packages since it doesn't have any active code (thus doesn't expose any place to code in some deprecation warning message). As such, the package is harmless and there is zero cost of maintenance. Just that, it's no more a good practice (longer build time, larger war size etc.). now might be a good time to make a decision. Thoughts? Cheers, Indrajit NB: An open question to anybody in the Lift: Who among you are actually using lift-core in you project and what is the level of impact you foresee in case you have to move on to have an alternative approach. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to liftweb@googlegroups.com mailto:liftweb@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com mailto:liftweb%2bunsubscr...@googlegroups.comliftweb%252bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- Lift, the simply functional web frameworkhttp://liftweb.net Beginning Scalahttp://www.apress.com/book/view/1430219890 Follow me:http://twitter.com/dpp Surf the harmonics -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe
[Lift] Re: Beginner Ajax question - redrawing a page fragment
On Dec 23, 1:51 pm, Adam Warski a...@warski.org wrote: Hello, With SetHtml you just provide the parent element ID and the NodeSeq you want to render as a child of that parent. You're saying you don;t have the NodeSeq Corresponding to the List but I assume you do have the list right? So assume this Ajax function: def myCallback(): JsCmd = { val myList = ... val html: NodeSeq = myList.flatMap(e = td{e toString}/td) SetHtml(all_todos, html) } But then I'm embedding view logic into the code - I wouldn't really want to do that. Especially once the list becomes anything more fancy then a simple table, I think putting the list-displaying into an html file better. Think of Snippets as extensions to the markup responsible for generating dynamic markup. Hence markup in snippets is very natural. Of course one should not abuse this and generate tons of markup from scala code. But what I typically do is to use markup template and then bind. ul id =all_todos lift:TD.list lipref:item/li /lift:TD.list /u Then on server side in your TD snippet you can cache the snippet content Xhtml, in this case being: lilift:item/li ... you can put this in a RequestVar. Then from you Ajax function can get this markup template and use bind on it such as: object MyMarkupVar extends RequestVar[NodeSeq](NodeSeq.empty) class TD { def myAjaxCallback(): JsCmd = { val myList = ... val markUp = MyMarkupVar.get val html: NodeSeq = myList.flatMap(e = bind(pref, markup item - e.toString /*or whatever have you*/ )) SetHtml(all_todos, html) } def list(xhtml: NodeSeq): NodeSeq = { MyMarkupVar.set(xhtml) NodeSeq.Empty } } therefore you don't need to know from Scala code how your template looks like. I tried doing something else, expanding your idea. I've put the list-displaying html markup into a template (todo_list.html), so now I can reuse it to both display the list and pass it to the snippet which handles and binds the form: Now my form looks like this: lift:TD.add form=post addForm:form !-- fields and submit button bound here -- /addForm:form addForm:list lift:embed what=todo_list / /addForm:list /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:embed what=todo_list / In TD.add I have then: ... def drawList() = list(chooseTemplate(addForm, list, form)) def reDraw() = SetHtml(all_todos, drawList()) bind(todo, chooseTemplate(addForm, form, form), priority - todo.priority.toForm, desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) ... Is this the right way to go? And is it the lift way? Anyway I can't test it yet because I can't get my form to be submitted with ajax. Both surrounding the bind with SHtml.ajaxForm(...) and replacing submit with ajaxButton causes the form to stop working (the values in the model aren't updated). Adam Br's, Marius On Dec 23, 10:32 am, Adam Warski a...@warski.org wrote: Hello, I'm just starting with Lift, and there's one thing I can't figure out. I want to modify the ToDo example from the tutorial so that the Add button makes an ajax call, adds the element to a list and displays the modified result. The problem is that I don't know how to redraw the list after the button has been pressed. More generally: how to redraw a page fragment with ajax? I could do that with SetHtml if I had the NodeSeq corresponding to the list, but the button is in an unrelated page fragment so it doesn't have it. What's the Lift way to solve such problems? The page roughly is: lift:TD.add form=post !-- fields an submit button bound here -- /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:TD.list all_id=all_todos ... /lift:TD.list I was looking through the list archive but didn't find anything. Sorry if it's a repeated question :) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Beginner Ajax question - redrawing a page fragment
Oh an I hope you're using Lift 1.1 cause RequestVar's scope for Ajax functions is preserved after rendering the page. If not you can just use a SessioVar instead. On Dec 23, 4:06 pm, Marius marius.dan...@gmail.com wrote: On Dec 23, 1:51 pm, Adam Warski a...@warski.org wrote: Hello, With SetHtml you just provide the parent element ID and the NodeSeq you want to render as a child of that parent. You're saying you don;t have the NodeSeq Corresponding to the List but I assume you do have the list right? So assume this Ajax function: def myCallback(): JsCmd = { val myList = ... val html: NodeSeq = myList.flatMap(e = td{e toString}/td) SetHtml(all_todos, html) } But then I'm embedding view logic into the code - I wouldn't really want to do that. Especially once the list becomes anything more fancy then a simple table, I think putting the list-displaying into an html file better. Think of Snippets as extensions to the markup responsible for generating dynamic markup. Hence markup in snippets is very natural. Of course one should not abuse this and generate tons of markup from scala code. But what I typically do is to use markup template and then bind. ul id =all_todos lift:TD.list lipref:item/li /lift:TD.list /u Then on server side in your TD snippet you can cache the snippet content Xhtml, in this case being: lilift:item/li ... you can put this in a RequestVar. Then from you Ajax function can get this markup template and use bind on it such as: object MyMarkupVar extends RequestVar[NodeSeq](NodeSeq.empty) class TD { def myAjaxCallback(): JsCmd = { val myList = ... val markUp = MyMarkupVar.get val html: NodeSeq = myList.flatMap(e = bind(pref, markup item - e.toString /*or whatever have you*/ )) SetHtml(all_todos, html) } def list(xhtml: NodeSeq): NodeSeq = { MyMarkupVar.set(xhtml) NodeSeq.Empty } } therefore you don't need to know from Scala code how your template looks like. I tried doing something else, expanding your idea. I've put the list-displaying html markup into a template (todo_list.html), so now I can reuse it to both display the list and pass it to the snippet which handles and binds the form: Now my form looks like this: lift:TD.add form=post addForm:form !-- fields and submit button bound here -- /addForm:form addForm:list lift:embed what=todo_list / /addForm:list /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:embed what=todo_list / In TD.add I have then: ... def drawList() = list(chooseTemplate(addForm, list, form)) def reDraw() = SetHtml(all_todos, drawList()) bind(todo, chooseTemplate(addForm, form, form), priority - todo.priority.toForm, desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) ... Is this the right way to go? And is it the lift way? Anyway I can't test it yet because I can't get my form to be submitted with ajax. Both surrounding the bind with SHtml.ajaxForm(...) and replacing submit with ajaxButton causes the form to stop working (the values in the model aren't updated). Adam Br's, Marius On Dec 23, 10:32 am, Adam Warski a...@warski.org wrote: Hello, I'm just starting with Lift, and there's one thing I can't figure out. I want to modify the ToDo example from the tutorial so that the Add button makes an ajax call, adds the element to a list and displays the modified result. The problem is that I don't know how to redraw the list after the button has been pressed. More generally: how to redraw a page fragment with ajax? I could do that with SetHtml if I had the NodeSeq corresponding to the list, but the button is in an unrelated page fragment so it doesn't have it. What's the Lift way to solve such problems? The page roughly is: lift:TD.add form=post !-- fields an submit button bound here -- /lift:TD.add !-- some other code -- !-- the list that I want to redraw -- lift:TD.list all_id=all_todos ... /lift:TD.list I was looking through the list archive but didn't find anything. Sorry if it's a repeated question :) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: Beginner Ajax question - redrawing a page fragment
Hello, object MyMarkupVar extends RequestVar[NodeSeq](NodeSeq.empty) ah, that's much better then my solution. Thanks! :) Maybe you could also write, how to submit a whole form using AJAX? :) So far my attempts are futile. I get an ajax request, but the value of the field isn't bound to the model. Code of my snippet, without ajax (works): bind(todo, chooseTemplate(addForm, form, form), desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) With ajax (doesn't work): ajaxForm( bind(todo, chooseTemplate(addForm, form, form), desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) Or: bind(todo, chooseTemplate(addForm, form, form), desc - todo.desc.toForm, submit - ajaxButton(New, () = {checkAndSave; reDraw()})) ) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Beginner Ajax question - redrawing a page fragment
This thread http://groups.google.com/group/liftweb/browse_thread/thread/9d333465ca18eb15/47cac2543737dcb9?lnk=gstq=ajax+form#47cac2543737dcb9 I believe discusses the same problem you're seeing. Use a hidden field that binds checkAndSave function. There is an alternative approach that I described in the thread I paste. Br's, Marius On Dec 23, 4:50 pm, Adam Warski a...@warski.org wrote: Hello, object MyMarkupVar extends RequestVar[NodeSeq](NodeSeq.empty) ah, that's much better then my solution. Thanks! :) Maybe you could also write, how to submit a whole form using AJAX? :) So far my attempts are futile. I get an ajax request, but the value of the field isn't bound to the model. Code of my snippet, without ajax (works): bind(todo, chooseTemplate(addForm, form, form), desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) With ajax (doesn't work): ajaxForm( bind(todo, chooseTemplate(addForm, form, form), desc - todo.desc.toForm, submit - submit(New, checkAndSave)) ) Or: bind(todo, chooseTemplate(addForm, form, form), desc - todo.desc.toForm, submit - ajaxButton(New, () = {checkAndSave; reDraw()})) ) -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Reserved words in templates/snippets?
I couldn't figure out why my snippet was not being called, then renamed my class (it was named Msg) and it started working. Is Lift possibly resolving lift:msg.blabla to another class called Msg? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Reserved words in templates/snippets?
There is a built in snippet called Msg (it's in net.liftweb.builtin.snippet). It is wired into LiftRules.snippetDispatch by default, which I believe will run before automatic snippet resolution via class name. If you want to use a snippet called Msg, I think you might have to wire it into snippetDispatch yourself. -Ross On Dec 23, 2009, at 11:38 AM, Erkki Lindpere wrote: I couldn't figure out why my snippet was not being called, then renamed my class (it was named Msg) and it started working. Is Lift possibly resolving lift:msg.blabla to another class called Msg? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Reserved words in templates/snippets?
Yes lift:Msg is a builtin snippet. We should describe this here: http://wiki.github.com/dpp/liftweb/about-lift-tags Br's, Marius On Dec 23, 6:38 pm, Erkki Lindpere vill...@gmail.com wrote: I couldn't figure out why my snippet was not being called, then renamed my class (it was named Msg) and it started working. Is Lift possibly resolving lift:msg.blabla to another class called Msg? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: The future of lift-core
Hey Peter, lift-base is just a parent model for lift-common, lift-actor, lift-util and lift-webkit. It's not a real dependency that can be used in a project. Since you are using lift-mapper, just using lift-mapper as dependency should suffice. Rest of the dependencies would be pulled down automatically. I just updated your gist. See if this works. http://gist.github.com/262613 As davidB mentioned you can also run mvn dependency:analyze to filter out unnecessary dependencies. Generally speaking: 1. If you are using any of the persistence modules (lift-mapper, lift-jpa, lift-record) you do not need any of the base modules. They would be pulled transitively. 2. If you are not using the persistence module (possibly because your app doesn't need such support). Just including lift-webkit should suffice. 3. Additionally, if you are using any of the special purpose modules (from lift-modules), just add that to the lift of dependencies. Cheers, Indrajit On 23/12/09 7:12 PM, David Bernard wrote: Tips : in your project call : mvn dependency:analyze you should see the list of dependencies useless and used throught transitive path and to list directly in your pom.xml (may be in place of lift-core). /davidB On Wed, Dec 23, 2009 at 02:31, Peter Robinett pe...@bubblefoundry.com mailto:pe...@bubblefoundry.com wrote: Indrajit, your post made me realize that I've been using lift-core without realizing it. Thanks. Unfortunately switching to something simpler is giving me some trouble. I believe that I should be able to add lift-base, but while its sub-modules get downloaded (lift-common, lift-util, etc), Maven says that the lift-base module is missing and needs to be installed. This is the entry I'm using: dependency groupIdnet.liftweb/groupId artifactIdlift-base/artifactId version1.1-SNAPSHOT/version /dependency As the resident Maven expert, do you have any idea what's wrong? My entire pom.xml is here: http://gist.github.com/262244 Thanks, Peter On Dec 22, 8:32 am, Indrajit Raychaudhuri indraj...@gmail.com mailto:indraj...@gmail.com wrote: On 22/12/09 12:23 AM, David Pollak wrote: On Sun, Dec 20, 2009 at 11:39 AM, Indrajit Raychaudhuri indraj...@gmail.com mailto:indraj...@gmail.com mailto:indraj...@gmail.com mailto:indraj...@gmail.com wrote: Folks, lift-core is a 'meta' project that can be added as a dependency to a Lift project to pull in all the Lift modules. This serves as a singular configuration point in a Lift based application. However, since lift-core downloads all the Lift modules (irrespective of whether the project needs it), adding this as the dependency slow down things for a standard project that doesn't need some additional modules. In a sense, we have moved quite a bit from the initial purpose of having single dependency on this 'meta' project in a Lift application. Further, the name is a misnomer now! The question, therefore is: Should we consider deprecating this? If not, we need to document when it should be preferred and when not. If yes, what should be the time frame for making the move? With Lift 2.0 coming up, Lift 2.0 is not coming up it's merely a rename of Lift 1.1 based on the naming rules that Heiko proposed and the Lift community adopted. The fact that the next release of Lift is going to be called 2.0 rather than 1.1 does not change the scope of the release. Indeed, poor wordings, Lift 2.0 *restructure* coming up is what I meant. But yes, it ends up sounding different, sorry. With that being said, deprecating lift-core is fine by me as long as there is an easy to understand deprecation message with clear instructions as to how to replace lift-core with whatever is necessary. For deprecating dependencies, it's just matter of persuasion (Announcement, wiki etc.) for at least two releases, or more (could be milestone releases). And eventually, dropping it from the build beyond an agreeable release time frame. I couldn't figure out a clean way of deprecating 'meta' packages since it doesn't have any active code (thus doesn't expose any place to code in some deprecation warning message). As such, the package is harmless and there is zero cost of maintenance. Just that, it's no more a good practice (longer build time, larger war size etc.).
[Lift] Re: The future of lift-core
Thanks guys, that helps a lot. Peter On Dec 23, 9:05 am, Indrajit Raychaudhuri indraj...@gmail.com wrote: Hey Peter, lift-base is just a parent model for lift-common, lift-actor, lift-util and lift-webkit. It's not a real dependency that can be used in a project. Since you are using lift-mapper, just using lift-mapper as dependency should suffice. Rest of the dependencies would be pulled down automatically. I just updated your gist. See if this works.http://gist.github.com/262613 As davidB mentioned you can also run mvn dependency:analyze to filter out unnecessary dependencies. Generally speaking: 1. If you are using any of the persistence modules (lift-mapper, lift-jpa, lift-record) you do not need any of the base modules. They would be pulled transitively. 2. If you are not using the persistence module (possibly because your app doesn't need such support). Just including lift-webkit should suffice. 3. Additionally, if you are using any of the special purpose modules (from lift-modules), just add that to the lift of dependencies. Cheers, Indrajit On 23/12/09 7:12 PM, David Bernard wrote: Tips : in your project call : mvn dependency:analyze you should see the list of dependencies useless and used throught transitive path and to list directly in your pom.xml (may be in place of lift-core). /davidB On Wed, Dec 23, 2009 at 02:31, Peter Robinett pe...@bubblefoundry.com mailto:pe...@bubblefoundry.com wrote: Indrajit, your post made me realize that I've been using lift-core without realizing it. Thanks. Unfortunately switching to something simpler is giving me some trouble. I believe that I should be able to add lift-base, but while its sub-modules get downloaded (lift-common, lift-util, etc), Maven says that the lift-base module is missing and needs to be installed. This is the entry I'm using: dependency groupIdnet.liftweb/groupId artifactIdlift-base/artifactId version1.1-SNAPSHOT/version /dependency As the resident Maven expert, do you have any idea what's wrong? My entire pom.xml is here:http://gist.github.com/262244 Thanks, Peter On Dec 22, 8:32 am, Indrajit Raychaudhuri indraj...@gmail.com mailto:indraj...@gmail.com wrote: On 22/12/09 12:23 AM, David Pollak wrote: On Sun, Dec 20, 2009 at 11:39 AM, Indrajit Raychaudhuri indraj...@gmail.com mailto:indraj...@gmail.com mailto:indraj...@gmail.com mailto:indraj...@gmail.com wrote: Folks, lift-core is a 'meta' project that can be added as a dependency to a Lift project to pull in all the Lift modules. This serves as a singular configuration point in a Lift based application. However, since lift-core downloads all the Lift modules (irrespective of whether the project needs it), adding this as the dependency slow down things for a standard project that doesn't need some additional modules. In a sense, we have moved quite a bit from the initial purpose of having single dependency on this 'meta' project in a Lift application. Further, the name is a misnomer now! The question, therefore is: Should we consider deprecating this? If not, we need to document when it should be preferred and when not. If yes, what should be the time frame for making the move? With Lift 2.0 coming up, Lift 2.0 is not coming up it's merely a rename of Lift 1.1 based on the naming rules that Heiko proposed and the Lift community adopted. The fact that the next release of Lift is going to be called 2.0 rather than 1.1 does not change the scope of the release. Indeed, poor wordings, Lift 2.0 *restructure* coming up is what I meant. But yes, it ends up sounding different, sorry. With that being said, deprecating lift-core is fine by me as long as there is an easy to understand deprecation message with clear instructions as to how to replace lift-core with whatever is necessary. For deprecating dependencies, it's just matter of persuasion (Announcement, wiki etc.) for at least two releases, or more (could be milestone releases). And eventually, dropping it from the build beyond an agreeable release time frame. I couldn't figure out a clean way of deprecating 'meta' packages since it doesn't have any active code (thus doesn't expose any place to code in some deprecation warning message). As such, the package is harmless and there is zero cost of maintenance. Just that, it's no more a good practice (longer build time, larger war
[Lift] Foreach-like snippet: am I doing it right?
This has probably come up previously, but I couldn't find anything even though I think a couple of days ago I read about something similar: I want to do a snippet that behaves similarly to JSTL-s forEach tag. Not exactly the same, but the idea is that it gets some list of model objects, then goes through it element by element and processes the input NodeSeq for each element. What I came up with is this: def foreach(in: NodeSeq) = { val msgs = somehowGetAListOfModelObjects(); msgs.flatMap { msg = // set the current object (CurrentMessage is a ThreadLocal) CurrentMessage.set(msg) // process the contents, with the current object in scope S.session.get.processSurroundAndInclude(, in) } } And it's called like this: lift:blabla.foreach lift:embed what=message.html / /lift:blabla.foreach Is there a more correct solution to this? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Foreach-like snippet: am I doing it right?
S.session.get.processSurroundAndInclude has a couple issues, first is that it seems to be a much larger stick than you need, and the other reason is that you are using get (which is for Option, I presume you mean open_!, since S.session is a box) which is not safe -- it will throw NPE in the case where a session is not available. I think the more idiomatic way is probably more like def forEachMsg(in: NodeSeq): NodeSeq = { val msgs = somehowGetAListOfModelObjects() msgs.flatMap { msg = bind(msg, in, field1 - msg.field1, field2 - msg.field2); } } And then inline at the call side: lift:blabla.forEachMsg msg:field1 / msg:field2 / /lift:blabla.forEachMsg Is there something peculiar about your use case where you really want to do lift:embed and so on? -Ross On Dec 23, 2009, at 1:26 PM, Erkki Lindpere wrote: This has probably come up previously, but I couldn't find anything even though I think a couple of days ago I read about something similar: I want to do a snippet that behaves similarly to JSTL-s forEach tag. Not exactly the same, but the idea is that it gets some list of model objects, then goes through it element by element and processes the input NodeSeq for each element. What I came up with is this: def foreach(in: NodeSeq) = { val msgs = somehowGetAListOfModelObjects(); msgs.flatMap { msg = // set the current object (CurrentMessage is a ThreadLocal) CurrentMessage.set(msg) // process the contents, with the current object in scope S.session.get.processSurroundAndInclude(, in) } } And it's called like this: lift:blabla.foreach lift:embed what=message.html / /lift:blabla.foreach Is there a more correct solution to this? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Foreach-like snippet: am I doing it right?
Well, I'd prefer to keep different concerns separated. Iterating over that list is not the only case where I render those objects, that's why I want the rendering of these objects to be separated into their own template. But maybe I'll change my mind. Doing it like you suggested is probably faster too. Erkki L On Dec 23, 8:31 pm, Ross Mellgren dri...@gmail.com wrote: S.session.get.processSurroundAndInclude has a couple issues, first is that it seems to be a much larger stick than you need, and the other reason is that you are using get (which is for Option, I presume you mean open_!, since S.session is a box) which is not safe -- it will throw NPE in the case where a session is not available. I think the more idiomatic way is probably more like def forEachMsg(in: NodeSeq): NodeSeq = { val msgs = somehowGetAListOfModelObjects() msgs.flatMap { msg = bind(msg, in, field1 - msg.field1, field2 - msg.field2); } } And then inline at the call side: lift:blabla.forEachMsg msg:field1 / msg:field2 / /lift:blabla.forEachMsg Is there something peculiar about your use case where you really want to do lift:embed and so on? -Ross On Dec 23, 2009, at 1:26 PM, Erkki Lindpere wrote: This has probably come up previously, but I couldn't find anything even though I think a couple of days ago I read about something similar: I want to do a snippet that behaves similarly to JSTL-s forEach tag. Not exactly the same, but the idea is that it gets some list of model objects, then goes through it element by element and processes the input NodeSeq for each element. What I came up with is this: def foreach(in: NodeSeq) = { val msgs = somehowGetAListOfModelObjects(); msgs.flatMap { msg = // set the current object (CurrentMessage is a ThreadLocal) CurrentMessage.set(msg) // process the contents, with the current object in scope S.session.get.processSurroundAndInclude(, in) } } And it's called like this: lift:blabla.foreach lift:embed what=message.html / /lift:blabla.foreach Is there a more correct solution to this? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: Foreach-like snippet: am I doing it right?
Well, if that's the case then you could do it something like this: object MySnippet { /** Function that binds fields of a single ModelObj */ def bindModelObj(ns: NodeSeq)(model: ModelObj) = bind(model, ns, field1 - model.field1, field2 - model.field2) } class MySnippet extends DispatchSnippet { import MySnippet.bindModelObj val dispatch: DispatchIt = { case forEach = forEach case justOne = justOne } def forEach(ns: NodeSeq): NodeSeq = somehowGetAListOfModelObjects().flatMap(bindModelObj(ns) _) def justOne(ns: NodeSeq): NodeSeq = bindModelObj(ns)(somehowGetJustOneModelObject()) } And then in your snippet you can also have reuse (I don't know how efficient this is): lift:MySnippet.forEach model:field1 / model:field2 / /lift:MySnippet.forEach lift:MySnippet.justOne model:field1 / model:field2 / /lift:MySnippet.justOne If you have the same rendering for each object, you could use eager_eval and embed: lift:MySnippet.forEach eager_eval=true lift:embed what=modelobject / /lift:MySnippet.forEach lift:MySnippet.justOne eager_eval=true lift:embed what=modelobject / /lift:MySnippet.justOne -Ross On Dec 23, 2009, at 1:51 PM, Erkki Lindpere wrote: Well, I'd prefer to keep different concerns separated. Iterating over that list is not the only case where I render those objects, that's why I want the rendering of these objects to be separated into their own template. But maybe I'll change my mind. Doing it like you suggested is probably faster too. Erkki L On Dec 23, 8:31 pm, Ross Mellgren dri...@gmail.com wrote: S.session.get.processSurroundAndInclude has a couple issues, first is that it seems to be a much larger stick than you need, and the other reason is that you are using get (which is for Option, I presume you mean open_!, since S.session is a box) which is not safe -- it will throw NPE in the case where a session is not available. I think the more idiomatic way is probably more like def forEachMsg(in: NodeSeq): NodeSeq = { val msgs = somehowGetAListOfModelObjects() msgs.flatMap { msg = bind(msg, in, field1 - msg.field1, field2 - msg.field2); } } And then inline at the call side: lift:blabla.forEachMsg msg:field1 / msg:field2 / /lift:blabla.forEachMsg Is there something peculiar about your use case where you really want to do lift:embed and so on? -Ross On Dec 23, 2009, at 1:26 PM, Erkki Lindpere wrote: This has probably come up previously, but I couldn't find anything even though I think a couple of days ago I read about something similar: I want to do a snippet that behaves similarly to JSTL-s forEach tag. Not exactly the same, but the idea is that it gets some list of model objects, then goes through it element by element and processes the input NodeSeq for each element. What I came up with is this: def foreach(in: NodeSeq) = { val msgs = somehowGetAListOfModelObjects(); msgs.flatMap { msg = // set the current object (CurrentMessage is a ThreadLocal) CurrentMessage.set(msg) // process the contents, with the current object in scope S.session.get.processSurroundAndInclude(, in) } } And it's called like this: lift:blabla.foreach lift:embed what=message.html / /lift:blabla.foreach Is there a more correct solution to this? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Foreach-like snippet: am I doing it right?
Thanks! I'll try that. On Dec 23, 8:59 pm, Ross Mellgren dri...@gmail.com wrote: Well, if that's the case then you could do it something like this: object MySnippet { /** Function that binds fields of a single ModelObj */ def bindModelObj(ns: NodeSeq)(model: ModelObj) = bind(model, ns, field1 - model.field1, field2 - model.field2) } class MySnippet extends DispatchSnippet { import MySnippet.bindModelObj val dispatch: DispatchIt = { case forEach = forEach case justOne = justOne } def forEach(ns: NodeSeq): NodeSeq = somehowGetAListOfModelObjects().flatMap(bindModelObj(ns) _) def justOne(ns: NodeSeq): NodeSeq = bindModelObj(ns)(somehowGetJustOneModelObject()) } And then in your snippet you can also have reuse (I don't know how efficient this is): lift:MySnippet.forEach model:field1 / model:field2 / /lift:MySnippet.forEach lift:MySnippet.justOne model:field1 / model:field2 / /lift:MySnippet.justOne If you have the same rendering for each object, you could use eager_eval and embed: lift:MySnippet.forEach eager_eval=true lift:embed what=modelobject / /lift:MySnippet.forEach lift:MySnippet.justOne eager_eval=true lift:embed what=modelobject / /lift:MySnippet.justOne -Ross On Dec 23, 2009, at 1:51 PM, Erkki Lindpere wrote: Well, I'd prefer to keep different concerns separated. Iterating over that list is not the only case where I render those objects, that's why I want the rendering of these objects to be separated into their own template. But maybe I'll change my mind. Doing it like you suggested is probably faster too. Erkki L On Dec 23, 8:31 pm, Ross Mellgren dri...@gmail.com wrote: S.session.get.processSurroundAndInclude has a couple issues, first is that it seems to be a much larger stick than you need, and the other reason is that you are using get (which is for Option, I presume you mean open_!, since S.session is a box) which is not safe -- it will throw NPE in the case where a session is not available. I think the more idiomatic way is probably more like def forEachMsg(in: NodeSeq): NodeSeq = { val msgs = somehowGetAListOfModelObjects() msgs.flatMap { msg = bind(msg, in, field1 - msg.field1, field2 - msg.field2); } } And then inline at the call side: lift:blabla.forEachMsg msg:field1 / msg:field2 / /lift:blabla.forEachMsg Is there something peculiar about your use case where you really want to do lift:embed and so on? -Ross On Dec 23, 2009, at 1:26 PM, Erkki Lindpere wrote: This has probably come up previously, but I couldn't find anything even though I think a couple of days ago I read about something similar: I want to do a snippet that behaves similarly to JSTL-s forEach tag. Not exactly the same, but the idea is that it gets some list of model objects, then goes through it element by element and processes the input NodeSeq for each element. What I came up with is this: def foreach(in: NodeSeq) = { val msgs = somehowGetAListOfModelObjects(); msgs.flatMap { msg = // set the current object (CurrentMessage is a ThreadLocal) CurrentMessage.set(msg) // process the contents, with the current object in scope S.session.get.processSurroundAndInclude(, in) } } And it's called like this: lift:blabla.foreach lift:embed what=message.html / /lift:blabla.foreach Is there a more correct solution to this? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: Foreach-like snippet: am I doing it right?
Also if you need to do a foreach in the middle of a snippet (say in the previous example there was a header row that is also bound by the snippet), the right side of a binding (the part after the arrow) can be a function from NodeSeq to NodeSeq, so you can nest binds, and make that function do a flatMap. - Erkki Lindperevill...@gmail.com wrote: Thanks again for the advice, this was about 25 times faster than what I originally showed! Erkki On Dec 23, 8:59 pm, Ross Mellgren dri...@gmail.com wrote: Well, if that's the case then you could do it something like this: object MySnippet { /** Function that binds fields of a single ModelObj */ def bindModelObj(ns: NodeSeq)(model: ModelObj) = bind(model, ns, field1 - model.field1, field2 - model.field2) } class MySnippet extends DispatchSnippet { import MySnippet.bindModelObj val dispatch: DispatchIt = { case forEach = forEach case justOne = justOne } def forEach(ns: NodeSeq): NodeSeq = somehowGetAListOfModelObjects().flatMap(bindModelObj(ns) _) def justOne(ns: NodeSeq): NodeSeq = bindModelObj(ns)(somehowGetJustOneModelObject()) } And then in your snippet you can also have reuse (I don't know how efficient this is): lift:MySnippet.forEach model:field1 / model:field2 / /lift:MySnippet.forEach lift:MySnippet.justOne model:field1 / model:field2 / /lift:MySnippet.justOne If you have the same rendering for each object, you could use eager_eval and embed: lift:MySnippet.forEach eager_eval=true lift:embed what=modelobject / /lift:MySnippet.forEach lift:MySnippet.justOne eager_eval=true lift:embed what=modelobject / /lift:MySnippet.justOne -Ross On Dec 23, 2009, at 1:51 PM, Erkki Lindpere wrote: Well, I'd prefer to keep different concerns separated. Iterating over that list is not the only case where I render those objects, that's why I want the rendering of these objects to be separated into their own template. But maybe I'll change my mind. Doing it like you suggested is probably faster too. Erkki L On Dec 23, 8:31 pm, Ross Mellgren dri...@gmail.com wrote: S.session.get.processSurroundAndInclude has a couple issues, first is that it seems to be a much larger stick than you need, and the other reason is that you are using get (which is for Option, I presume you mean open_!, since S.session is a box) which is not safe -- it will throw NPE in the case where a session is not available. I think the more idiomatic way is probably more like def forEachMsg(in: NodeSeq): NodeSeq = { val msgs = somehowGetAListOfModelObjects() msgs.flatMap { msg = bind(msg, in, field1 - msg.field1, field2 - msg.field2); } } And then inline at the call side: lift:blabla.forEachMsg msg:field1 / msg:field2 / /lift:blabla.forEachMsg Is there something peculiar about your use case where you really want to do lift:embed and so on? -Ross On Dec 23, 2009, at 1:26 PM, Erkki Lindpere wrote: This has probably come up previously, but I couldn't find anything even though I think a couple of days ago I read about something similar: I want to do a snippet that behaves similarly to JSTL-s forEach tag. Not exactly the same, but the idea is that it gets some list of model objects, then goes through it element by element and processes the input NodeSeq for each element. What I came up with is this: def foreach(in: NodeSeq) = { val msgs = somehowGetAListOfModelObjects(); msgs.flatMap { msg = // set the current object (CurrentMessage is a ThreadLocal) CurrentMessage.set(msg) // process the contents, with the current object in scope S.session.get.processSurroundAndInclude(, in) } } And it's called like this: lift:blabla.foreach lift:embed what=message.html / /lift:blabla.foreach Is there a more correct solution to this? -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to
[Lift] Re: Problem with LiftFilter in 2.8.0
So the 2.8 port branch(I'm used to subversion lingo) is broken right now? Ouch, the only netbeans plugin for scala that works on the current release of netbeans requires 2.8xx.. Oh and I'm not mixing lift versions in the same webapp, I was mixing in the same container. But now I moved both webapps to the 2.8.0 port. I guess I should have just hung back on netbeans, hindsight 20/20 and all, ugh.. Alan On Dec 22, 8:03 pm, Randinn rand...@gmail.com wrote: This is not the first time this has cropped up, you may have to sticky warning not to use 2.8 with Lift for the moment. On Dec 23, 2:55 pm, David Pollak feeder.of.the.be...@gmail.com wrote: Lift *DOES NOT* work on Scala 2.8 Beta1 RC4 5. Do not even try it. We are currently working with EPFL to resolve these issues. Lift 1.1-M8 and Lift 1.1-SNAPSHOT only work with Scala 2.7.7. That is the *only* version of Scala that Lift 1.1-M8 and SNAPSHOT work with. If you have any other version of Scala specified in your pom.xml file, it will not work. Do not try to mix different versions of Lift in the same web app. The class loader will not know which versions of the Lift library go with different Servlets. Once you get your pom.xml file set up with Scala 2.7.7, then you must do a mvn -U clean install before doing an mvn jetty:run On Tue, Dec 22, 2009 at 7:39 PM, Alan M alan.morten...@gmail.com wrote: Update: I updated the other servlet to scala 2.8 and lift 1.1 snapshot (much easier than I thought, I must be getting used to it) and I checked the libs for both webapps and the commons lib directory.. no conflicting versions of scala or lift jars.. I'm on Tomcat 6 btw.. Not sure where to look next.. Alan On Dec 22, 7:13 pm, Ross Mellgren dri...@gmail.com wrote: Where do you have the scala library jars? If you haven't taken pains to ensure that you have two entirely separate scala JARs (2.7.3 and 2.8) in two separate classloaders I could believe that you'll get all kinds of problems like this. You might be better served using two separate tomcat instances and some kind of reverse proxy like nginx to ensure they remain entirely separated. -Ross On Dec 22, 2009, at 10:07 PM, Alan M wrote: I get this message when it tries to initialize the LiftFilter.. Dec 22, 2009 6:53:40 PM org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter LiftFilter java.lang.NoSuchMethodError: scala.collection.SeqLike.projection() Ljava/lang/Object; at net.liftweb.util.ListHelpers$class.first(ListHelpers.scala: 53) at net.liftweb.util.Helpers$.first(Helpers.scala:32) at net.liftweb.util.LogBoot$.findTheFile$1(Log.scala:117) at net.liftweb.util.LogBoot$._log4JSetup(Log.scala:119) at net.liftweb.util.LogBoot$$anonfun$1.apply(Log.scala:97) at net.liftweb.util.LogBoot$$anonfun$1.apply(Log.scala:97) at net.liftweb.util.LogBoot$.checkConfig(Log.scala:95) at net.liftweb.util.LogBoot$.net$liftweb$util$LogBoot$$_logger (Log.scala:141) at net.liftweb.util.LogBoot$$anonfun$2.apply(Log.scala:143) at net.liftweb.util.LogBoot$$anonfun$2.apply(Log.scala:143) at net.liftweb.util.Log$.rootLogger(Log.scala:27) at net.liftweb.util.Log$.error(Log.scala:43) at net.liftweb.http.provider.HTTPProvider$class.bootLift (HTTPProvider.scala:80) at net.liftweb.http.LiftFilter.bootLift(LiftServlet.scala:524) at net.liftweb.http.provider.servlet.ServletFilterProvider $class.init(ServletFilterProvider.scala:23) at net.liftweb.http.LiftFilter.init(LiftServlet.scala:524) Are multiple versions of Scala or Lift getting messed up here? I have two different Lift based servlets on this tomcat, one with Scala 2.7.3 and an older lift version and one with Scala 2.8 and the newest lift version.. I guess I'm just trying to avoid updating that other servlet because it's really not in my schedule right now.. Then again that might not be the problem at all.. Alan -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com . For more options, visit this group athttp:// groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com . For more options, visit this group at
[Lift] Lift binding: is ChooseTemplate always necessary with nested tags?
I've got this xhtml in my template: lift:Compare.loserAlsoKnownAs Also known as: ul alsoKnownAs:list lilist:label //li /alsoKnownAs:list /ul /lift:Compare.loserAlsoKnownAs with this snippet code: def alsoKnownAs( xhtml: NodeSeq, product: Product): NodeSeq = { def list( xhtml: NodeSeq, product: Product): NodeSeq = { product .alternateLabels .flatMap( l = bind(list, xhtml, label - l ) ) } product.alternateLabels match { // Remove the entire block (including title if there are no alternate labels) case Nil = Nil case _ = bind(alsoKnownAs, xhtml, list - list (chooseTemplate(alsoKnownAs,list, xhtml), product)) } } This works well: - The entire XHTML is removed if there are no alternateLabels - If there are alternateLabels, the Also known as: text is not repeated, just the LI elements in the list However, in my bind call: case _ = bind(alsoKnownAs, xhtml, list - list (chooseTemplate(alsoKnownAs,list, xhtml), product)) I specified alsoKnownAs:list twice, it feels a bit redundant... The intent of the code is: find the thing called alsoKnownAs:list, grab the xhtml below it, pass it into the list function, and replace its value with the output of list. Is there some trick I'm missing here to avoid specifying things twice? Just curious - the solution is pretty elegant as is. - Alex -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Lift binding: is ChooseTemplate always necessary with nested tags?
I missed a bit of code, probably not relevant, but just in case someone notices the issue: def loserAlsoKnownAs( xhtml: NodeSeq ): NodeSeq = { alsoKnownAs(xhtml, loser) } -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Advanced lift binding, parameters?
S.attr gives you attributes of the current snippet calling tag, e.g. class Item extends DispatchSnippet { val dispatch: DispatchIt = { case points = points } def points(ns: NodeSeq): NodeSeq = { val points = S.attr(item) match { case Full(first) = loadFirstListOfPoints() case Full(second) = loadSecondListOfPoints() case _ = error(missing item attribute or has incorrect value) } bind(...) } } -Ross On Dec 23, 2009, at 4:07 PM, Alex Black wrote: I've got some xhtml blocks in one of my templates that are basically identical, and I'd like to avoid the duplication, by either writing the block once in my template and using a snippet to write it out twice (with different values) or put it in its own template. h1Items/h1 h2First/h2 ul lift:Item.firstPoints lipoint:name / /lift:Item.firstPoints /ul lift:item.firstPicture / h2Second/h2 ul lift:Item.secondPoints lipoint:name / /lift:Item.secondPoints /ul lift:item.secondPicture / My question is: If I write this block once, and surround it in a snippet which emits it twice, how can the snippet parameterize the nested snippet calls? I realize I could bind the entire block with one snippet call, but because my real blocks are big and complex I'd like to keep the many snippet calls per block. So, more specifically, how can i write lift:Item.secondPoints and lift:item.firstPoints more like this: lift:item.points item=@curItem thx - Alex -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Recursive bind within the same snippet
So, I'm working on a simple image gallery, and I can make a link from an image in the gallery to a page for that image with this: lift:Image.showAll showAll:imgLink / /lift:Image.showAll (additional content omitted for clarity). This is simple enough to bind: imgLink - link(/viewImage, () = selected(i.id), img src={i.url} /) but this a.) puts a tiny bit of content in the snippet (what if different pages want different class attributes on the img tag?), and b.) isn't customizable -- if I want another link from the image's name, I need another bindpoint, etc. So, with some playing around, I can get a little more general with lift:Image.showAll showAll:link psome random html/p /showAll:link /lift:Image.showAll bound via: link - {n: NodeSeq = link(/viewImage, () = selected(i.id), n)} or: link - link(/viewImage, () = selected(i.id), chooseTemplate(showAll, link, in)), this works well enough as far as it goes (the latter is a little worse, IIUC as it involves more rescanning of the html). But what I would like to do is this: lift:Image.showAll showAll:link img showAll:imgUrl= / /showAll:link /lift:Image.showAll and neither of the previous two BindParams work, yielding: XML Parsing Error: prefix not bound to a namespace Location: http://www.draga.com:9080/viewImages Line Number 135, Column 12: img showAll:imgUrl= / since the content is not re-substituted. So far, the only way I've found to do this is with a second call to bind, repeating the list of BindParams: link - // XXX XXX XXX ugly respecifaction of bind {n: NodeSeq = link(/viewImage, () = selected(i.id), bind(showAll, n, name - i.name.is, AttrBindParam(imgUrl, i.url, src) ))}, Is there a cleaner way to do this -- to specify that I want bind points of this snippet to be evaluated even if they appear within the XML of other bind points? I don't want or need true recursive evaluation -- just to bind all of the bind points which were visible when the xhtml was first parsed. Thoughts? This is with 1.1-M8, though I don't think it makes a difference... -- Jim Wise jw...@draga.com pgp94whYwN2xg.pgp Description: PGP signature
Re: [Lift] Recursive bind within the same snippet
Move the bind to an inner function, and call that function recursively, for example: class Image extends DispatchSnippet { val dispatch: DispatchIt = { case showAll = showAll } def showAll(ns: NodeSeq): NodeSeq = { def doBinding(ns: NodeSeq): NodeSeq = bind(showAll, ns, link - { (ns: NodeSeq) = SHtml.link(/viewImage, () = selected(i.id), img src={ i.url } /, doBinding(ns)) }) doBinding(ns) } } -Ross On Dec 23, 2009, at 4:20 PM, Jim Wise wrote: So, I'm working on a simple image gallery, and I can make a link from an image in the gallery to a page for that image with this: lift:Image.showAll showAll:imgLink / /lift:Image.showAll (additional content omitted for clarity). This is simple enough to bind: imgLink - link(/viewImage, () = selected(i.id), img src={i.url} /) but this a.) puts a tiny bit of content in the snippet (what if different pages want different class attributes on the img tag?), and b.) isn't customizable -- if I want another link from the image's name, I need another bindpoint, etc. So, with some playing around, I can get a little more general with lift:Image.showAll showAll:link psome random html/p /showAll:link /lift:Image.showAll bound via: link - {n: NodeSeq = link(/viewImage, () = selected(i.id), n)} or: link - link(/viewImage, () = selected(i.id), chooseTemplate(showAll, link, in)), this works well enough as far as it goes (the latter is a little worse, IIUC as it involves more rescanning of the html). But what I would like to do is this: lift:Image.showAll showAll:link img showAll:imgUrl= / /showAll:link /lift:Image.showAll and neither of the previous two BindParams work, yielding: XML Parsing Error: prefix not bound to a namespace Location: http://www.draga.com:9080/viewImages Line Number 135, Column 12: img showAll:imgUrl= / since the content is not re-substituted. So far, the only way I've found to do this is with a second call to bind, repeating the list of BindParams: link -// XXX XXX XXX ugly respecifaction of bind {n: NodeSeq = link(/viewImage, () = selected(i.id), bind(showAll, n, name - i.name.is, AttrBindParam(imgUrl, i.url, src) ))}, Is there a cleaner way to do this -- to specify that I want bind points of this snippet to be evaluated even if they appear within the XML of other bind points? I don't want or need true recursive evaluation -- just to bind all of the bind points which were visible when the xhtml was first parsed. Thoughts? This is with 1.1-M8, though I don't think it makes a difference... -- Jim Wise jw...@draga.com -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Advanced lift binding, parameters?
Thanks Ross, I think I get that.. I'm not seeing the full picture yet, let me show a bit more of my thinking: So, extending my previous example, I'd like to write it like this: h1Items/h1 lift:Item.firstAndSecond h2item:which/h2 ul lift:Item.points lipoint:name / /lift:Item.points /ul lift:item.picture / /lift:Item.firstAndSecond // Emit the block twice, once for each item (first,second). def firstAndSecond(xhtml: NodeSeq): NodeSeq = { List(first,second).flatMap( item = renderItem(xhtml, item) ) } How then do I implement Item.picture, Item.points to know *which* item is currently being rendered? thx - Alex On Dec 23, 4:18 pm, Ross Mellgren dri...@gmail.com wrote: S.attr gives you attributes of the current snippet calling tag, e.g. class Item extends DispatchSnippet { val dispatch: DispatchIt = { case points = points } def points(ns: NodeSeq): NodeSeq = { val points = S.attr(item) match { case Full(first) = loadFirstListOfPoints() case Full(second) = loadSecondListOfPoints() case _ = error(missing item attribute or has incorrect value) } bind(...) } } -Ross On Dec 23, 2009, at 4:07 PM, Alex Black wrote: I've got some xhtml blocks in one of my templates that are basically identical, and I'd like to avoid the duplication, by either writing the block once in my template and using a snippet to write it out twice (with different values) or put it in its own template. h1Items/h1 h2First/h2 ul lift:Item.firstPoints lipoint:name / /lift:Item.firstPoints /ul lift:item.firstPicture / h2Second/h2 ul lift:Item.secondPoints lipoint:name / /lift:Item.secondPoints /ul lift:item.secondPicture / My question is: If I write this block once, and surround it in a snippet which emits it twice, how can the snippet parameterize the nested snippet calls? I realize I could bind the entire block with one snippet call, but because my real blocks are big and complex I'd like to keep the many snippet calls per block. So, more specifically, how can i write lift:Item.secondPoints and lift:item.firstPoints more like this: lift:item.points item=@curItem thx - Alex -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group athttp://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Recursive bind within the same snippet
Ross Mellgren dri...@gmail.com writes: Move the bind to an inner function, and call that function recursively, for example: Aha! This gets me to: def doShowAll(in: NodeSeq): NodeSeq = { def doBinding(ns: NodeSeq, i: ImageInfo): NodeSeq = bind(showAll, ns, name - i.name.is, link - {n: NodeSeq = SHtml.link(/viewImage, () = selected(i.id), doBinding(n, i))}, category - i.category.obj.open_!.name, // XXX safe unless key rel is corrupt ? AttrBindParam(imgUrl, i.url, src) ) ImageInfo.findAll( By(ImageInfo.category, category), OrderBy(ImageInfo.name, Ascending) ).flatMap({i = doBinding(in, i)}) } which does exactly what I need! Thanks much, -- Jim Wise jw...@draga.com pgpUZxCXm2kPS.pgp Description: PGP signature
Re: [Lift] Re: Beginner Ajax question - redrawing a page fragment
Hello, A couple of observations... First, having some XHTML in your Scala code is not a bad thing. When the XHTML declares the meaning (not the layout) of the information, it's my opinion that it's okay. This means that: ul{list.map(i = li{i}/li}ul Simply defines an unordered list. It does not declare how to lay out that list. The layout should be controlled by CSS. True, xhtml can also be considered as logic. You got me convinced ;). TemplateFinder.findAnyTemplate(List(snippets-hidden, userList)) openOr NodeSeq.Empty) Worked great; lots of Lift API to explore still :). If you don't mind, I'll put the results of this thread in a tutorial-ajax-followup wiki page? I think quite a lot of people may want to do something similar. -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: Advanced lift binding, parameters?
So, with nested snippets you have two basic execution model options: 1) the default, the inner snippets get executed after the outer snippet has executed completely. the outer snippet sees as it's content the original content from the template, complete with lift:Item.points tags and so on. 2) when eager_eval=true is specified on the outer snippet, the inner snippets get executed completely before the outer snippet gets executed. the outer snippet sees the _result_ of processing the children from the template, so it sees whatever the lift:Item.points snippet gives back. So, this means that fundamentally you couldn't tell the inner snippet which is the current one, without rewriting the call to the inner snippet (e.g. find the lift:Item.points tag and write in an attribute -- this seems like a grody hack) If you really want an inner snippet running _during_ the processing of the outer snippet, I think you need to do that processSurroundAndInclude thing in the outer snippet code. If you're not tied to the inner snippet, then omit it, like this: class Item extends DispatchSnippet { val dispatch: DispatchIt = { case firstAndSecond = firstAndSecond } def firstAndSecond(ns: NodeSeq): NodeSeq = List((first, firstSeqOfThings), (second, secondSeqOfThings)).flatMap { case (label, items) = bind(item, ns, which - label, points - { (ns: NodeSeq) = items.flatMap { item = bind(point, ns, name - item.name) }) } } And the template would be: h1Items/h1 lift:Item.firstAndSecond h2item:which //h2 ul item:points lipoint:name //li /item:points /ul item:picture / /lift:Item.firstAndSecond If you're concerned about embedding so much code in the snippet (which seems to be why you want to break into multiple snippets?) then just break them out into separate functions, like I showed you in the foreach example. I think it helps to remember that snippets are really just XML - XML functions, and there's little special about them other than that they can be named in templates. You can always call snippets from other snippets directly (e.g. (new MySnippet).thatSnippet(nodes)), though if you use any stateful stuff in those snippets that depends on the current expansion point (e.g. S.attr) then you'd need to break the snippet into two pieces, e.g. class MySnippet extends DispatchSnippet { val dispatch: DispatchIt = { case foobar = foobar } def foobar(ns: NodeSeq): NodeSeq = { S.attr(itemId).map(lookupItemById _) match { case Full(item) = foobar(item)(ns) case _ = error(could not find item -- itemId attribute not given or invalid) } } def foobar(item: ItemModel)(ns: NodeSeq): NodeSeq = bind(...) } Now if you're calling from template, you say lift:MySnippet.foobar itemId=1234.../lift:MySnippet.foobar, but if you're in some other snippet you say MySnippet.foobar(theItem)(...) Hope that helps, -Ross On Dec 23, 2009, at 4:32 PM, Alex Black wrote: Thanks Ross, I think I get that.. I'm not seeing the full picture yet, let me show a bit more of my thinking: So, extending my previous example, I'd like to write it like this: h1Items/h1 lift:Item.firstAndSecond h2item:which/h2 ul lift:Item.points lipoint:name / /lift:Item.points /ul lift:item.picture / /lift:Item.firstAndSecond // Emit the block twice, once for each item (first,second). def firstAndSecond(xhtml: NodeSeq): NodeSeq = { List(first,second).flatMap( item = renderItem(xhtml, item) ) } How then do I implement Item.picture, Item.points to know *which* item is currently being rendered? thx - Alex On Dec 23, 4:18 pm, Ross Mellgren dri...@gmail.com wrote: S.attr gives you attributes of the current snippet calling tag, e.g. class Item extends DispatchSnippet { val dispatch: DispatchIt = { case points = points } def points(ns: NodeSeq): NodeSeq = { val points = S.attr(item) match { case Full(first) = loadFirstListOfPoints() case Full(second) = loadSecondListOfPoints() case _ = error(missing item attribute or has incorrect value) } bind(...) } } -Ross On Dec 23, 2009, at 4:07 PM, Alex Black wrote: I've got some xhtml blocks in one of my templates that are basically identical, and I'd like to avoid the duplication, by either writing the block once in my template and using a snippet to write it out twice (with different values) or put it in its own template. h1Items/h1 h2First/h2 ul lift:Item.firstPoints lipoint:name / /lift:Item.firstPoints /ul lift:item.firstPicture / h2Second/h2 ul lift:Item.secondPoints lipoint:name /
Re: [Lift] Recursive bind within the same snippet
Normally you'd probably do something like i.category.obj.map(_.name).openOr(unknown category!) That is, if I have a category object give me its name, otherwise give me unknown category! Also, if you have to collect the result a bunch of possibly-failing computations (like looking up the category can fail) then remember that the for comprehension is your friend. -Ross On Dec 23, 2009, at 4:45 PM, Jim Wise wrote: Jim Wise jw...@draga.com writes: category - i.category.obj.open_!.name, // XXX safe unless key rel is corrupt ? AttrBindParam(imgUrl, i.url, src) And, since I'm looking at this code, what's the safe way to do this (i.e. can I avoid the open_!)? -- Jim Wise jw...@draga.com -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] Re: Duplicate divs in tutorial
Why not something like: div id=all_todos lift:TD.list all_id=all_todos ... /lift:TD.list /div Br's, Marius On Dec 23, 11:46 pm, Adam Warski a...@warski.org wrote: Hello, just a note to the snippets written in the tutorial. The elements of the todo list, when changed (e.g. the done checkbox), submit and redraw the list. The code for that is (Listing 17): def list(html: NodeSeq) = { val id = S.attr(all_id).open_! def inner(): NodeSeq = { def reDraw() = SetHtml(id, inner()) bind(todo, html, exclude - ajaxCheckbox(QueryNotDone, v = {QueryNotDone(v); reDraw}), list - doList(reDraw) _) } inner() } And the corresponding template: lift:TD.list all_id=all_todos div id=all_todos !-- proper list -- /div /lift:TD.list As SetHtml sets the children of the element with the specified id, after one change of the checkbox and one ajax call, there will be a div id=all_todos inside the original div id=all_todos (as we set the children of the original element to be the nodes passed to the snippet). So you end up with: lift:TD.list all_id=all_todos div id=all_todos div id=all_todos !-- proper list -- /div /div /lift:TD.list Subsequent calls don't produce any more divs, as the children of the first div with id all_todos get replaced. However, I think it's not too clean to produce markup like that. The solution I think would be to (somehow) strip the outer div of the html NodeSeq and use that in the ajax reDraw method, instead of capturing the original html with a closure. But probably Lift gurus have a better solution :). -- Adam -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Recursive bind within the same snippet
Oh, I see -- because x.map(foo) where x is a Box returns a Box which is Empty/Error or Full(foo(a.open)) depending on whether x was Full. Thank you! Sent from my iPhone On Dec 23, 2009, at 17:06, Ross Mellgren dri...@gmail.com wrote: Normally you'd probably do something like i.category.obj.map(_.name).openOr(unknown category!) That is, if I have a category object give me its name, otherwise give me unknown category! Also, if you have to collect the result a bunch of possibly-failing computations (like looking up the category can fail) then remember that the for comprehension is your friend. -Ross On Dec 23, 2009, at 4:45 PM, Jim Wise wrote: Jim Wise jw...@draga.com writes: category - i.category.obj.open_!.name, // XXX safe unless key rel is corrupt ? AttrBindParam(imgUrl, i.url, src) And, since I'm looking at this code, what's the safe way to do this (i.e. can I avoid the open_!)? -- Jim Wise jw...@draga.com -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Recursive bind within the same snippet
whatever.map().openOr(..) is the usual idiom, however, you could of course use parameter extraction if that floats your boat / is appropriate. Cheers, Tim On 23 Dec 2009, at 23:11, Jim Wise wrote: Oh, I see -- because x.map(foo) where x is a Box returns a Box which is Empty/Error or Full(foo(a.open)) depending on whether x was Full. Thank you! Sent from my iPhone On Dec 23, 2009, at 17:06, Ross Mellgren dri...@gmail.com wrote: Normally you'd probably do something like i.category.obj.map(_.name).openOr(unknown category!) That is, if I have a category object give me its name, otherwise give me unknown category! Also, if you have to collect the result a bunch of possibly-failing computations (like looking up the category can fail) then remember that the for comprehension is your friend. -Ross On Dec 23, 2009, at 4:45 PM, Jim Wise wrote: Jim Wise jw...@draga.com writes: category - i.category.obj.open_!.name, // XXX safe unless key rel is corrupt ? AttrBindParam(imgUrl, i.url, src) And, since I'm looking at this code, what's the safe way to do this (i.e. can I avoid the open_!)? -- Jim Wise jw...@draga.com -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en . -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
Re: [Lift] Re: Problem with LiftFilter in 2.8.0
On Wed, Dec 23, 2009 at 12:29 PM, Alan M alan.morten...@gmail.com wrote: So the 2.8 port branch(I'm used to subversion lingo) is broken right now? No. Until Scala 2.8. RC6, the Scala compiler had problems compiling Lift code. We have been actively working with EPFL to make sure Lift and Scala 2.8 together and EPFL has been very responsive. I am not usually an RTFM kinda guy, but in this case, you should spend just a few minutes reviewing the Lift mailing list to understand what's going on? Why? How often do you see a conversation between me and Martin Odersky? When you see a conversation, which we were having just yesterday about the 2.8/Lift issue, between us, you can bet that it worth reading. So, go back and read it. Ouch, the only netbeans plugin for scala that works on the current release of netbeans requires 2.8xx.. Please refer to my previous email. And just so you know, gee, I want to use the latest and greatest NetBeans plugin even though there are plenty of other Scala IDE environments, is not a compelling reason. David Oh and I'm not mixing lift versions in the same webapp, I was mixing in the same container. But now I moved both webapps to the 2.8.0 port. I guess I should have just hung back on netbeans, hindsight 20/20 and all, ugh.. Alan On Dec 22, 8:03 pm, Randinn rand...@gmail.com wrote: This is not the first time this has cropped up, you may have to sticky warning not to use 2.8 with Lift for the moment. On Dec 23, 2:55 pm, David Pollak feeder.of.the.be...@gmail.com wrote: Lift *DOES NOT* work on Scala 2.8 Beta1 RC4 5. Do not even try it. We are currently working with EPFL to resolve these issues. Lift 1.1-M8 and Lift 1.1-SNAPSHOT only work with Scala 2.7.7. That is the *only* version of Scala that Lift 1.1-M8 and SNAPSHOT work with. If you have any other version of Scala specified in your pom.xml file, it will not work. Do not try to mix different versions of Lift in the same web app. The class loader will not know which versions of the Lift library go with different Servlets. Once you get your pom.xml file set up with Scala 2.7.7, then you must do a mvn -U clean install before doing an mvn jetty:run On Tue, Dec 22, 2009 at 7:39 PM, Alan M alan.morten...@gmail.com wrote: Update: I updated the other servlet to scala 2.8 and lift 1.1 snapshot (much easier than I thought, I must be getting used to it) and I checked the libs for both webapps and the commons lib directory.. no conflicting versions of scala or lift jars.. I'm on Tomcat 6 btw.. Not sure where to look next.. Alan On Dec 22, 7:13 pm, Ross Mellgren dri...@gmail.com wrote: Where do you have the scala library jars? If you haven't taken pains to ensure that you have two entirely separate scala JARs (2.7.3 and 2.8) in two separate classloaders I could believe that you'll get all kinds of problems like this. You might be better served using two separate tomcat instances and some kind of reverse proxy like nginx to ensure they remain entirely separated. -Ross On Dec 22, 2009, at 10:07 PM, Alan M wrote: I get this message when it tries to initialize the LiftFilter.. Dec 22, 2009 6:53:40 PM org.apache.catalina.core.StandardContext filterStart SEVERE: Exception starting filter LiftFilter java.lang.NoSuchMethodError: scala.collection.SeqLike.projection() Ljava/lang/Object; at net.liftweb.util.ListHelpers$class.first(ListHelpers.scala: 53) at net.liftweb.util.Helpers$.first(Helpers.scala:32) at net.liftweb.util.LogBoot$.findTheFile$1(Log.scala:117) at net.liftweb.util.LogBoot$._log4JSetup(Log.scala:119) at net.liftweb.util.LogBoot$$anonfun$1.apply(Log.scala:97) at net.liftweb.util.LogBoot$$anonfun$1.apply(Log.scala:97) at net.liftweb.util.LogBoot$.checkConfig(Log.scala:95) at net.liftweb.util.LogBoot$.net$liftweb$util$LogBoot$$_logger (Log.scala:141) at net.liftweb.util.LogBoot$$anonfun$2.apply(Log.scala:143) at net.liftweb.util.LogBoot$$anonfun$2.apply(Log.scala:143) at net.liftweb.util.Log$.rootLogger(Log.scala:27) at net.liftweb.util.Log$.error(Log.scala:43) at net.liftweb.http.provider.HTTPProvider$class.bootLift (HTTPProvider.scala:80) at net.liftweb.http.LiftFilter.bootLift(LiftServlet.scala:524) at net.liftweb.http.provider.servlet.ServletFilterProvider $class.init(ServletFilterProvider.scala:23) at net.liftweb.http.LiftFilter.init(LiftServlet.scala:524) Are multiple versions of Scala or Lift getting messed up here? I have two different Lift based servlets on this tomcat, one with Scala 2.7.3 and an older lift version and one with Scala 2.8 and the
[Lift] Re: Advanced lift binding, parameters?
Hi Ross, I am learning more about Lift every day :) Reflecting that last point back to you, if I make it just one snippet call, then that snippet call can pass parameters to inner snippet functions, e.g. first or second. So, that works, but I as you mentioned, I think that snippet will get complex. You then pointed out it can be broken into sub snippet calls, which helps, but I still feel like we'd have this big complex snippet call that is tightly coupled to the big complex xhtml block. E.g. it'd be like doing an entire page in one snippet call instead of lots of little ones. Btw, the 'blocks' I keep referring to are product (camera) specifications, so its like we're displaying two products on one page. I had an idea, could the first snippet set a requestVar for the current item, then the other snippet calls read that? e.g. h1Items/h1 lift:Item.firstAndSecond h2item:which/h2 ul lift:Item.points lipoint:name / /lift:Item.points /ul lift:item.picture / /lift:Item.firstAndSecond // Emit the block twice, once for each item (first,second). def firstAndSecond(xhtml: NodeSeq): NodeSeq = { List(first,second).flatMap( item = renderItem(xhtml, item) ) } def renderItem( xhtml: NodeSeq, item: Item): NodeSeq = { _currentItem(item) // do stuff } def points( xhtml: NodeSeq ): NodeSeq = { // do stuff based on _currentItem.is } - Alex On Dec 23, 5:05 pm, Ross Mellgren dri...@gmail.com wrote: So, with nested snippets you have two basic execution model options: 1) the default, the inner snippets get executed after the outer snippet has executed completely. the outer snippet sees as it's content the original content from the template, complete with lift:Item.points tags and so on. 2) when eager_eval=true is specified on the outer snippet, the inner snippets get executed completely before the outer snippet gets executed. the outer snippet sees the _result_ of processing the children from the template, so it sees whatever the lift:Item.points snippet gives back. So, this means that fundamentally you couldn't tell the inner snippet which is the current one, without rewriting the call to the inner snippet (e.g. find the lift:Item.points tag and write in an attribute -- this seems like a grody hack) If you really want an inner snippet running _during_ the processing of the outer snippet, I think you need to do that processSurroundAndInclude thing in the outer snippet code. If you're not tied to the inner snippet, then omit it, like this: class Item extends DispatchSnippet { val dispatch: DispatchIt = { case firstAndSecond = firstAndSecond } def firstAndSecond(ns: NodeSeq): NodeSeq = List((first, firstSeqOfThings), (second, secondSeqOfThings)).flatMap { case (label, items) = bind(item, ns, which - label, points - { (ns: NodeSeq) = items.flatMap { item = bind(point, ns, name - item.name) }) } } And the template would be: h1Items/h1 lift:Item.firstAndSecond h2item:which //h2 ul item:points lipoint:name //li /item:points /ul item:picture / /lift:Item.firstAndSecond If you're concerned about embedding so much code in the snippet (which seems to be why you want to break into multiple snippets?) then just break them out into separate functions, like I showed you in the foreach example. I think it helps to remember that snippets are really just XML - XML functions, and there's little special about them other than that they can be named in templates. You can always call snippets from other snippets directly (e.g. (new MySnippet).thatSnippet(nodes)), though if you use any stateful stuff in those snippets that depends on the current expansion point (e.g. S.attr) then you'd need to break the snippet into two pieces, e.g. class MySnippet extends DispatchSnippet { val dispatch: DispatchIt = { case foobar = foobar } def foobar(ns: NodeSeq): NodeSeq = { S.attr(itemId).map(lookupItemById _) match { case Full(item) = foobar(item)(ns) case _ = error(could not find item -- itemId attribute not given or invalid) } } def foobar(item: ItemModel)(ns: NodeSeq): NodeSeq = bind(...) } Now if you're calling from template, you say lift:MySnippet.foobar itemId=1234.../lift:MySnippet.foobar, but if you're in some other snippet you say MySnippet.foobar(theItem)(...) Hope that helps, -Ross On Dec 23, 2009, at 4:32 PM, Alex Black wrote: Thanks Ross, I think I get that.. I'm not seeing the full picture yet, let me show a bit more of my thinking: So, extending my previous example, I'd like to write it like this: h1Items/h1 lift:Item.firstAndSecond h2item:which/h2 ul
Re: [Lift] Re: Advanced lift binding, parameters?
I guess I could see something that keeps track of which item to show and advances it each time, but I think it's still a good idea to pass the item explicitly down to subsidiary snippets. You can still break up each of the sub snippets, the only difference is you call them without the lift: prefix. This is analogous to composing functions. Maybe something like this? object MySnippet { object nextItems extends RequestVar[Iterator[ModelObject]](calcNextItems) def nextItem: Box[ModelObject] = { val it = nextItems.is if (it.hasNext) Full(it.next) else Empty } private def calcNextItems: List[ModelObject] = for (startIndex - S.attr(index).flatMap(asInt).openOr 0) yield ModelObject.findAll(StartAt(startIndex), MaxRows(2)).elements } class MySnippet extends DispatchSnippet { import MySnippet._ val dispatch: DispatchIt = { case displayNext = displayNextItem } def displayNext(ns: NodeSeq): NodeSeq) = nextItem.map(renderItem(ns) _).openOr(NodeSeq.Empty) def renderItem(item: ModelObject)(ns: NodeSeq): NodeSeq = bind(item, ns, which - item.title, points - renderPointsOf(item) _, // other sub snippet which need a current item here picture - renderPictureOf(item) _) def renderPointsOf(item: ModelObject)(ns: NodeSeq): NodeSeq = item.points.flatMap(point = bind(point, ns, name - point.name)) def renderPictureOf(item: ModelObject)(ns: NodeSeq): NodeSeq = img src={ ... } / } And template item-index-2up.html: h1Items/h1 lift:Item.displayNext eager_eval=true lift:embed what=standard-item-template / /lift:Item.displayNext lift:Item.displayNext eager_eval=true lift:embed what=standard-item-template / /lift:Item.displayNext templates-hidden/standard-item-template.html: h2item:which //h2 ul item:pointslipoint:name //li/item:points /ul item:picture / I fear I'm not quite understanding what you're looking for, though. -Ross On Dec 23, 2009, at 9:43 PM, Alex Black wrote: Hi Ross, I am learning more about Lift every day :) Reflecting that last point back to you, if I make it just one snippet call, then that snippet call can pass parameters to inner snippet functions, e.g. first or second. So, that works, but I as you mentioned, I think that snippet will get complex. You then pointed out it can be broken into sub snippet calls, which helps, but I still feel like we'd have this big complex snippet call that is tightly coupled to the big complex xhtml block. E.g. it'd be like doing an entire page in one snippet call instead of lots of little ones. Btw, the 'blocks' I keep referring to are product (camera) specifications, so its like we're displaying two products on one page. I had an idea, could the first snippet set a requestVar for the current item, then the other snippet calls read that? e.g. h1Items/h1 lift:Item.firstAndSecond h2item:which/h2 ul lift:Item.points lipoint:name / /lift:Item.points /ul lift:item.picture / /lift:Item.firstAndSecond // Emit the block twice, once for each item (first,second). def firstAndSecond(xhtml: NodeSeq): NodeSeq = { List(first,second).flatMap( item = renderItem(xhtml, item) ) } def renderItem( xhtml: NodeSeq, item: Item): NodeSeq = { _currentItem(item) // do stuff } def points( xhtml: NodeSeq ): NodeSeq = { // do stuff based on _currentItem.is } - Alex On Dec 23, 5:05 pm, Ross Mellgren dri...@gmail.com wrote: So, with nested snippets you have two basic execution model options: 1) the default, the inner snippets get executed after the outer snippet has executed completely. the outer snippet sees as it's content the original content from the template, complete with lift:Item.points tags and so on. 2) when eager_eval=true is specified on the outer snippet, the inner snippets get executed completely before the outer snippet gets executed. the outer snippet sees the _result_ of processing the children from the template, so it sees whatever the lift:Item.points snippet gives back. So, this means that fundamentally you couldn't tell the inner snippet which is the current one, without rewriting the call to the inner snippet (e.g. find the lift:Item.points tag and write in an attribute -- this seems like a grody hack) If you really want an inner snippet running _during_ the processing of the outer snippet, I think you need to do that processSurroundAndInclude thing in the outer snippet code. If you're not tied to the inner snippet, then omit it, like this: class Item extends DispatchSnippet { val dispatch: DispatchIt = { case firstAndSecond = firstAndSecond } def firstAndSecond(ns: NodeSeq): NodeSeq = List((first, firstSeqOfThings), (second, secondSeqOfThings)).flatMap { case (label, items) =
Re: [Lift] Re: How do I go about implementing my own auth?
Could SiteMap authorize the editable text? I use swappable some where and do not know how to authorize it. On Tue, Dec 8, 2009 at 5:38 AM, Marius marius.dan...@gmail.com wrote: I'm not really sure why you're saying that SiteMap is out of the question. Note that SiteMap does NOT equate with the Menu. You can use SiteMap to define navigation rules, security semantics, etc. SiteMap is much more then just a menu. But at the end of the day it's your choice. Br's, Marius On Dec 7, 11:32 pm, DMB combust...@gmail.com wrote: SiteMap is out of the question. I don't need it at all on my site, by design. I like the way this is done in RoR: you can basically say: before_filter :authorize, :except = :login And it will call authorize for all top level methods in the controller class except login. Not that any of this is applicable in Lift, but I like this very simple, declarative approach. The current auth infrastructure in Lift requires quite a bit of head scratching the second you try to do something custom. On Dec 7, 11:25 am, Timothy Perrett timo...@getintheloop.eu wrote: Ok, lets step back... I really, really wouldnt use the built in auth stuff for forms... its sole purpose in life (and lift!) is for basic auth as per the HTTP RFCs. If you want basic auth, then thats fine, but i think the way you are subclassing HttpAuthentication is wrong for purpose. If you want login, do one of two things: - use SiteMap (IMHO, this is the most appropriate route) - create a custom rewrite / dispatcher combo You could look at MegaProtoUser, but personally, i'm not a huge fan of that approach and prefer to craft my own. That being said, a lot of people use it and it saves a lot of time. Cheers, Tim On 7 Dec 2009, at 14:14, Marius wrote: On Dec 7, 1:09 pm, DMB combust...@gmail.com wrote: Basically here's what I want to accomplish: 1. I want the user to login through a simple form on /index.html - this is the only unprotected page on the site. User does not have a user name, the only field is a password. 2. I want to store the user role (along with some other state data) in the user session 3. If user tries to access any page other than index.html, I want to redirect to /index.html After stumbling for a while due to scarcity of documentation, I have done the following: In Boot.scala: LiftRules.httpAuthProtectedResource.prepend { case ParsePath(index :: Nil, html, true, false) = Empty case _ = Full(AuthRole(admin)) } LiftRules.authentication = SessionAuthentication() InSessionAuthentication.scala: case class SessionAuthentication extends HttpAuthentication { def verified_? = { case(req) = { // TODO: Prefetch from DB here true } } } It is my understanding that this should not ask for auth at all. In reality, it doesn't ask for auth on /index.html, but DOES ask for Basic auth (through a browser popup) on any other page. What am I doing wrong, and how do I make it right? Your are seeing the browser's credentials popup because of : def unauthorizedResponse: UnauthorizedResponse = UnauthorizedResponse (realm) from HttpAuthentication trait. You can override this and subclass UnauthorizedResponse with your own LiftResponse if you want other type of response than 401. You can also protect your resources using HttpAuthProtected LocParam that you can use when you specify your SiteMap in the Loc construction. This is one approach. Another one, probably more suitable for login forms, is to look into Mapper support for that (I think it's called MetaMegaProtoUser ? ) -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com . For more options, visit this group athttp:// groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- Scala中文社区: http://groups.google.com/group/scalacn -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at
Re: [Lift] re: trying to get minimum needed for unit test to work using LIFT 1.1 and JPA
This line is troubling: [PersistenceUnit: jpaweb] Unable to build EntityManagerFactory But I'm not sure why that would be happening and not throwing some sort of exception or logging. I'm not going to be around much over the holidays, but I can definitely help next week if you're still running into this issue. Derek On Fri, Dec 18, 2009 at 12:06 AM, James Black planiturth...@gmail.comwrote: I am trying to test that my entities are working properly, but I get this at the end of the surefire output for the test: 1634 [main] INFO org.hibernate.cfg.annotations.CollectionBinder - Mapping collection: jblack.resumeapp.lift.model.Author.books - Book 1639 [main] INFO org.hibernate.cfg.AnnotationConfiguration - Hibernate Validator not found: ignoring 1739 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. [PersistenceUnit: jpaweb] Unable to build EntityManagerFactory I only have defined my classes in jblack.resumeapp.lift.model and created my unit test. The EntityManagerFactory seems to process my models properly. I haven't done anything with the snippets, so there are no RequestVar implementations for my new models. I had created the jpa sample so all I did was add my new classes there. Do I need to finish the steps in chapter 10 of the lift book to get my unit tests to pass at all? In an unchanged jpa sample I am missing the next lines, and I am not certain what must be done to resolve this, as the driver information isn't being processed at all. I use 'mvn clean install' to run my tests from the top level of my project, but if I do 'cd spa' then 'mvn install' I get the same results. 1805 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. 1977 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!) 1977 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 20 I am trying to get my test working so I can put back in my @OneToOne, @OneToMany and related columns and @PostLoad and related annotations, as I had another error when using these, so I have commented them out until I get the test working so far. Thank you. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.comliftweb%2bunsubscr...@googlegroups.com . For more options, visit this group at http://groups.google.com/group/liftweb?hl=en. -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.
[Lift] findAll and inner/outer joins
Hi! Help me, please, with example of inner and outer relations in findAll query. Is it possible to do without manual BySQL()? I want to do following select: select * from payment_order o join client c on o.client_id = c.id where c.type = 'xxx' = PaymentOrder.findAll(...) I had a lot of googling and didn't found anything... -- You received this message because you are subscribed to the Google Groups Lift group. To post to this group, send email to lift...@googlegroups.com. To unsubscribe from this group, send email to liftweb+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/liftweb?hl=en.