2015-11-03 50 views
0

我想在我的网站上执行搜索功能。这项研究将根据产品名称和卖家的位置显示产品。 我的观点:用两个字段搜索不是强制性的

<?php echo $this->Form->create('Product', array('type' => 'GET')); ?> 

<div class="col col-sm-4"> 
    <?php echo $this->Form->input('search', array('label' => false, 'div' => false, 'class' => 'form-control', 'autocomplete' => 'off', 'value' => $search)); ?> 
</div> 
    <div class="col col-sm-2"> 
     <?php echo $this->Form->input('searchCity', array('label' => false, 'div' => false, 'class' => 'form-control', 'autocomplete' => 'off')); ?> 
    </div> 
<div class="col col-sm-3"> 
    <?php echo $this->Form->button('Search', array('div' => false, 'class' => 'btn btn-sm btn-primary')); ?> 
</div> 

<?php echo $this->Form->end(); ?> 

两个搜索领域:一个是名,第二个位置。

我控制器(仅适用于一个搜索领域工作):

if(!empty($this->request->query['search']) || !empty($this->request->data['name'])) { 
     $search = empty($this->request->query['search']) ? $this->request->data['name'] : $this->request->query['search']; 
     $search = preg_replace('/[^a-zA-Z0-9 ]/', '', $search); 
     $terms = explode(' ', trim($search)); 
     $terms = array_diff($terms, array('')); 
     $conditions = array(
      'Brand.active' => 1, 
      'Product.active' => 1, 
      'Product.date_discount >' => date('Y-m-d H:i:s') 
     ); 
     foreach($terms as $term) { 
      $terms1[] = preg_replace('/[^a-zA-Z0-9]/', '', $term); 
      $conditions[] = array(
       'OR' => array(
        array('Product.name LIKE' => '%' . $term . '%'), 
        //array('Brand.city LIKE' => '%' . $this->request->query['searchCity'] . '%') 
       ) 
      ); 
     } 
     $products = $this->Product->find('all', array(
      'recursive' => -1, 
      'contain' => array(
       'Brand' 
      ), 
      'conditions' => $conditions, 
      'limit' => 200, 
     )); 
     if(count($products) == 1) { 
      return $this->redirect(array('controller' => 'products', 'action' => 'view', 'slug' => $products[0]['Product']['slug'])); 
     } 
     $terms1 = array_diff($terms1, array('')); 
     $this->set(compact('products', 'terms1')); 
    } 

没有搜索字段是强制性的。如果只有名称搜索字段,它将显示基于产品名称的所有产品,而不管该位置。如果只有城市搜索字段,它会显示所有位置的产品。如果两者都将根据名称和位置显示所有产品。

我不知道该做些什么修改。我试图做另一个if(!empty($this->request->query['searchCity'])下,如果我上面发布,但它没有工作(复制粘贴第一,如果和我改变了条件)。 我该怎么办?

谢谢。

回答

1

您可以在模型中使用此CakeDC Search plugin

首先包括插件在您的应用程序

CakePlugin::load('Search'); 

然后包括行为

public $actsAs = array(
    'Search.Searchable' 
); 

public $filterArgs = array(
    'search' => array(
     'type' => 'like' 
    ), 
    'searchcity' => array(
     'type' => 'like' 
    ) 
); 

和控制器

public $components = array(
    'Search.Prg','Paginator' 
); 

public function find() { 
    $this->Prg->commonProcess(); 
    $this->Paginator->settings['conditions'] = $this-> Product->parseCriteria($this->passedArgs); 
    $this->set('products', $this->Paginator->paginate()); 
} 

对于完整的例子访问here

+0

感谢您的回复!我试着用插件,我有一个错误:“调用一个非对象成员函数paginate()”在我的控制器中用$ this-> set('products',$ this-> Paginator-> paginate ));' –

+0

而searchCity需要在另一个模型中搜索。可能吗? –

+0

在$组件中添加Paginator,就像我添加了 –

0

我无法确切地了解什么是被要求,但据我了解,如预期的那样OR条件没有工作,这是因为在$conditions中使用的语法存在一个小问题。用于条件中每个字段的附加数组不是必需的,这是导致问题的原因。如此,

代替:

$conditions[] = array(
    'OR' => array(
     array('Product.name LIKE' => '%' . $term . '%'), 
     array('Brand.city LIKE' => '%' . $this->request->query['searchCity'] . '%') 
    ) 
); 

使用:

$conditions[] = array(
    'OR' => array(
     'Product.name LIKE' => '%' . $term . '%', 
     'Brand.city LIKE' => '%' . $this->request->query['searchCity'] . '%' 
    ) 
); 

此外,使用静态条件和动态条件下两个不同的变量(在foreach()$terms),然后结合他们使用这样的array_combine

$conditions_st = array(
    'Brand.active' => 1, 
    'Product.active' => 1, 
    'Product.date_discount >' => date('Y-m-d H:i:s') 
); 


foreach($terms as $term) { 
    $terms1[] = preg_replace('/[^a-zA-Z0-9]/', '', $term); 
    $conditions_dy = array(
     'OR' => array(
      'Product.name LIKE' => '%' . $term . '%', 
      'Brand.city LIKE' => '%' . $this->request->query['searchCity'] . '%' 
     ) 
    ); 
} 

$conditions = array_combine($conditions_st, $conditions_dy); 

P.S:我只是扫描了你的代码,并不能完全理解你想要做什么。我只是强调了我注意到的问题。