Поиск плагинов 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'].'');
}
}
Также используйте тот же код выше в вашем контроллере и просмотра.