Silverstripe - Общая форма поиска не работает на странице безопасности / входа - PullRequest
0 голосов
/ 28 мая 2011

Я определил форму поиска в файле Page.php.

функция AdvancedSearchForm () {$ searchText = isset ($ this-> Query)?$ this-> Query: 'Search';$ searchText2 = isset ($ this-> Subquery)?$ this-> Подзапрос: '0';$ searchText3 = isset ($ this-> documentType)?$ this-> documentType: 'All';

$searchSections = DataObject::get('SearchSection');
$ss = array();
foreach ($searchSections as $section) {
    $ss[$section->ID] = $section->Name;
}

$fileTypes = DataObject::get('FileType');
$ft = array();
foreach ($fileTypes as $type) {
    $ft[$type->ID] = $type->Name;
}
$ft[0] = 'All';
ksort($ft);

$fields = new FieldSet(
    new TextField('Query','Keywords', $searchText),
    new DropdownField('Subquery', '', $ss, $searchText2),
    new DropdownField('documentType', '', $ft, $searchText3)
);
$actions = new FieldSet(
    new FormAction('AdvancedSearchResults', 'Search')
);
$form = new Form($this->owner, 'AdvancedSearchForm', $fields, $actions);
$form->setFormMethod('GET');
$form->setTemplate('Includes/SearchForm');
$form->disableSecurityToken();

return $form;

}

, и все мои страницы расширены со страницы, и форма поиска находится в заголовке, поэтому появляется на всех страницах.Но когда пользователь находится на странице безопасности / входа в систему и пытается что-то найти, он получает следующее сообщение об ошибке

The action 'AdvancedSearchForm' does not exist in class Security

Я предполагаю, что причиной этого является то, что страница безопасности не расширена со страницы.Как настроить поиск так, чтобы он работал на любой странице, включая системные страницы, например страницу входа в систему безопасности?

1 Ответ

2 голосов
/ 31 мая 2011

Вы получаете сообщение об ошибке, потому что форма не передается нужному контроллеру (~ Page_Controller).

Когда вы определяете объект Form, вы должны проверить $ this-> owner и посмотреть, является ли он потомком Page_Controller. Если нет, вы можете использовать что-то вроде этого и использовать $ controller в качестве первой переменной при создании объекта Form.

$sitetree_object = SiteTree::get_by_link('some-page-url');
$controller = ModelAsController::controller_for($sitetree_object);
...