Cakephp-索引搜索

时间:2018-09-12 07:37:44

标签: php cakephp search plugins cakephp-3.x

我对如何搜索(例如,在INDEX视图中按名称或姓氏)存在疑问。 是否有任何插件或易于使用的组件不会过多地加载应用程序?

目前,我在index.ctp中有一个小表格,其中有一个输入字段,在其中输入我要搜索的内容,在控制器中有一个 if($ this-> request-> is('post' )),然后在 $ this-> Model-> find 中添加条件WHERE。但是我承认这不是一个好方法,它还会重新加载页面。

这是控制器:

public function index()
{
    if ($this->request->is('post')) {
        $s = '%'.$this->request->getData('Search').'%';
        $students = $this->Students->find('all')->where(['OR' => ['name LIKE' => $s, 'lastname LIKE' => $s]]);
        $this->set('students', $this->paginate($students));
    } else {
        $students = $this->paginate($this->Students);
        $this->set(compact('students'));
    }
}

这是index.ctp:

<div class="input-group mb-3">
    <?= $this->Form->button(__('<i class="fas fa-search"></i>'), ['escape' => false, 'class' => 'btn btn-primary']) ?>
    <?= $this->Form->input('Search', ['type' => 'text', 'class' => 'form-control', 'label' => false]); ?>
    <?= $this->Form->end() ?>
</div>

2 个答案:

答案 0 :(得分:0)

据我所知,您正在寻找一种更好的解决方案来处理搜索和/或不重新加载页面以显示搜索结果。 如果这不是您要解决的问题,请澄清您的问题,以更好地概述您希望解决方案的外观。

您应该将搜索从索引函数中分离出来,因为那只是为了显示该页面上的内容。像您这样添加条件最终将导致您拥有一个非常长的索引函数,该索引函数会根据请求中的差异来运行整个应用程序,这并不好。

将搜索分为一个单独的功能,这将依次创建一个新页面供您显示结果。

public function index()
{
    $students = $this->paginate($this->Students);
    $this->set(compact('students'));
}

public function search()
{
    $s = '%' . $this->request->getData('Search') . '%';
    $students = $this->Students->find('all')->where(['OR' => ['name LIKE' => $s, 'lastname LIKE' => $s]]);
    $this->set('students', $this->paginate($students));
}

这在CakePHP文档-CMS Tutorial - Creating the Articles Controller的教程中有很好的描述,并且可以与您的应用程序相关,因为您的索引包含将搜索条件传递给应用程序的表单,然后搜索功能/页面将获取结果并为您显示。

请不要忘记更改表单以使其指向/search页。 -Setting a URL for the Form

您将需要在src / Template / ExampleController文件夹中创建一个search.ctp文件。将html代码放在此处以在表中显示结果,或者您想显示搜索结果。

最后,您将需要在route.php中添加一条路由,以允许应用程序中的/search路径。

$routes->connect('/search', ['controller' => 'Example', 'action' => 'search']);

现在,如果您不希望在使用表单时重新加载页面,则必须使用Ajax和JS / JQuery向搜索方法发出请求,并在页面上动态显示搜索功能的结果。在stackoverflow和网络上已经有很多很好的例子,可以使用ajax和jquery从搜索中构建表,因此我不会在这里发布它们。

如果要使用插件/库解决方案,请参阅本教程,以使用DataTables在表中显示搜索结果。 -Search Using Datatables

答案 1 :(得分:0)

安装插件https://github.com/FriendsOfCake/search

然后使用搜索配置

$this->searchManager()
     // Here we will alias the 'q' query param to search the `Students.name`
     // field and the `Students.lastname` field, using a LIKE match, with `%`
            // both before and after.
            ->add('q', 'Search.Like', [
                'before' => true,
                'after' => true,
                'fieldMode' => 'OR',
                'comparison' => 'LIKE',
                'wildcardAny' => '*',
                'wildcardOne' => '?',
                'field' => ['name', 'lastname']
            ]);