我对如何搜索(例如,在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>
答案 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']
]);