XForms/Search Form
Motivation
editYou want to create a search form that uses a single input text field and submits a search request to a search service on a remote web server.
Discussion
editWe are all familiar with the simple front end to search engines like Google that display a simple search field. There are two simple features we will demonstrate in the first version. 1) The input cursor will be positioned in the search field when the form loads. When you press the "Enter" key the search will automatically be executed.
We will also discuss a way to have a single form display both simple search and complex search functions.
Method
editWe will first create a simple search input field and give it an id of "search-field". We will also add an action to the input that will fire off the submission when the Enter key is pressed.
<xf:input ref="q" id="search-field">
<xf:label>Search string:</xf:label>
<xf:action ev:event="DOMActivate">
<xf:send submission="search"/>
</xf:action>
</xf:input>
In this example, q is a reference to the query string we will be sending to the remote server.
From the prior example we learned that you can have the cursor automatically positioned in the search field when the form loads by adding the following action added to your model:
<xf:model>
...
<xf:action ev:event="xforms-ready">
<xf:setfocus control="search-field"/>
</xf:action>
...
</xf:model>
Screen Image
editLink to XForms Application
editSample Program
editIn this example we will create a simple front end to Google's search engine. The format of the REST API for the Google search engine is the following:
http://www.google.com/search?hl=en&q=XForms
In this REST query the parameters are:
- hl = language (en for English)
- q = search query string
We can create an instance that has these parameters in our model:
<xf:instance xmlns="">
<data>
<hl>en</hl>
<q></q>
</data>
</xf:instance>
Full Program Listing
edit<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xf="http://www.w3.org/2002/xforms"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ev="http://www.w3.org/2001/xml-events" >
<head>
<title>Google Search Example</title>
<style type="text/css">
body {font-family: Helvetica, sans-serif}
</style>
<xf:model>
<xf:instance xmlns="" id ="search-params">
<data>
<hl>en</hl>
<q></q>
</data>
</xf:instance>
<!-- Send the search parameters to the Google search engine and replace this entire form with the results -->
<xf:submission id="search-google" method="get"
action="http://www.google.com/search" replace="all"
separator="&"/>
<!-- put the cursor in the first field when the form becomes ready -->
<xf:action ev:event="xforms-ready">
<xf:setfocus control="search-field"/>
</xf:action>
</xf:model>
</head>
<body>
<h1>Google Search Example</h1>
<xf:input ref="instance('search-params')/q" id="search-field">
<xf:label>Search string:</xf:label>
<xf:action ev:event="DOMActivate">
<xf:send submission="search-google"/>
</xf:action>
</xf:input>
<xf:submit submission="search-google">
<xf:label>Search</xf:label>
</xf:submit>
</body>
</html>
Discussion
editYou can also send over a dozen other parameters to the Google search service. For example if you want to restrict the search results to a specific web site or sub-site you can just add an additional "site" parameter that restricts search results to that site. For example the following URL will restrict the search results to pages on this wikibook:
http://www.google.com/search?hl=en&q=xforms+site%3Ahttp%3A%2F%2Fen.wikibooks.org%2Fwiki%2FXForms
Note that because forward slashes are part of the search query they are replaced with a %2F string.
The OpenSearch XML standard may also be of interest. This standard allows any search service to specify the parameters to a search engine and how the data is returned to a search client.