Skip to main content

This site requires you to update your browser. Your browsing experience maybe affected by not having the most up to date version.

General Questions /

General questions about getting started with SilverStripe that don't fit in any of the categories above.

Moderators: martimiz, Sean, biapar, Willr, Ingo, swaiba

Search Results Page Problem


Go to End
Reply


2 Posts   1441 Views

Avatar
timcole

Community Member, 32 Posts

5 March 2010 at 5:03am

I have a project with a song library... a song dataobject and two related data objects, theme and subtheme. I've created a search form where the user can search using a combination of text boxes and drop downs and limited it to showing 10 songs per page. The search works - but when you click the link to move to the next page in the set of results it seems to effectively start a "blank" search - i.e. instead of moving to page 2 of results matching the users query it moves to page 2 of a result set that contains every song in the library.

Code for SongSearch_Results.ss below:

<div id="rightcol">
<% include SongLibrarySideSearch %>
$Sidebar
</div><!-- End Right Col Div -->
<div id="leftcol">
<h1>SEARCH RESULTS</h1>
<% if Results %>
		<% if Results.MoreThanOnePage %>
		<p><b>We found over 10 songs matching your search, this is page $Results.CurrentPage of $Results.TotalPages :</b></p>
		<% else %>
		<p><b>We found $Results.Count song(s) matching your search :</b></p>
		<% end_if %>
		<% control Results %>
			<h3>$Title</h3><p><b>Written by: </b>$Author<p><b>Lyrics: </b>$Lyrics.LimitWordCount(30)...</p>
			<p><a href="/song-library/showsong/$ID" class="morebtn" title="$Title"><span class="displace">$Title</span></a>
			<div class="line"></div>
			<div class="clear"></div>
		<% end_control %>
		<p><b>You can <a href="/song-library">click here</a> to start a new search.</b></p>
<% else %>
	<p>Sorry, we couldn't find any songs matching your search. Please <a href="/song-library">click here</a> to try again.</p>
<% end_if %>
 
<% if Results.MoreThanOnePage %>
	<div id="PageNumbers">
		<p>
			<% if Results.NotFirstPage %>
				<a class="prev" href="$Results.PrevLink" title="View the previous page">Prev</a>
			<% end_if %>
		
			<span>
		    		<% control Results.PaginationSummary(4) %>
					<% if CurrentBool %>
						$PageNum
					<% else %>
						<% if Link %>
							<a href="$Link" title="View page number $PageNum">$PageNum</a>
						<% else %>
							&hellip;
						<% end_if %>
					<% end_if %>
				<% end_control %>
			</span>
		
			<% if Results.NotLastPage %>
				<a class="next" href="$Results.NextLink" title="View the next page">Next</a>
			<% end_if %>
		</p>
	</div>
<% end_if %>
</div>
<!-- End Left Col Div --><script type="text/javascript">
	
	jQuery.noConflict();
	
	var IE = /*@cc_on!@*/false;
	
	function setSubThemeMenu() {
		myparam = document.getElementById('Form_SearchForm_SubThemes__Theme__Title').value;
		myparam = myparam.replace(/ /g, "%20");
		jQuery("#dropDownHolder").load("/song-library?theme=" +  myparam + " #SubThemes__Title");
		if (myparam == "") {
			jQuery("#dropDownHolder").load("/song-library #dropDownHolder");
		}
	}
	
	if(IE){
		document.getElementById('Form_SearchForm_SubThemes__Theme__Title').attachEvent('onchange', setSubThemeMenu);
	}else{
		document.getElementById('Form_SearchForm_SubThemes__Theme__Title').addEventListener('change', setSubThemeMenu, false);
	}
	MediaPlayerUnload();

</script>

and code for songlibrary.php (including the search function itself)

class SongLibrary_Controller extends Page_Controller {
	
	public function SearchForm() {
		$context = singleton('Song')->getCustomSearchContext();
		
		$SubThemeList = Dataobject::get("Theme","","Title ASC")->toDropdownMap("Title", "Title"); 
		
		$fields = new FieldSet(
			new TextField("Title", "Song Title"),	
			new TextField("Lyrics", "Lyrics"),	
			new TextField("Author", "Author"),	
			new DropdownField(
				'SubThemes__Theme__Title',
				'Please Select a theme from the list below:',
				$SubThemeList, "", null, "Any Theme"
				),
			new DropdownField(
				'dropDownHolder',
				'Please Select a detail theme from the list below:',
				array(""=>"Any Theme")
				)
			);
	
		//$fields = $context->getSearchFields();
		
		$form = new Form($this, "SearchForm",
			$fields,
			new FieldSet(
				new FormAction('doSearch','SEARCH')
			)
		);
		
		return $form;
	}

public function doSearch($data, $form) {
	
	$context = singleton('Song')->getCustomSearchContext();
	$results = $this->getResults($data);
	return $this->customise(array(
		'Results' => $results
	))->renderWith(array('SongSearch_results', 'Page'));
}
	
	function getResults($searchCriteria = array()) {
	$start = ($this->request->getVar('start')) ? (int)$this->request->getVar('start') : 0;
	$limit = 10;
		
	$context = singleton('Song')->getCustomSearchContext();
	$query = $context->getQuery($searchCriteria, null, array('start'=>$start,'limit'=>$limit));
	$records = $context->getResults($searchCriteria, null, array('start'=>$start,'limit'=>$limit));
	if($records) {
		$records->setPageLimits($start, $limit, $query->unlimitedRowCount());
	}
		
	return $records;
}

	function ThemeSearch () {
	
			$fields = new FieldSet(
			new DropdownField(
				'SubThemes__Theme__Title',
				'Please Select a theme from the list below:',
				Dataobject::get("Theme")->toDropdownMap("Title", "Title")
				)
			);
			$actions = new FieldSet(new FormAction("doSearch", "SHOW"));
			return new Form($this, "ThemeSearch", $fields, $actions);
	}
	
	function SubThemeSearch () {
			
		if (isset($_GET['theme'])) {
			$sql = "Title = '" . $_GET['theme'] . "'";
			$theme = DataObject::get_one("Theme", $sql);
			$sql = "SubTheme.ThemeID = " . $theme->ID;
			$SubThemeList = Dataobject::get("SubTheme",$sql,"Title ASC")->toDropdownMap("Title", "Title"); 
			$fields = new FieldSet(
			new DropdownField(
				'SubThemes__Title',
				'Please Select a theme from the list below:',
				$SubThemeList, " ", null, "Any Theme"
				)
			);
			$actions = new FieldSet(new FormAction("doSearch", "SHOW"));
			return new Form($this, "SubThemeSearch", $fields, $actions);
		}
	}
	
	function SongDetail() { 
		$newID = Director::urlParam("ID");
		if ($newID != "") {
	  	return DataObject::get_one("Song", "ID = $newID");
		}
   } 
	
}

Any help appreciated!!

Avatar
timcole

Community Member, 32 Posts

6 March 2010 at 6:16am

OK, so I found my own answer:

Add $form->setFormMethod('get');
just before return $form; in the songlibrary.php and it works.

Anyone else having trouble with this sort of thing see the following thread:
http://silverstripe.org/general-questions/show/274867