Кол-во комнат как в Яндекс.Недвижимости [готовое решение]

Ваши предложения по улучшению, новым модулям и т.д.

Модераторы: Xpycm, Koduc

Правила форума
ВНИМАНИЕ! Форум не является средством гарантированной поддержки клиентов и пользователей. Поэтому на быстрый ответ тут рассчитывать не нужно, как и на ответ вообще. Сотрудники отвечают по мере своих возможностей.

На форуме действует ограничение в 3 сообщения / сутки.
Если Вы хотите сказать "спасибо", то воспользуйтесь функцией "Повысить репутацию" - зелёная иконка "плюс" под ником ответившего.

Кол-во комнат как в Яндекс.Недвижимости [готовое решение]

Сообщение Cornil » 06 май 2013, 13:39

Долго думал как можно сделать и удобно и функционально, в итоге сделал как в Яндексе (респект супруге за идею *THUMBS UP* )
Как это работает на 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;\'>&nbsp;</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);
}
 


И подгоняем под нужный дизайн.
Возможно я что-то забыл, так что если не будет работать - пишите, поправим.
Cornil
Гражданин
Гражданин
 
Сообщения: 77
Зарегистрирован: 18 фев 2013, 22:08
Очки репутации: 14

Вернуться в Улучшения

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

cron