On Thu, Aug 6, 2009 at 9:28 AM, Naftoli Gugenheim <[email protected]>wrote:
> Here's some view xhtml:
>>
>> <req:noClient>
>
> <label for="clientquery">Client </label>
>
> <client:query id="clientquery" size="5"/>
>
> <client:set />
>
> </req:noClient>
>
> <req:client>
>
> Client <client:unset />
>
> <client:edit><client:name /></client:edit><br />
>
> <client:details />
>
> </req:client>
>
> <hr />
>
>
How about:
def doBinding(xhtml: NodeSeq): NodeSeq = {
def doClientBind(c: Client): Box[NodeSeq] =
Helpers.template(xhtml, "req", "client").map(t => bind("client", t,
...))
def doClientFreeBind: Box[NodeSeq] =
Helpers.template(xhtml, "req", "noClient").map(t => bind("client", t,
...))
(client.flatMap(doClientBind) or doClientFreeBind) openOr NodeSeq.Empty
}
>
> And here's some snippet code:
>
>> xhtml.bind("req",
>
> "noClient" -> noClient _,
>
> "client" -> hasClient _,
>
> ...
>
> )
>
> def noClient(xhtml: NodeSeq) = {
>
> var clientQuery: String = ""
>
> def queryClient {
>
> ...
>
> }
>
> client match {
>
> case None =>
>
> xhtml.bind("client",
>
> "query" -> keepAttrs(SHtml.text(clientQuery, clientQuery = _)),
>
> "set" -> SHtml.submit(?(">"), ()=>queryClient)
>
> )
>
> case Some(_) =>
>
> NodeSeq.Empty
>
> }
>
> }
>
>
> So both alternatives are always bound to a NodeSeq=>NodeSeq function, and
> both functions have to check if client is None or a Some, and always one
> function returns NodeSeq.Empty and the other one something useful.
> So my question is not, "how can I do xxx," but, "is there a 'DRY'er or more
> concise way to do it."
> In another place I used a slightly different technique:
>
>> val emptyFn = (ns: NodeSeq) => NodeSeq.Empty
>
> def noLocationKind = (ns: NodeSeq) => ...
>
> def hasLocationKind(kind: LocKind#Value) = (ns:NodeSeq) => ...
>
> ns.bind("nlt",
>
> // "name" -> {(ns:NodeSeq)=>Text("foo")},
>
> "locKind" -> lkOpt.map(hasLocationKind).getOrElse(emptyFn),
>
> "noLocKind" -> (if(lkOpt==None) noLocationKind else emptyFn)
>
> ).bind("nlt","name"->nlt.name.is)
>
> Where lkOpt is the value that can be None or a Some. Instead of letting the
> functions check None/Some, I check outside the function. But it still seems
> that in theory it could be simplified.
> chooseTemplate doesn't solve the problem that the alternative NodeSeq has
> to be transformed to NodeSeq.Empty.
> P.S. Notice that I'm using my implicit to call bind on the NodeSeq :)
> P.P.S If you look closely, there's another problem that I had. For some
> reason the first "name" -> ... was getting ignored, and it only worked in
> the second bind.
> Thanks!
>
>
>
>
>
> On Thu, Aug 6, 2009 at 10:49 AM, David Pollak <
> [email protected]> wrote:
>
>> I really need to see the resulting view code that you'd like to see
>> depending on the conditions.
>>
>> On Thu, Aug 6, 2009 at 7:47 AM, Naftoli Gugenheim
>> <[email protected]>wrote:
>>
>>>
>>> No, I meant that this pattern of parts of the view being alternatives to
>>> each other repeats, in other words the view has several pairs of
>>> alternatives.
>>
>>
>> I don't understand why the example doesn't allow for alternatives that
>> repeat.
>>
>>
>>>
>>>
>>> -------------------------------------
>>> David Pollak<[email protected]> wrote:
>>>
>>> On Wed, Aug 5, 2009 at 8:44 PM, Naftoli Gugenheim <[email protected]
>>> >wrote:
>>>
>>> >
>>> > What's the smartest / most concise way to achieve the following in the
>>> > corresponding view xhtml and snippet code:
>>> > Parts of the view have to change, depending on whether something is
>>> set.
>>> > For example, in the area where you select the client, if the client is
>>> None,
>>> > then it displays an interface to select a client. If it's set to a Some
>>> then
>>> > it displays the client's details with a button to unset it. This
>>> pattern is
>>> > repeated.
>>> > My current strategy is to have two elements, req:noClient and
>>> req:client,
>>> > which have different xhtml contents. Then in the snippet I bind them to
>>> two
>>> > NodeSeq functions, one that binds useful contents when the client is
>>> None
>>> > and returns NodeSeq.Empty otherwise; and another function that binds
>>> when
>>> > it's a Some and returns Empty otherwise. However, it seems to be
>>> somewhat
>>> > redundant in theory.
>>> > So does anyone have a better way of switching view parts?
>>>
>>>
>>> If it's repeated, then <lift:embed /> the part that you need.
>>>
>>> <lift:MaybeClient>
>>> <client:yes><lift:embed
>>> what="/templates/client_edit.html"/></client:yes>
>>> <client:no><lift:embed
>>> what="/templates/client_chooser.html"/><client:no>
>>> </lift:MaybeClient>
>>>
>>>
>>>
>>> >
>>> > Thanks.
>>> >
>>> >
>>> >
>>> > >
>>> >
>>>
>>>
>>> --
>>> Lift, the simply functional web framework http://liftweb.net
>>> Beginning Scala http://www.apress.com/book/view/1430219890
>>> Follow me: http://twitter.com/dpp
>>> Git some: http://github.com/dpp
>>>
>>>
>>>
>>>
>>>
>>
>>
>> --
>> Lift, the simply functional web framework http://liftweb.net
>> Beginning Scala http://www.apress.com/book/view/1430219890
>> Follow me: http://twitter.com/dpp
>> Git some: http://github.com/dpp
>>
>>
>>
>
> >
>
--
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Lift" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---