Поиск плагинов cakedc поиск в ценовом диапазоне

Я пытаюсь искать между двумя ценами, используя поисковый плагин cakedc, вот мой код модели:

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

public $filterArgs = array(
    'price' => array(
    'type' => 'expression',
    'method' => 'makeRangeCondition',
    'field' => 'Price.views BETWEEN ? AND ?'
    )
);

   public function makeRangeCondition($data = array()) {
    if (strpos($data['price'], ' - ') !== false){
        $tmp = explode(' - ', $data['price']);
        $tmp[0] = $tmp[0] ;
        $tmp[1] = $tmp[1] ;
        return $tmp;
    } else {
        return array($minPrice, $maxPrice) ;
    }
}

код для моего контроллера:

public function index() {
    $this->Prg->commonProcess();
    $cond = $this->Property->parseCriteria($this->passedArgs);

$this->set('properties', $this->paginate('Property', $cond));
}

код для моего взгляда:

<?php
echo $this->Form->create();
echo $this->Form->input('minPrice');
echo $this->Form->input('maxPrice');
echo $this->Form->submit(__('Submit'));
echo $this->Form->end();

?>

таблица sql:

CREATE TABLE IF NOT EXISTS `properties` (

id varchar (36) НЕ NULL, price float DEFAULT NULL, ПЕРВИЧНЫЙ КЛЮЧ (id), УНИКАЛЬНЫЙ КЛЮЧ ID (id)) ENGINE = MySAM CHARSET ПО УМОЛЧАНИЮ =utf8;

2 ответа

Вместо 'range' ключ в filterArgs назовите его как 'price'. Потому что плагин проверяет имя ключа и метод вызова только в том случае, если data[key] не пуст.

Если вы используете два входа, вы должны использовать два аргумента в $filterArgs массив.

Вы можете попробовать этот код в вашей модели:

public $filterArgs = array(
        'minPrice' => array(
            'type' => 'query',
            'method' => 'priceRangeMin'
        ),

        'maxPrice' => array(
             'type' => 'query',
             'method' => 'priceRangeMax'
        )
    );

public function priceRangeMin( $data = array() ) {
    if( !empty( $data['minPrice'] ) ) {
        return array('Property.price >= '.$data['minPrice'].'');
    }
}

public function priceRangeMax( $data = array() ) {
    if( !empty( $data['maxPrice'] ) ) {
        return array('Property.price <= '.$data['maxPrice'].'');
    }
}

Также используйте тот же код выше в вашем контроллере и просмотра.

Другие вопросы по тегам