public function getCMSFields()
    {
        $fields = parent::getCMSFields();
        $cssFiles = new UploadField('CustomCSSFiles', _t('UserTemplatesExtension.CustomCSSFiles', "Custom CSS Files"));
        $jsFiles = new UploadField('CustomJSFiles', _t('UserTemplatesExtension.CustomJSFiles', "Custom JS Files"));
        $cssFiles->setFolderName(self::$css_folder);
        $jsFiles->setFolderName(self::$js_folder);
        $fields->removeByName('CustomCSSFiles');
        $fields->removeByName('CustomJSFiles');
        $templates = $this->fileBasedTemplates();
        if (count($templates)) {
            $fields->addFieldToTab('Root.Main', $dd = new DropdownField('ContentFile', _t('UserTemplatesExtension.CONTENT_FILE', 'File containing template'), $templates));
            $dd->setRightTitle('If selected, any Content set above will be ignored');
        } else {
            $fields->removeByName('ContentFile');
        }
        $fields->push($strict = CheckboxField::create('StrictActions', _t('UserTemplates.STRICT_ACTIONS', 'Require actions to be explicitly overridden')));
        $text = <<<DOC
   When applied to a page type that has sub-actions, an action template will be used ONLY if the action is listed below, and this main
\t   template will only be used for the 'index' action. If this is not checked, then this template will be used for ALL actions
\t   in the page it is applied to.
DOC;
        $strict->setRightTitle(_t('UserTemplates.STRICT_HELP', $text));
        $templates = DataList::create('UserTemplate')->filter(array('ID:not' => $this->ID));
        if ($templates->count()) {
            $templates = $templates->map();
            $fields->addFieldToTab('Root.Main', $kv = new KeyValueField('ActionTemplates', _t('UserTemplates.ACTION_TEMPLATES', 'Action specific templates'), array(), $templates));
            $kv->setRightTitle(_t('UserTemplates.ACTION_TEMPLATES_HELP', 'Specify an action name and select another user defined template to handle a specific action. Only used for Layout templates'));
        }
        $fields->addFieldToTab('Root.Main', $cssFiles);
        $fields->addFieldToTab('Root.Main', $jsFiles);
        return $fields;
    }
 public function updateFields($fields)
 {
     $types = $this->allowedItems();
     $fields->replaceField('ItemType', DropdownField::create('ItemType', 'Items of type', $types)->setEmptyString('--select type--'));
     if ($this->ItemType) {
         $list = $this->getFilteredItemList(false);
         $dummy = $list->first();
         if (!$dummy) {
             $dummy = singleton($this->ItemType);
         }
         $dbFields = $dummy->db();
         $dbFields = array_combine(array_keys($dbFields), array_keys($dbFields));
         $typeFields = array('ID' => 'ID', 'LastEdited' => 'LastEdited', 'Created' => 'Created');
         $additional = $dummy->summaryFields();
         $hasOnes = $dummy->has_one();
         foreach ($hasOnes as $relName => $relType) {
             $dbFields[$relName . 'ID'] = $relName . 'ID';
         }
         // $hasOnes,
         $dbFields = array_merge($typeFields, $dbFields);
         //, $additional);
         $fields->replaceField('Filter', KeyValueField::create('Filter', 'Filter by', $dbFields));
         $fields->replaceField('Include', KeyValueField::create('Include', 'Include where', $dbFields));
         $displayAble = array_merge($dbFields, $additional);
         $fields->replaceField('DataFields', KeyValueField::create('DataFields', 'Fields in table', $displayAble));
         $fields->replaceField('FieldFormatting', KeyValueField::create('FieldFormatting', 'Formatting for fields', $displayAble));
         $fields->replaceField('SortBy', KeyValueField::create('SortBy', 'Sorting', $dbFields, array('ASC' => 'ASC', 'DESC' => 'DESC')));
     }
 }
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     $fields->addFieldToTab('Root.MicroBlog', MultiValueTextField::create('ShowTaggedWith', _t('MicroBlog.SHOW_POSTS_TAGGED', 'Show posts with these tags')));
     $fields->addFieldToTab('Root.MicroBlog', MultiValueTextField::create('AddTags', _t('MicroBlog.ADD_TAGS', 'Add the following tags to posts')));
     $fields->addFieldToTab('Root.MicroBlog', $cb = CheckboxField::create('SelfTagPosts', _t('MicroBlog.SELF_TAG', 'Tag posts against this page')));
     $cb->setDescription('Self-tagging will mean posts added via this page will not appear on other microblog pages, but may still appear in global timelines');
     $defaults = Config::inst()->get('TimelineController', 'options');
     $options = array_combine(array_keys($defaults), array_keys($defaults));
     $values = array('1' => 'Enabled', '0' => 'Disabled');
     $custom = $this->CustomOptions->getValues();
     if (!$custom || !count($custom)) {
         $this->CustomOptions = $defaults;
     }
     $fields->addFieldToTab('Root.MicroBlog', KeyValueField::create('CustomOptions', _t('MicroBlog.CUSTOM_OPTIONS', 'Options'), $options, $values));
     return $fields;
 }
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     $available_classes = ClassInfo::subclassesFor("BuildTask");
     array_shift($available_classes);
     ksort($available_classes);
     $available_jobtypes = array(QueuedJob::IMMEDIATE => "Small", QueuedJob::QUEUED => "Medium", QueuedJob::LARGE => "Large");
     $fields->removeByName(array("ExecuteInterval", "ExecuteEvery", "ExecuteFree", "ScheduledJobID"));
     $fields->addFieldsToTab('Root.Main', array(DropdownField::create("BuildTaskClass", "Build Task", $available_classes), KeyValueField::create("RequestVariables", "Request Variables")->setDescription("Optional"), $dt = new Datetimefield('FirstExecution', _t('ScheduledExecution.FIRST_EXECUTION', 'First Execution')), FieldGroup::create(new NumericField('ExecuteInterval', ''), new DropdownField('ExecuteEvery', '', array('' => '', 'Minute' => _t('ScheduledExecution.ExecuteEveryMinute', 'Minute'), 'Hour' => _t('ScheduledExecution.ExecuteEveryHour', 'Hour'), 'Day' => _t('ScheduledExecution.ExecuteEveryDay', 'Day'), 'Week' => _t('ScheduledExecution.ExecuteEveryWeek', 'Week'), 'Fortnight' => _t('ScheduledExecution.ExecuteEveryFortnight', 'Fortnight'), 'Month' => _t('ScheduledExecution.ExecuteEveryMonth', 'Month'), 'Year' => _t('ScheduledExecution.ExecuteEveryYear', 'Year'))))->setTitle(_t('ScheduledExecution.EXECUTE_EVERY', 'Execute every')), DropdownField::create("JobType", "Job Type", $available_jobtypes)));
     if ($this->ScheduledJobID) {
         $jobTime = $this->getNextRunDate();
         $fields->addFieldsToTab('Root.Schedule', array(new ReadonlyField('NextRunDate', _t('ScheduledExecution.NEXT_RUN_DATE', 'Next run date'), $jobTime)));
     }
     $dt->getDateField()->setConfig('showcalendar', true);
     $dt->getTimeField()->setConfig('showdropdown', true);
     return $fields;
 }
 /**
  * @return FieldSet
  */
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     /* @var FieldSet $fields */
     $fields->replaceField('Content', new HtmlEditorField('Content', _t('ListingPage.CONTENT', 'Content (enter $Listing to display the listing)')));
     $templates = DataObject::get('ListingTemplate');
     if ($templates) {
         $templates = $templates->map();
     } else {
         $templates = array();
     }
     $fields->addFieldToTab('Root.ListingSettings', new DropdownField('ListingTemplateID', _t('ListingPage.CONTENT_TEMPLATE', 'Listing Template'), $templates));
     $fields->addFieldToTab('Root.ListingSettings', new NumericField('PerPage', _t('ListingPage.PER_PAGE', 'Items Per Page')));
     $fields->addFieldToTab('Root.ListingSettings', new DropdownField('SortDir', _t('ListingPage.SORT_DIR', 'Sort Direction'), $this->dbObject('SortDir')->enumValues()));
     $listType = $this->ListType ? $this->ListType : 'Page';
     $objFields = $this->getSelectableFields($listType);
     $fields->addFieldToTab('Root.ListingSettings', new DropdownField('SortBy', _t('ListingPage.SORT_BY', 'Sort By'), $objFields));
     // $fields->addFieldToTab('Root.Content.Main', new TextField('CustomSort', _t('ListingPage.CUSTOM_SORT', 'Custom sort field')));
     $types = ClassInfo::subclassesFor('DataObject');
     array_shift($types);
     $source = array_combine($types, $types);
     asort($source);
     $optionsetField = new DropdownField('ListType', _t('ListingPage.PAGE_TYPE', 'List items of type'), $source, 'Any');
     $fields->addFieldToTab('Root.ListingSettings', $optionsetField);
     $fields->addFieldToTab('Root.ListingSettings', new CheckboxField('StrictType', _t('ListingPage.STRICT_TYPE', 'List JUST this type, not descendents')));
     $sourceType = $this->effectiveSourceType();
     $parentType = $this->parentType($sourceType);
     if ($sourceType && $parentType) {
         $fields->addFieldToTab('Root.ListingSettings', new DropdownField('Depth', _t('ListingPage.DEPTH', 'Depth'), array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5)));
         $fields->addFieldToTab('Root.ListingSettings', new TreeDropdownField('ListingSourceID', _t('ListingPage.LISTING_SOURCE', 'Source of content for listing'), $parentType));
         $fields->addFieldToTab('Root.ListingSettings', new CheckboxField('ClearSource', _t('ListingPage.CLEAR_SOURCE', 'Clear listing source value')));
     }
     $contentTypes = array('' => 'In Theme', 'text/html; charset=utf-8' => 'HTML Fragment', 'text/xml; charset=utf-8' => 'XML', 'application/rss+xml; charset=utf-8' => 'RSS (xml)', 'application/rdf+xml; charset=utf-8' => 'RDF (xml)', 'application/atom+xml; charset=utf-8' => 'ATOM (xml)');
     $fields->addFieldToTab('Root.ListingSettings', new DropdownField('ContentType', _t('ListingPage.CONTENT_TYPE', 'Content Type'), $contentTypes));
     $fields->addFieldToTab('Root.ListingSettings', new TextField('CustomContentType', _t('ListingPage.CUSTOM_CONTENT_TYPE', 'Custom Content Type')));
     if ($this->ListType) {
         $componentsManyMany = singleton($this->ListType)->config()->many_many;
         if (!is_array($componentsManyMany)) {
             $componentsManyMany = array();
         }
         $componentNames = array();
         foreach ($componentsManyMany as $componentName => $className) {
             $componentNames[$componentName] = FormField::name_to_label($componentName) . ' (' . $className . ')';
         }
         $fields->addFieldToTab('Root.ListingSettings', DropdownField::create('ComponentFilterName', _t('ListingPage.RELATION_COMPONENT_NAME', 'Filter by Relation'), $componentNames)->setEmptyString('(Select)')->setRightTitle('Will cause this page to list items based on the last URL part. (ie. ' . $this->AbsoluteLink() . '{$componentFieldName})'));
         $fields->addFieldToTab('Root.ListingSettings', $componentColumnField = DropdownField::create('ComponentFilterColumn', 'Filter by Relation Field')->setEmptyString('(Must select a relation and save)'));
         $fields->addFieldToTab('Root.ListingSettings', $componentListingField = DropdownField::create('ComponentListingTemplateID', _t('ListingPage.COMPONENT_CONTENT_TEMPLATE', 'Relation Listing Template'))->setEmptyString('(Must select a relation and save)'));
         if ($this->ComponentFilterName) {
             $componentClass = isset($componentsManyMany[$this->ComponentFilterName]) ? $componentsManyMany[$this->ComponentFilterName] : '';
             if ($componentClass) {
                 $componentFields = array();
                 foreach ($this->getSelectableFields($componentClass) as $columnName => $type) {
                     $componentFields[$columnName] = $columnName;
                 }
                 $componentColumnField->setSource($componentFields);
                 $componentColumnField->setEmptyString('(Select)');
                 $componentListingField->setSource($templates);
                 $componentListingField->setHasEmptyDefault(false);
                 if (class_exists('KeyValueField')) {
                     $fields->addFieldToTab('Root.ListingSettings', KeyValueField::create('ComponentFilterWhere', 'Constrain Relation By', $componentFields)->setRightTitle("Filter '{$this->ComponentFilterName}' with these properties."));
                 }
             }
         }
     }
     return $fields;
 }
 public function getCMSFields()
 {
     $fields = parent::getCMSFields();
     Requirements::css(EXTENSIBLE_SEARCH_PATH . '/css/extensible-search.css');
     // Restrict the search suggestion approval appropriately.
     $user = Member::currentUserID();
     if (Permission::checkMember($user, 'EXTENSIBLE_SEARCH_SUGGESTIONS')) {
         Requirements::javascript(EXTENSIBLE_SEARCH_PATH . '/javascript/extensible-search-approval.js');
     }
     // Determine if full text search is enabled.
     $engines = array('' => '');
     $searchable = Config::inst()->get('FulltextSearchable', 'searchable_classes');
     if (is_array($searchable) && count($searchable) > 0) {
         $engines['Full-Text'] = 'Full-Text';
     }
     // Retrieve a list of search engine extensions currently applied that end with 'Search'.
     $extensions = $this->get_extensions(get_class());
     foreach ($extensions as $extension) {
         $reversed = strrev($extension);
         if (strpos($reversed, strrev('Search')) === 0) {
             $engine = strrev(substr($reversed, 6));
             $engines[$engine] = $engine;
         }
     }
     // Allow selection of the search engine extension to use.
     $fields->addFieldToTab('Root.Main', new DropdownField('SearchEngine', 'Search Engine', $engines), 'Content');
     // Make sure a search engine is being used before allowing customisation.
     if ($this->SearchEngine) {
         // Construct the support array to determine the CMS customisation available to the current search engine/wrapper.
         $support = self::$support;
         if ($this->SearchEngine !== 'Full-Text' && $this->extension_instances) {
             $engine = "{$this->SearchEngine}Search";
             foreach ($this->extension_instances as $instance) {
                 if (get_class($instance) === $engine) {
                     $instance->setOwner($this);
                     if (isset($instance::$support)) {
                         $support = array_merge($support, $instance::$support);
                     }
                     $instance->clearOwner();
                     break;
                 }
             }
         }
         // Use the support array to determine the CMS customisation available to the current search engine/wrapper.
         if ($support['StartWithListing']) {
             $fields->addFieldToTab('Root.Main', new CheckboxField('StartWithListing', _t('ExtensibleSearchPage.START_LISTING', 'Display initial listing - useful for filterable "data type" lists')), 'Content');
         }
         if (class_exists('ListingTemplate') && $support['ListingTemplateID']) {
             $templates = DataObject::get('ListingTemplate');
             if ($templates) {
                 $templates = $templates->map();
             } else {
                 $templates = array();
             }
             $label = _t('ExtensibleSearchPage.CONTENT_TEMPLATE', 'Listing Template - if not set, theme template will be used');
             $fields->addFieldToTab('Root.Main', $template = DropdownField::create('ListingTemplateID', $label, $templates, '', null)->setEmptyString('(results template)'), 'Content');
             $template->setEmptyString('(results template)');
         }
         if ($support['ResultsPerPage']) {
             $perPage = array('5' => '5', '10' => '10', '15' => '15', '20' => '20');
             $fields->addFieldToTab('Root.Main', new DropdownField('ResultsPerPage', _t('ExtensibleSearchPage.RESULTS_PER_PAGE', 'Results per page'), $perPage), 'Content');
         }
         if ($support['SearchTrees']) {
             $fields->addFieldToTab('Root.Main', new TreeMultiselectField('SearchTrees', 'Restrict results to these subtrees', 'Page'), 'Content');
         }
         if (!$this->SortBy) {
             $this->SortBy = 'Created';
         }
         $objFields = $this->getSelectableFields();
         if ($support['SortBy']) {
             $sortFields = $objFields;
             // Remove content and groups from being sortable (as they are not relevant).
             unset($sortFields['Content']);
             unset($sortFields['Groups']);
             $fields->addFieldToTab('Root.Main', new DropdownField('SortBy', _t('ExtensibleSearchPage.SORT_BY', 'Sort By'), $sortFields), 'Content');
         }
         if ($support['SortDir']) {
             $fields->addFieldToTab('Root.Main', new DropdownField('SortDir', _t('ExtensibleSearchPage.SORT_DIR', 'Sort Direction'), $this->dbObject('SortDir')->enumValues()), 'Content');
         }
         $types = SiteTree::page_type_classes();
         $source = array_combine($types, $types);
         if ($this->SearchEngine !== 'Full-Text' && $this->extension_instances) {
             $engine = "{$this->SearchEngine}Search";
             foreach ($this->extension_instances as $instance) {
                 if (get_class($instance) === $engine) {
                     $instance->setOwner($this);
                     // Trigger the following methods on the current search engine extension.
                     if (method_exists($instance, 'updateSource')) {
                         // add in any explicitly configured
                         asort($source);
                         $instance->updateSource($source);
                     }
                     if (method_exists($instance, 'getQueryBuilders') && $support['QueryType']) {
                         $parsers = $instance->getQueryBuilders();
                         $options = array();
                         foreach ($parsers as $key => $objCls) {
                             $obj = new $objCls();
                             $options[$key] = $obj->title;
                         }
                         $fields->addFieldToTab('Root.Main', new DropdownField('QueryType', _t('ExtensibleSearchPage.QUERY_TYPE', 'Query Type'), $options), 'Content');
                     }
                     $instance->clearOwner();
                     break;
                 }
             }
         }
         if ($support['SearchType']) {
             ksort($source);
             $source = array_merge($source, self::$additional_search_types);
             $types = new MultiValueDropdownField('SearchType', _t('ExtensibleSearchPage.SEARCH_ITEM_TYPE', 'Search items of type'), $source);
             $fields->addFieldToTab('Root.Main', $types, 'Content');
         }
         if ($support['SearchOnFields']) {
             $fields->addFieldToTab('Root.Main', new MultiValueDropdownField('SearchOnFields', _t('ExtensibleSearchPage.INCLUDE_FIELDS', 'Search On Fields'), $objFields), 'Content');
         }
         $boostVals = array();
         for ($i = 1; $i <= 5; $i++) {
             $boostVals[$i] = $i;
         }
         if ($support['BoostFields']) {
             $fields->addFieldToTab('Root.Main', new KeyValueField('BoostFields', _t('ExtensibleSearchPage.BOOST_FIELDS', 'Boost values'), $objFields, $boostVals), 'Content');
         }
         if ($support['BoostMatchFields']) {
             $fields->addFieldToTab('Root.Main', $f = new KeyValueField('BoostMatchFields', _t('ExtensibleSearchPage.BOOST_MATCH_FIELDS', 'Boost fields with field/value matches'), array(), $boostVals), 'Content');
             $f->setRightTitle('Enter a field name, followed by the value to boost if found in the result set, eg "title:Home" ');
         }
         if ($support['FilterFields']) {
             $fields->addFieldToTab('Root.Main', $kv = new KeyValueField('FilterFields', _t('ExtensibleSearchPage.FILTER_FIELDS', 'Fields to filter by')), 'Content');
         }
         if ($this->SearchEngine !== 'Full-Text') {
             $fields->addFieldToTab('Root.Main', new HeaderField('FacetHeader', _t('ExtensibleSearchPage.FACET_HEADER', 'Facet Settings')), 'Content');
         }
         if ($support['FacetFields']) {
             $fields->addFieldToTab('Root.Main', new MultiValueDropdownField('FacetFields', _t('ExtensibleSearchPage.FACET_FIELDS', 'Fields to create facets for'), $objFields), 'Content');
         }
         if ($support['CustomFacetFields']) {
             $fields->addFieldToTab('Root.Main', new MultiValueTextField('CustomFacetFields', _t('ExtensibleSearchPage.CUSTOM_FACET_FIELDS', 'Additional fields to create facets for')), 'Content');
         }
         if ($support['FacetMapping']) {
             $facetMappingFields = $objFields;
             if ($this->CustomFacetFields && ($cff = $this->CustomFacetFields->getValues())) {
                 foreach ($cff as $facetField) {
                     $facetMappingFields[$facetField] = $facetField;
                 }
             }
             $fields->addFieldToTab('Root.Main', new KeyValueField('FacetMapping', _t('ExtensibleSearchPage.FACET_MAPPING', 'Mapping of facet title to nice title'), $facetMappingFields), 'Content');
         }
         if ($support['FacetQueries']) {
             $fields->addFieldToTab('Root.Main', new KeyValueField('FacetQueries', _t('ExtensibleSearchPage.FACET_QUERIES', 'Fields to create query facets for')), 'Content');
         }
         if ($support['MinFacetCount']) {
             $fields->addFieldToTab('Root.Main', new NumericField('MinFacetCount', _t('ExtensibleSearchPage.MIN_FACET_COUNT', 'Minimum facet count for inclusion in facet results'), 2), 'Content');
         }
         $this->extend('updateExtensibleSearchPageCMSFields', $fields);
     } else {
         $fields->addFieldToTab('Root.Main', LiteralField::create('SearchEngineNotification', "<p class='extensible-search notification'><strong>Select a Search Engine</strong></p>"), 'Title');
     }
     // Retrieve the extensible search analytics, when enabled.
     if (Config::inst()->get('ExtensibleSearch', 'enable_analytics')) {
         // Retrieve the search analytics.
         $history = $this->History();
         $query = new SQLQuery("Term, COUNT(*) AS Frequency, ((COUNT(*) * 100.00) / {$history->count()}) AS FrequencyPercentage, AVG(Time) AS AverageTimeTaken, (Results > 0) AS Results", 'ExtensibleSearch', "ExtensibleSearchPageID = {$this->ID}", array('Frequency' => 'DESC', 'Term' => 'ASC'), 'Term');
         $analytics = ArrayList::create();
         foreach ($query->execute() as $result) {
             $result = ArrayData::create($result);
             $result->FrequencyPercentage = sprintf('%.2f %%', $result->FrequencyPercentage);
             $result->AverageTimeTaken = sprintf('%.5f', $result->AverageTimeTaken);
             $result->Results = $result->Results ? 'true' : 'false';
             $analytics->push($result);
         }
         // Instantiate the search analytic summary display.
         $fields->addFieldToTab('Root.SearchAnalytics', $summary = GridField::create('Summary', 'Summary', $analytics)->setModelClass('ExtensibleSearch'));
         $summaryConfiguration = $summary->getConfig();
         $summaryConfiguration->removeComponentsByType('GridFieldFilterHeader');
         $summaryConfiguration->addComponent($summaryExport = new GridFieldExportButton());
         $summaryConfiguration->getComponentByType('GridFieldSortableHeader')->setFieldSorting(array('FrequencyPercentage' => 'Frequency'));
         // Update the export fields, since we're not using a data list.
         $summaryDisplay = array('Term' => 'Search Term', 'Frequency' => 'Frequency', 'FrequencyPercentage' => 'Frequency %', 'AverageTimeTaken' => 'Average Time Taken (s)', 'Results' => 'Has Results?');
         $summaryExport->setExportColumns($summaryDisplay);
         // Update the summary fields.
         $summaryConfiguration->getComponentByType('GridFieldDataColumns')->setDisplayFields($summaryDisplay);
         // Instantiate the search analytic history display.
         $fields->addFieldToTab('Root.SearchAnalytics', $history = GridField::create('History', 'History', $history)->setModelClass('ExtensibleSearch'));
         $historyConfiguration = $history->getConfig();
         $historyConfiguration->removeComponentsByType('GridFieldFilterHeader');
         $historyConfiguration->addComponent($historyExport = new GridFieldExportButton());
         // Update the custom summary fields to be sortable.
         $historyConfiguration->getComponentByType('GridFieldSortableHeader')->setFieldSorting(array('TimeSummary' => 'Created', 'TimeTakenSummary' => 'Time'));
     }
     // Retrieve the extensible search suggestions, when enabled.
     if (Config::inst()->get('ExtensibleSearchSuggestion', 'enable_suggestions')) {
         // Instantiate the search suggestion display.
         $fields->addFieldToTab('Root.SearchSuggestions', GridField::create('Suggestions', 'Suggestions', $this->Suggestions(), $suggestionsConfiguration = GridFieldConfig_RecordEditor::create())->setModelClass('ExtensibleSearchSuggestion'));
         $suggestionsConfiguration->removeComponentsByType('GridFieldFilterHeader');
         // Update the custom summary fields to be sortable.
         $suggestionsConfiguration->getComponentByType('GridFieldSortableHeader')->setFieldSorting(array('FrequencySummary' => 'Frequency', 'FrequencyPercentage' => 'Frequency', 'ApprovedField' => 'Approved'));
     }
     return $fields;
 }
