/**
  * Add a site search form to all controllers that links to the
  * results controller.
  * 
  * @return Form
  */
 public function SearchForm()
 {
     // If we have setup objects to search
     if (count(Searchable::getObjects())) {
         $searchText = "";
         if ($this->owner->request && $this->owner->request->getVar('Search')) {
             $searchText = $this->owner->request->getVar('Search');
         }
         $fields = FieldList::create(TextField::create('Search', false, $searchText)->setAttribute("placeholder", _t('Searchable.Search', 'Search')));
         $actions = FieldList::create(FormAction::create('results', _t('Searchable.Go', 'Go')));
         $template_class = Searchable::config()->template_class;
         $results_page = new $template_class();
         $form = Form::create($this->owner, 'SearchForm', $fields, $actions)->setFormMethod('get')->setFormAction($results_page->Link())->disableSecurityToken();
         $this->owner->extend("updateSearchForm", $form);
         return $form;
     }
 }
 /**
  * Return DataList of the results using $_REQUEST to get search info
  * Wraps around {@link searchEngine()}.
  * 
  * Results also checks to see if there is a custom filter set in
  * configuration and adds it.
  * 
  * @param $classname Name of the object we will be filtering
  * @param $columns an array of the column names we will be sorting
  * @param $query the current search query
  * 
  * @return SS_List
  */
 static function Results($classname, $columns, $keywords, $limit = 0)
 {
     $cols_string = implode('","', $columns);
     $custom_filters = Searchable::config()->custom_filters;
     $filter = array();
     foreach ($columns as $col) {
         $filter["{$col}:PartialMatch"] = $keywords;
     }
     $results = $classname::get()->filterAny($filter);
     if (is_array($custom_filters) && array_key_exists($classname, $custom_filters) && is_array($custom_filters[$classname])) {
         $results = $results->filter($custom_filters[$classname]);
     }
     if ($limit) {
         $results = $results->limit($limit);
     }
     foreach ($results as $result) {
         if (!$result->canView() || isset($result->ShowInSearch) && !$result->ShowInSearch) {
             $results->remove($result);
         }
     }
     return $results;
 }
 /**
  * Return DataList of the results using $_REQUEST to get search info
  * Wraps around {@link searchEngine()}.
  *
  * Results also checks to see if there is a custom filter set in
  * configuration and adds it.
  *
  * @param $classname Name of the object we will be filtering
  * @param $columns an array of the column names we will be sorting
  * @param $query the current search query
  *
  * @return SS_List
  */
 public static function Results($classname, $columns, $keywords, $limit = 0)
 {
     $cols_string = implode('","', $columns);
     $custom_filters = Searchable::config()->custom_filters;
     $results = ArrayList::create();
     $filter = array();
     foreach ($columns as $col) {
         $filter["{$col}:PartialMatch"] = $keywords;
     }
     $search = $classname::get()->filterAny($filter);
     if (is_array($custom_filters) && array_key_exists($classname, $custom_filters) && is_array($custom_filters[$classname])) {
         $search = $search->filter($custom_filters[$classname]);
     }
     $searchable = new Searchable();
     if ($searchable->hasMethod('filterResultsByCallback')) {
         $search = $searchable->filterResultsByCallback($search, $classname);
     }
     if ($limit) {
         $search = $search->limit($limit);
     }
     foreach ($search as $result) {
         if ($result->canView() || isset($result->ShowInSearch) && $result->ShowInSearch) {
             $results->add($result);
         }
     }
     return $results;
 }
 public function object()
 {
     $classname = $this->request->param("ID");
     $classes_to_search = Searchable::getObjects();
     foreach ($classes_to_search as $object) {
         if ($object["ClassName"] == $classname) {
             $cols = $object["Columns"];
         }
     }
     $keywords = $this->getQuery();
     $this->customise(array("MetaTitle" => _t('Searchable.SearchResultsFor', "Search Results for '{query}'", 'This is the title used for viewing the results of a search', array('query' => $this->getQuery())), "Results" => PaginatedList::create(Searchable::Results($classname, $cols, $keywords), $this->request)->setPageLength(Searchable::config()->page_length)));
     $this->extend("onBeforeObject");
     return $this->renderWith(array("SearchResults_{$classname}", "SearchResults_object", "SearchResults", "Page"));
 }