Silverstripe 前端搜索 Ajaxification
Silverstripe Front-end Search Ajaxification
我想在模式中显示默认的 SilverStripe 站点搜索框,然后在提交表单时希望在同一模式中显示搜索结果,而不是在页面上显示。
default search on front end
我按照创建页面类型的方法...
AjaxFormPage extends Page {}
class AjaxFormPage_Controller extends Page_Controller {}
1) 在这里我做了 init 方法来加载 jQuery
.
2) 创建表单(基本上,来自 ContentControllerSearchExtension
class 的相同搜索表单并粘贴到此处。
3) 还复制了 ContentControllerSearchExtension
的结果函数,如下所示:
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-form-page/SearchForm/?Search=asdasd&action_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 的情况下仍然可以工作)。
在你的情况下,我认为你只需要让 ContentControllerSearchExtension
ajax 提供的 results()
函数感知。
首先在 Page_Controller
中重载 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'));
}
现在,不再 return 使用完整模板,而是检查请求是否是 ajax,如果是,return 是部分模板。
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
是一个模板,仅包含您要注入模态 window.
的 HTML 片段
你的 JS 看起来像这样(请原谅我生疏 jQuery):
$('.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);
});
);
相关:https://www.silverstripe.org/learn/lessons/ajax-behaviour-and-viewabledata
更新:要点:https://gist.github.com/unclecheese/dcb3777e929a429e906b8b5c9ffc9c0b
我想在模式中显示默认的 SilverStripe 站点搜索框,然后在提交表单时希望在同一模式中显示搜索结果,而不是在页面上显示。 default search on front end 我按照创建页面类型的方法...
AjaxFormPage extends Page {}
class AjaxFormPage_Controller extends Page_Controller {}
1) 在这里我做了 init 方法来加载 jQuery
.
2) 创建表单(基本上,来自 ContentControllerSearchExtension
class 的相同搜索表单并粘贴到此处。
3) 还复制了 ContentControllerSearchExtension
的结果函数,如下所示:
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-form-page/SearchForm/?Search=asdasd&action_AjaxSubmit=Go
resultsAjax
方法
[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 的情况下仍然可以工作)。
在你的情况下,我认为你只需要让 ContentControllerSearchExtension
ajax 提供的 results()
函数感知。
首先在 Page_Controller
中重载 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'));
}
现在,不再 return 使用完整模板,而是检查请求是否是 ajax,如果是,return 是部分模板。
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
是一个模板,仅包含您要注入模态 window.
你的 JS 看起来像这样(请原谅我生疏 jQuery):
$('.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);
});
);
相关:https://www.silverstripe.org/learn/lessons/ajax-behaviour-and-viewabledata
更新:要点:https://gist.github.com/unclecheese/dcb3777e929a429e906b8b5c9ffc9c0b