Jump to:

23486 Posts in 18995 Topics by 2878 members

General Questions

SilverStripe Forums » General Questions » Search Results Page Problem

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

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

Page: 1
Go to End
Author Topic: 1230 Views
  • timcole
    Avatar
    Community Member
    32 Posts

    Search Results Page Problem Link to this post

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

  • timcole
    Avatar
    Community Member
    32 Posts

    Re: Search Results Page Problem Link to this post

    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

    1230 Views
Page: 1
Go to Top

Want to know more about the company that brought you SilverStripe? Then check out SilverStripe.com

Comments on this website? Please give feedback.