【问题标题】:Search form with Cakephp 3使用 Cakephp 3 搜索表单
【发布时间】:2016-06-24 11:48:27
【问题描述】:

我尝试在我的应用程序中创建一个搜索表单,我想用一个输入搜索帖子,然后搜索标题和内容。

编辑:我使用CakePHP Search plugin 我的控制器

public function initialize(){
    parent::initialize();
    $this->loadComponent('Search.Prg', ['actions'=>'index','lookup']);
}
public function search(){
    $query = $this->Posts
        ->find('search',['search' => $this->request->query])
        ->contain(['Users','Categories'])
        ->where(['Posts.status' => 1]);

        $this->set(compact('posts', $this->paginate($query)));
}

我的模特

use Search\Manager;
$this->addBehavior('Search.Search');
     $this->searchManager()
        ->add('q', 'Search.Like', [
            'before' => true,
            'after' => true,
            'mode' => 'or',
            'comparison' => 'LIKE',
            'wildcardAny' => '*',
            'wildcardOne' => '?',
            'field' => [$this->aliasField('name'), $this->aliasField('content')]
        ]);

在我看来

 <?= $this->Form->create();  ?>
    <?= $this->Form->input('q');  ?>
    <?= $this->Form->button('Search', ['action'=>'index']);  ?>
    <?= $this->Form->end();  ?>

现在,如何显示查询结果?

【问题讨论】:

  • 只需$q = $this-&gt;request-&gt;query('q')
  • public function search()

标签: php search full-text-search cakephp-3.0 cakephp-search-plugin


【解决方案1】:

您的查询应该是这样的。

$query = $this->find('all')
        ->where(['title LIKE' => '%' . $this->request->query('q') . '%'])
        ->orWhere(['content LIKE' => '%' . $this->request->query('q') . '%']);

【讨论】:

    【解决方案2】:

    要显示搜索结果,请执行以下“附加”操作: 第一个: 在 AppController 中加载你的组件

    class AppController extends Controller
    {
        public function initialize()
        {
            parent::initialize();
    
            $this->loadComponent('RequestHandler');
            $this->loadComponent('Flash');
            $this->loadComponent('Search.Prg', [
            // This is default config. You can modify "actions" as needed to make
            // the PRG component work only for specified methods.
            'actions' => ['index', 'lookup']
            ]);
    }
    

    第二: 在您的搜索方法中添加以下代码:

    $query = $this->SystemUsers->find('search', ['search' => $this->request->query]);
            $vari = $this->request->getQuery('q');
            if ($vari != "") {
                $posts= $this->paginate($query);
    
                $this->set(compact('posts'));
                $this->set('_serialize', ['posts']);
            }
    

    3rd:编辑您的 search.ctp 文件以查看结果:

    <table class="table" cellpadding="0" cellspacing="0">
            <thead>
                <tr>
                    <th style="width: 3%;"></th>
                    <th scope="col"><?= $this->Paginator->sort('id') ?></th>
                    <th scope="col"><?= $this->Paginator->sort('name') ?></th>
                    <th scope="col"><?= $this->Paginator->sort('content') ?></th>
                    <th scope="col"><?= $this->Paginator->sort('created') ?></th>
                    <th scope="col"><?= $this->Paginator->sort('modified') ?></th>
                    <th scope="col" class="actions"><?= __('Actions') ?></th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($posts as $post): ?>
                <tr>
                    <td style="width: 3%;"><input type="checkbox" value=""></td>
                    <td><?= $this->Number->format($post->id) ?></td>
                    <td><?= h($post->name) ?></td>
                    <td><?= h($post->content) ?></td>
                    <td><?= h($post->created) ?></td>
                    <td><?= h($post->modified) ?></td>
                    <td class="actions">
                        <?= $this->Html->link(__('View'), ['action' => 'view', $post->id]) ?>
                        <?= $this->Html->link(__('Edit'), ['action' => 'edit', $post->id]) ?>
                        <?= $this->Form->postLink(__('Delete'), ['action' => 'delete', $post->id], ['confirm' => __('Are you sure you want to delete # {0}?', $post->id)]) ?>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
        <div class="paginator">
            <ul class="pagination">
                <?= $this->Paginator->first('<< ' . __('first')) ?>
                <?= $this->Paginator->prev('< ' . __('previous')) ?>
                <?= $this->Paginator->numbers() ?>
                <?= $this->Paginator->next(__('next') . ' >') ?>
                <?= $this->Paginator->last(__('last') . ' >>') ?>
            </ul>
            <p><?= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?></p>
        </div>
    

    在上面的视图中,根据您的表格编辑表格的实体名称。

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 2017-12-22
      • 1970-01-01
      • 2011-07-02
      • 2014-04-07
      • 2014-02-21
      • 1970-01-01
      • 2011-08-29
      • 2017-02-05
      相关资源
      最近更新 更多