ah ha moment.  I switched to using a requestVar that contains my
results list and instead of trying to bind the results to the same
snippet I have a second snippet in the same page (same src file but
diff function) that is able to access the requestVar of results and
bind the values to the tags.

On Jun 1, 11:53 am, Ewan <ehar...@gmail.com> wrote:
> I have a search page that contains a simple form with a single text
> field and submit button.  On submit a search is performed using the
> value from the textfield as a param and the results are displayed.
> Easy so far except that I want to show the same page again i.e
> search.html with no results -> search html with results.  I have
> struggled with this for a while but finally got it working by making
> the snippet a stateful one but I don't really understand why it would
> have to be stateful to work as I don't need to remember the results
> between requests.
>
> Am I going about the the wrong way?  In MVC land we'd show the initial
> search page with an empty results table and on submit pop the results
> into a list and add to the model which would be rendered by jsp tags.
>
> Code below which is not pretty and gets results from a Solr engine as
> xml:
>
> <lift:surround with="default" at="content">
>     <div>
>         <lift:PropertySearch.search form="POST">
>         <div id="search">
>                 <s:searchField/><s:submit/>
>         </div>
>                 <s:theresults>
>                 <table>
>                         
> <thead><td>Id</td><td>Name</td><td>Location</td><td>Homepage</
> td><td>Smoking</td><td>Pets</td></thead>
>                         
> <tbody><result:list><tr><td><r:id/></td><td><r:name/></
> td><td><r:location/></td><td><r:url/></td><td><r:smoking/></
> td><td><r:pets/></td></tr></result:list></tbody>
>                 </table>
>                 </s:theresults>
>
>         </lift:PropertySearch.search>
>     </div>
>
> </lift:surround>
>
> --------------
>
> class PropertySearch extends StatefulSnippet {
>   var searchTxt = ""
>   var results = List[HashMap[String,String]]() ::: Nil
>
>   var dispatch : DispatchIt = {
>       case "search" => search _
>   }
>
>   def search(xhtml: NodeSeq): NodeSeq = {
>     def processSearch() = {
>       results = List[HashMap[String,String]]() ::: Nil
>       Log.info("Running camel route direct:querySolr to find docs")
>           val p = RouteBuilderHelper.getTemplate
>           p.start
>
>           var resp = p.sendBodyAndHeader("direct:querySolr",
> "direct:querySolr", HttpProducer.QUERY, "q=" + searchTxt)
>           val x1 = RouteBuilderHelper.camelResponseToXml(resp)
>
>           Log.info("Received: " + x1)
>           Log.info("resul...@numfound=" + x1 \ "result" \ "@numFound")
>
>           if (hasResult(x1)) {
>             Log.info("found matches")
>             val xmlResults = x1 \ "result"
>             Log.info(xmlResults)
>             for(result <- xmlResults \\ "doc") {
>               val attrMap = new HashMap[String, String]
>               for(str <- result \\ "str") {
>                 val attrName = (str \ "@name").text
>                 val attrVal = str.text
>                 Log.info(attrName + "=" + attrVal)
>                 attrMap += (attrName -> attrVal) // add to map
>               }
>           for(i <- result \\ "int") {
>                 val attrName = (i \ "@name").text
>                 val attrVal = i.text
>                 Log.info(attrName + "=" + attrVal)
>                 attrMap += (attrName -> attrVal) // add to map
>               }
>           for(i <- result \\ "bool") {
>                 val attrName = (i \ "@name").text
>                 val attrVal = i.text
>                 Log.info(attrName + "=" + attrVal)
>                 attrMap += (attrName -> attrVal) // add to map
>               }
>
>           results = results ::: List(attrMap) // add to list
>             }
>           } else {
>             Log.info("No matches")
>           }
>
>       p.stop
>       Log.info("Finished results: " + results)
>     }
>
>     bind("s", xhtml,
>          "searchField" -> SHtml.text(searchTxt, searchTxt = _),
>          "theresults" -> results.flatMap(r => bind("r", chooseTemplate
> ("result","list", xhtml),
>                                                    "id" -> r
> ("id"),
>                                                    "name" -> r
> ("name"),
>                                                    "location" -> r
> ("location"),
>                                                    "url" -> r("url"),
>                                                    "smoking" -> r
> ("smoking"),"pets" -> r("pets")
>          )),
>                   "submit" -> SHtml.submit("Search", processSearch)
>          )
>   }
>
> }
>
>

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

Reply via email to