Example #7
0
 public function updateExtensibleSearchPageCMSFields(FieldList $fields)
 {
     if ($this->owner->SearchEngine === get_class($this)) {
         $types = SiteTree::page_type_classes();
         $source = array_combine($types, $types);
         // add in any explicitly configured
         asort($source);
         $source = $this->owner->updateSource($source);
         $parsers = $this->owner->getQueryBuilders();
         $options = array();
         foreach ($parsers as $key => $objCls) {
             $obj = new $objCls();
             $options[$key] = $obj->title;
         }
         $fields->addFieldToTab('Root.Main', new DropdownField('QueryType', _t('ExtensibleSearchPage.QUERY_TYPE', 'Query Type'), $options), 'Content');
         ksort($source);
         $source = array_merge($source, ExtensibleSearchPage::config()->additional_search_types);
         $types = MultiValueDropdownField::create('SearchType', _t('ExtensibleSearchPage.SEARCH_ITEM_TYPE', 'Search items of type'), $source);
         $fields->addFieldToTab('Root.Main', $types, 'Content');
         $objFields = $this->owner->getSelectableFields();
         $sortFields = $objFields;
         // Remove content and groups from being sortable (as they are not relevant).
         unset($sortFields['Content']);
         unset($sortFields['Groups']);
         $fields->replaceField('SortBy', new DropdownField('SortBy', _t('ExtensibleSearchPage.SORT_BY', 'Sort By'), $sortFields));
         $fields->addFieldToTab('Root.Main', MultiValueDropdownField::create('SearchOnFields', _t('ExtensibleSearchPage.INCLUDE_FIELDS', 'Search On Fields'), $objFields), 'Content');
         $fields->addFieldToTab('Root.Main', MultiValueTextField::create('ExtraSearchFields', _t('SolrSearch.EXTRA_FIELDS', 'Custom solr fields to search')), 'Content');
         $boostVals = array();
         for ($i = 1; $i <= static::BOOST_MAX; $i++) {
             $boostVals[$i] = $i;
         }
         $fields->addFieldToTab('Root.Main', new KeyValueField('BoostFields', _t('ExtensibleSearchPage.BOOST_FIELDS', 'Boost values'), $objFields, $boostVals), 'Content');
         $fields->addFieldToTab('Root.Main', $f = new KeyValueField('BoostMatchFields', _t('ExtensibleSearchPage.BOOST_MATCH_FIELDS', 'Boost fields with field/value matches'), array(), $boostVals), 'Content');
         $f->setRightTitle('Enter a field name, followed by the value to boost if found in the result set, eg "title:Home" ');
         $fields->addFieldToTab('Root.Main', $kv = new KeyValueField('FilterFields', _t('ExtensibleSearchPage.FILTER_FIELDS', 'Fields to filter by')), 'Content');
         $fields->addFieldToTab('Root.Main', new HeaderField('FacetHeader', _t('ExtensibleSearchPage.FACET_HEADER', 'Facet Settings')), 'Content');
         $fields->addFieldToTab('Root.Main', new MultiValueDropdownField('FacetFields', _t('ExtensibleSearchPage.FACET_FIELDS', 'Fields to create facets for'), $objFields), 'Content');
         $fields->addFieldToTab('Root.Main', new MultiValueTextField('CustomFacetFields', _t('ExtensibleSearchPage.CUSTOM_FACET_FIELDS', 'Additional fields to create facets for')), 'Content');
         $facetMappingFields = $objFields;
         if ($this->owner->CustomFacetFields && ($cff = $this->owner->CustomFacetFields->getValues())) {
             foreach ($cff as $facetField) {
                 $facetMappingFields[$facetField] = $facetField;
             }
         }
         $fields->addFieldToTab('Root.Main', new KeyValueField('FacetMapping', _t('ExtensibleSearchPage.FACET_MAPPING', 'Mapping of facet title to nice title'), $facetMappingFields), 'Content');
         $fields->addFieldToTab('Root.Main', new KeyValueField('FacetQueries', _t('ExtensibleSearchPage.FACET_QUERIES', 'Fields to create query facets for')), 'Content');
         $fields->addFieldToTab('Root.Main', new NumericField('MinFacetCount', _t('ExtensibleSearchPage.MIN_FACET_COUNT', 'Minimum facet count for inclusion in facet results'), 2), 'Content');
     }
     // Make sure previously existing hooks are carried across.
     $this->owner->extend('updateSolrCMSFields', $fields);
 }