Silverstripe前端搜索Ajaxification
我想以一种模式显示默认的SilverStripe站点搜索框,然后在提交表单时,我想以相同的模式显示搜索结果,而不是将其显示在页面上。 我遵循的方法是创建一个页面类型Silverstripe前端搜索Ajaxification,silverstripe,Silverstripe,我想以一种模式显示默认的SilverStripe站点搜索框,然后在提交表单时,我想以相同的模式显示搜索结果,而不是将其显示在页面上。 我遵循的方法是创建一个页面类型 AjaxFormPage extends Page {} class AjaxFormPage_Controller extends Page_Controller {} 1) 在这里,我使用init方法加载jQuery 2) 创建表单(基本上,是来自ContentControllerSearchExtension类的相同搜索表单
AjaxFormPage extends Page {}
class AjaxFormPage_Controller extends Page_Controller {}
1) 在这里,我使用init方法加载jQuery
2) 创建表单(基本上,是来自ContentControllerSearchExtension
类的相同搜索表单,并粘贴在此处
3) 还从ContentControllerSearchExtension
复制了results函数,如下所示:
public function resultsAjax($data, $form, $request) {
//$this->request->isAjax()
//Director::is_ajax()
if (Director::is_ajax()) {
$data = array(
'Results' => $form->getResults(),
'Query' => DBField::create_field('Text', $form->getSearchQuery()),
'Title' => _t('SearchForm.SearchResults', 'Search Results')
);
return $this->owner->customise($data)->renderWith(array('Page_results', 'Page'));
} else {
return "Not Ajax";
}
}
}
表单将转到以下URL
/new ajax表单页面/SearchForm/?Search=asdasd&action\u AjaxSubmit=Go
对于resultsAjax
方法的每个参数,我得到以下警告1、2和3
[Warning] Missing argument 1 for AjaxFormPage_Controller::resultsAjax(), called in /var/www/projects/xxxx/framework/view/ViewableData.php on line 466 and defined
GET /new-ajax-form-page/SearchForm/?Search=asdasd&action_AjaxSubmit=Go
Line 137 in /var/www/projects/xxxx/mysite/AjaxFormPage.php
[Warning] Missing argument 2 for AjaxFormPage_Controller::resultsAjax(), called in /var/www/projects/xxxx/framework/view/ViewableData.php on line 466 and defined
GET /new-ajax-form-page/SearchForm/?Search=asdasd&action_AjaxSubmit=Go
Line 137 in /var/www/projects/xxxx/mysite/AjaxFormPage.php
[Warning] Missing argument 3 for AjaxFormPage_Controller::resultsAjax(), called in /var/www/projects/xxxx/framework/view/ViewableData.php on line 466 and defined
GET /new-ajax-form-page/SearchForm/?Search=asdasd&action_AjaxSubmit=Go
Line 137 in /var/www/projects/xxxx/mysite/AjaxFormPage.php
任何帮助如何使其工作将不胜感激 一般来说,您不应该在后端代码中注入太多关于ajax的顾虑。除了在前端应用于ajax表单的行为之外,ajax表单的工作原理应该与任何其他表单基本相同。这有助于代码的一致性,还允许表单优雅地降级(即,它们在没有ajax的情况下仍然可以工作) 在您的情况下,我认为您所需要的只是使
ContentControllerSearchExtension
ajax提供的results()
函数具有ajax感知功能
首先在控制器的页面中重载results()
public function results($data, $form, $request) {
$data = array(
'Results' => $form->getResults(),
'Query' => DBField::create_field('Text', $form->getSearchQuery()),
'Title' => _t('SearchForm.SearchResults', 'Search Results')
);
return $this->owner->customise($data)->renderWith(array('Page_results', 'Page'));
}
现在,不要返回完整的模板,而是检查请求是否是ajax,如果是,则返回部分
public function results($data, $form, $request) {
// ...
if ($this->getRequest()->isAjax()) {
return $this->customise($data)->renderWith('AjaxSearchResults');
}
return $this->owner->customise($data)->renderWith(array('Page_results', 'Page'));
}
其中,AjaxSearchResults.ss
是一个模板,它只包含要注入模式窗口的HTML片段
您的JS看起来会像这样(请原谅我生锈的jQuery):
相关:
更新:要点:你好,谢谢你的回复。我开始创建一个新的控制器:类AjaxSearchResults扩展页面{}类AjaxSearchResults\u控制器扩展页面{u控制器{公共函数结果($data,$form,$request){/…if($this->getRequest()->isAjax()){return$this->customize($data)->renderWith('AjaxSearchResults');}返回$this->owner->customize($data)->renderWith(数组('Page_results','Page');}还创建了一个ss文件和一个Js文件ss文件,其中包含我要呈现为结果的HTML。我的AjaxSearchResults控制器如何知道我在这里添加的这个结果方法是检索本机silvestripe搜索结果的。我需要在某个地方引用“ContentControllerSearchExtension”吗?嗨,UC,我使用了上面的代码,现在在回复中。。。我得到了页面的完整html代码(在console.log上),从中加载搜索模式。它不显示搜索结果,而是显示加载模式的页面的html,以便在console.log上执行搜索。有什么线索可以解释为什么它这样做而不是吐出搜索结果。我需要在我的results方法中添加以下代码吗$数据=数组('Results'=>$form->getResults(),'Query'=>DBField::create_field('Text',$form->getSearchQuery()),'Title'=>t('SearchForm.SearchResults','SearchResults');即使此方法也不会被调用:------------------------------------------------
$('.myForm').submit(e => {
e.preventDefault();
const data = $(this).serialize();
const $form = $(this);
$.ajax(
$form.attr('action'),
{
type: 'GET',
data,
}
})
.done(response => {
$('#some-div').html(response);
});
);