Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverstripe前端搜索Ajaxification_Silverstripe - Fatal编程技术网

Silverstripe前端搜索Ajaxification

Silverstripe前端搜索Ajaxification,silverstripe,Silverstripe,我想以一种模式显示默认的SilverStripe站点搜索框,然后在提交表单时,我想以相同的模式显示搜索结果,而不是将其显示在页面上。 我遵循的方法是创建一个页面类型 AjaxFormPage extends Page {} class AjaxFormPage_Controller extends Page_Controller {} 1) 在这里,我使用init方法加载jQuery 2) 创建表单(基本上,是来自ContentControllerSearchExtension类的相同搜索表单

我想以一种模式显示默认的SilverStripe站点搜索框,然后在提交表单时,我想以相同的模式显示搜索结果,而不是将其显示在页面上。 我遵循的方法是创建一个页面类型

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);
  });
);