Silverstripe - 通用搜索表单在安全/登录页面上不起作用

时间:2011-05-27 21:22:21

标签: forms search silverstripe

我在Page.php文件中定义了一个搜索表单

function AdvancedSearchForm(){     $ searchText = isset($ this-> Query)? $ this->查询:'搜索';     $ searchText2 = isset($ this-> Subquery)? $ this->子查询:'0';     $ searchText3 = isset($ this-> documentType)? $ this-> documentType:'全部';

$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 个答案:

答案 0 :(得分:2)

您收到错误,因为表单未传递给您想要的控制器(~Page_Controller)。

当您定义Form对象时,您应该测试$ this-> owner并查看它是否是Page_Controller的后代。如果没有,你可以使用类似的东西,并使用$ controller作为Form对象创建的第一个变量。

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