Jump to:

22983 Posts in 11709 Topics by 2827 members

General Questions

SilverStripe Forums » General Questions » Search Form for certain class

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: 1544 Views
  • Tonyair
    Avatar
    Community Member
    81 Posts

    Search Form for certain class Link to this post

    Hello, in the tutorial 4 described how to create search form, but this is form searches around all DB, i found this recipe:
    http://doc.silverstripe.org/recipes:removingassetsfromsearch?s[]=getsearchquery

    But it looks very dirty and results counting variables are staying the same.

    So after reading silverstripe api, i found out that i can use FulltextSearchable::enable($class_names_array), but after adding it to the mysite/_config.php I got error on http://localhost/stable/dev/build?flush=1:

    Fatal error: Uncaught exception 'Exception' with message 'FulltextSearchable::enable() I don't know the default search columns for class 'Page'' in /home/a2nt/work/www/stable/sapphire/search/FulltextSearchable.php:25 Stack trace: #0 /home/a2nt/work/www/stable/mysite/_config.php(48): FulltextSearchable::enable('Page') #1 /tmp/silverstripe-cache-home-a2nt-work-www-stable/manifest-main(6783): require_once('/home/a2nt/work...') #2 /home/a2nt/work/www/stable/sapphire/core/ManifestBuilder.php(66): require_once('/tmp/silverstri...') #3 /home/a2nt/work/www/stable/sapphire/core/Core.php(205): ManifestBuilder::include_manifest() #4 /home/a2nt/work/www/stable/sapphire/main.php(61): require_once('/home/a2nt/work...') #5 {main} thrown in /home/a2nt/work/www/stable/sapphire/search/FulltextSearchable.php on line 25

    So I added to mysite/code/Page.php

    class Page extends SiteTree {
    ..
       static $indexes = array(
          "SearchFields" => "fulltext (Title, MenuTitle, Content, MetaTitle, MetaDescription, MetaKeywords)",
          "TitleSearchFields" => "fulltext (Title)",
          "Sort" => true,
          "Uniques" => "Unique('URLSegment')",
       );
       static $searchable_fields = array(
          'Title',
          'Content',
       );
    ..

    But still I have that error, also I am interested in creation different types of search forms for example to search only in StaffPage classes.

  • Tonyair
    Avatar
    Community Member
    81 Posts

    Re: Search Form for certain class Link to this post

    Problem partly solved:
    I can search by one field, but i want search with OR-condition by many fields so I tried to write that code:

       static $searchable_fields = array(
          'Query' => array (   
             'Title' => "PartialMatchFilter",
             'Content' => "PartialMatchFilter",
             'MenuTitle' => "PartialMatchFilter",
             'Content' => "PartialMatchFilter",
             'URLSegment' => "PartialMatchFilter"
          )
       );

    but it's not working.
    If I'll write: $context->getResults(array('Content' => $data['Query'],'Title' => $data['Query'])); I'll get search with AND-condition

    Now my code looks like that:

    class Page:

       static $searchable_fields = array(
          
             'Title' => "PartialMatchFilter",
             'Content' => "PartialMatchFilter",
             'MenuTitle' => "PartialMatchFilter",
             'Content' => "PartialMatchFilter",
             'URLSegment' => "PartialMatchFilter"
          
       );
       //Show in search results
       static $summary_fields = array(
          'Title',
          'Menu',
          'Content'
       );

    class Page_Controller:

    public function AdvSearchForm() {
          // Create fields
          $fields = new FieldSet(
             new TextField('Query'),
             new CheckboxSetField( 'Types', 'Search in',
                array(
                   'Page' => 'Pages',
                   'Staff' => 'Staffs',
                   'News' => 'News'
                ), 'Page' )
          );
          // Create actions
          $actions = new FieldSet(
             new FormAction('AdvSearchResults', 'Submit')
          );
          $validator = new RequiredFields('Name','Types');
          return new Form($this, 'AdvSearchForm', $fields, $actions,$validator);
       }

       function AdvSearchResults($data, $form) {
          //$data['Query'];
          
          foreach ($data['Types'] as &$type) {
             switch ($type) {
                case 'Page':
                   $context = singleton($type)->getDefaultSearchContext();
                   $data[$type] = $context->getResults(array('Content' => $data['Query']));
                break;
                case 'Staff':
                break;
                case 'News':
                break;
             }
          }

          return $this->customise($data)->renderWith(array('Page_AdvSearch', 'Page'));
       }

    P.S. Plz, move the topic out from template questions

    1544 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.