Кол-во комнат как в Яндекс.Недвижимости [готовое решение]
 Добавлено: 06 май 2013, 13:39
Добавлено: 06 май 2013, 13:39Долго думал как можно сделать и удобно и функционально, в итоге сделал как в Яндексе (респект супруге за идею   )
 )
Как это работает на ORE, можно посмотреть здесь
Модификаций здесь немного, но эффект приятный.
1. в админке->настройки отключаем Использовать "ползунок" в поиске для поля "Количество комнат"
2. открываем файл \protected\views\site\field-rooms-search.php и находим код:
меняем на:
Основная идея в применении checkBoxList вместо dropDownList
Вместо 'separator' можно применить margin-left:9px; в CSS, так код будет лаконичнее.
3. открываем \protected\modules\quicksearch\controllers\MainController.php и добавляем куда-нибудь в начало файла публичную переменную класса
4. в этом же файле ищем код:
меняем на:
Здесь мы поменяли обработку единственного аргумента (кол-во) на обработку массива по логике ИЛИ.
5. правим CSS (\css\styles.css), чтобы наши checkbox'ы стали похожи на кнопки:
И подгоняем под нужный дизайн.
Возможно я что-то забыл, так что если не будет работать - пишите, поправим.
			 )
 )Как это работает на ORE, можно посмотреть здесь
Модификаций здесь немного, но эффект приятный.
1. в админке->настройки отключаем Использовать "ползунок" в поиске для поля "Количество комнат"
2. открываем файл \protected\views\site\field-rooms-search.php и находим код:
- Код: Выделить всё
- $roomItems = array(
 '0' => Yii::t('common', 'any'),
 '1' => 1,
 '2' => 2,
 '3' => 3,
 '4' => Yii::t('common', '4 and more'),
 );
 echo CHtml::dropDownList('rooms', isset($this->roomsCount) ? CHtml::encode($this->roomsCount) : 0, $roomItems, array('class' => $fieldClass));
 
меняем на:
- Код: Выделить всё
- $roomItems = array(
 '1' => '1',
 '2' => '2',
 '3' => '3',
 '4' => '4+',
 );
 
 echo CHtml::checkBoxList(
 'rooms',
 isset($this->selectedRooms) ? $this->selectedRooms : '',
 $roomItems,
 array('template'=>"{input}{label}", 'separator'=>'<div class=\'left\' style=\'width:9px;\'> </div>')
 );
Основная идея в применении checkBoxList вместо dropDownList
Вместо 'separator' можно применить margin-left:9px; в CSS, так код будет лаконичнее.
3. открываем \protected\modules\quicksearch\controllers\MainController.php и добавляем куда-нибудь в начало файла публичную переменную класса
- Код: Выделить всё
- public $selectedRooms;
4. в этом же файле ищем код:
- Код: Выделить всё
- $rooms = Yii::app()->request->getParam('rooms');
 if($rooms){
 if($rooms == 4){
 $criteria->addCondition('num_of_rooms >= :rooms');
 }
 else{
 $criteria->addCondition('num_of_rooms = :rooms');
 }
 $criteria->params[':rooms'] = $rooms;
 $this->roomsCount = $rooms;
 }
меняем на:
- Код: Выделить всё
- $rooms = Yii::app()->request->getParam('rooms');
 if($rooms) {
 $roomsConditions = array();
 foreach($rooms as $roomKey => $roomValue){
 if($roomValue == 4) {
 $roomsConditions[] = 'num_of_rooms >= :rooms_'.$roomKey;
 } else {
 $roomsConditions[] = 'num_of_rooms = :rooms_'.$roomKey;
 }
 $criteria->params[':rooms_'.$roomKey] = $roomValue;
 }
 $roomsCondition = implode(' OR ', $roomsConditions);
 $criteria->addCondition($roomsCondition);
 $this->selectedRooms = $rooms;
 }
 
Здесь мы поменяли обработку единственного аргумента (кол-во) на обработку массива по логике ИЛИ.
5. правим CSS (\css\styles.css), чтобы наши checkbox'ы стали похожи на кнопки:
- Код: Выделить всё
- #rooms label {
 background: #2D5495;
 border: #2D5495 1px solid;
 color:#fff;
 -webkit-border-radius: 5px;
 -moz-border-radius: 5px;
 border-radius: 5px;
 display: block;
 float:left;
 padding: 2px 5px 2px 5px;
 margin: 2px 0 0 0px;
 line-height:1.4em;
 text-align:center;
 width:15px;
 -webkit-box-shadow: inset 1px 3px 3px rgba(255,255,255,0.1);
 -moz-box-shadow: inset 1px 3px 3px rgba(255,255,255,0.1);
 box-shadow: inset 1px 3px 3px rgba(255,255,255,0.1);
 }
 #rooms input{
 display: none;
 }
 #rooms input:checked + label{
 background: #fff;
 color: #333;
 -webkit-box-shadow: inset 1px 3px 2px rgba(0,0,0,0.2);
 -moz-box-shadow: inset 1px 3px 2px rgba(0,0,0,0.2);
 box-shadow: inset 1px 3px 2px rgba(0,0,0,0.2);
 }
И подгоняем под нужный дизайн.
Возможно я что-то забыл, так что если не будет работать - пишите, поправим.