Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Возврат зачения в select из адресной строки (https://javascript.ru/forum/dom-window/53156-vozvrat-zacheniya-v-select-iz-adresnojj-stroki.html)

andymark 23.01.2015 03:27

Возврат зачения в select из адресной строки
 
Доброго времени суток!
Наткнулся на такую задачу
есть вот такая форма
<form rel="nofollow" name="filter" action="/filter" method="get" id="filter-form" onsubmit="filterSubmit(); return false;">
        <ul>
            <li class="filter-opt city-opt">
                    <select name="city" id="city" onchange="setCity(this.value, this)">
                        <option value="" selected>Город</option>
                        <option value="0">Все</option>
                        <?php foreach (getCityList() as $c) { ?>
                            <option value="<?php echo $c->id; ?>">
                                <?php echo $c->name; ?>
                            </option>
                            <?php if ($c->id == $params['city']) $temp_city = $c->name; ?>
                        <?php } ?>
                    </select>
                <input type="hidden" class="opt-id"  id="f-city"  value="<?php echo $params['city']; ?>"/>
            </li>
            <li class="filter-opt auto-opt">
                    <select name="auto" onchange="setAuto(this.value, this)">
                        <option value="" selected>Марка</option>
                        <option value="0">Все</li>
                        <?php foreach (getAutoList() as $c) { ?>
                            <option value="<?php echo $c->id; ?>">
                                <?php echo $c->name; ?>
                            </option>
                            <?php if ($c->id == $params['auto']) $temp_auto = $c->name; ?>
                        <?php } ?>
                    </select>
                <input type="hidden" class="opt-id"  id="f-auto"  value="<?php echo $params['auto']; ?>"/>
            </li>
            <li class="filter-opt type-opt">
                    <select name="cat" onchange="setType(this.value, this)">
                        <option value="" selected>Что искать?</option>
                        <option value="0">Все</option>
                        <?php foreach (getTypeList() as $c) { ?>
                            <option value="<?php echo $c->tid; ?>">
                                <?php echo $c->name; ?>
                            </optioon>
                            <?php if ($c->tid == $params['cat']) $temp = $c->name; ?>
                        <?php } ?>
                    </ul>
                <input type="hidden" class="opt-id"  id="f-type"  value="<?php echo $params['cat']; ?>"/>
            </li>
            <li class="filter-opt sub-opt<?php if ($params['cat'] < 1 ) echo ' hidden-field'; ?>">
                    <select name="sub_cat" onchange="setSub(this.value, this)">
	                    <option value="" selected>Уточним?</option>
	                    <option value="0">Все</option>
                        <?php if ($params['cat'] > 0) { ?>
                            <?php if ($getSubcat = _getCategoryList($params['cat'])) { ?>
                                <?php foreach ($getSubcat as $c) { ?>
                                    <option value="<?php echo $c->tid; ?>">
                                        <?php echo $c->name; ?>
                                    </option>
                                    <?php if ($c->tid == $params['subcat']) $temp = $c->name; ?>
                                <?php } ?>
                            <?php } ?>
                        <?php } ?>
                    </select>
                <input type="hidden" class="opt-id"  id="f-sub" value="<?php echo $params['subcat']; ?>" />
			</li>
		</ul>
		
        <div class="bckg"><input type="submit" value="Подобрать" onclick="changeFilterAction('');" /></div>
        <div class="bckg"><input type="submit" value="Отобразить списком" onclick="changeFilterAction('filter');" /></div>
    </form>

function setType(type) {if(type == 0) {$('#f-sub').val(0);$('.sub-opt').addClass('hidden-field');}$('.type-opt #f-type').val(type);getSubcategory(type);}

function setAuto(type) {$('.auto-opt #f-auto').val(type);}

function setCity(type) {$('.city-opt #f-city').val(type);}

function setSub(type) {$('.filter-opt.sub-opt select').click(function(){$('.filter-opt.sub-opt select').css("left","-9999 !important");});$('.sub-opt #f-sub').val(type);}

function getSubcategory(type) {if (type > 0) {$.ajax({url: 'ac?t=sub',data: {id: type},success: function(data) {if (data) {$('.sub-opt select').html(data);$('.sub-opt').removeClass('hidden-field');} else {$('.sub-opt').addClass('hidden-field');$('#f-sub').val(0);}}});}}

function filterSubmit() {var path = $('#filter-form').attr('action');var get = '';if (get = getParamString()) path += '?' + get;window.location.href = path;}

function changeFilterAction(action) {
    $('#filter-form').attr('action', '/' + action);
}

/**
 * для карты 
*/

function getParamString() {var filters = new Array();var param = 0;if ((param = parseInt($('#f-city').val())) > 0) filters.push('f\[city\]=' + param);if ((param = parseInt($('#f-auto').val())) > 0) filters.push('f\[auto\]=' + param);if ((param = parseInt($('#f-type').val())) > 0) filters.push('f\[cat\]=' + param);if ((param = parseInt($('#f-sub').val())) > 0) filters.push('f\[subcat\]=' + param);
    return filters.length > 0 ? filters.join('&') : '';
}

Выдается результат на карту или списком через адресную строку формат http://mysite/?f[city]=n&f[auto]=n&f[cat]=n&f[subcat]=n, но значения select не запоминаются после загрузки страницы с результатами


Вопроса по сути 2 как сделать так чтоб после загрузки данных значения в форме были теми что выбраны, а не по умолчанию ?

и другой более замороченный. есть карта есть форма как сделать так чтоб при выборе значения результат сразу отображался на карте?

надеюсь что есть добрые люди))) в js не очень шарю увы(((:cray:

danik.js 23.01.2015 07:38

Цитата:

Сообщение от andymark
в js не очень шарю

А тут и не нужно. Это делают на сервере (PHP?). Там, в зависимости от GET-параметров выставляют атрибут selected нужному option'у. Это если делать не через жопу. А через жопу как сделать, ща, погоди, понабегут, подскажут )

И еще - нафига эта канитель со скрытыми инпутами? Селект сам по себе умеет отправляться ввиде GET-параметра. Надо переделать.

andymark 23.01.2015 08:08

раньше вместо select и option были ul li сам переделывал, от них и остались((( надо будет почитать про GET :thanks:

danik.js 23.01.2015 09:39

Вот пример как делать:
<? $city = isset($_GET['city']) ? $_GET['city'] : '' ?>
<select name="city" id="city" onchange="setCity(this.value, this)">
    <option value="" <?= ($city == '') ? ' selected' : '' ?>>Город</option>
    <option value="0" <?= ($city == '0') ? ' selected' : '' ?>>Все</option>
    <?php foreach (getCityList() as $c) { ?>
        <option value="<?php echo $c->id; ?>" <?= ($city == $c->id) ? ' selected' : '' ?>>
            <?php echo $c->name; ?>
        </option>
        <?php if ($c->id == $params['city']) $temp_city = $c->name; ?>
    <?php } ?>
</select>

И вроде вместо _GET у тебя в $params уже все лежит.
Скрытые инпуты убрать. JS весь убрать, кроме ajax-запроса. Не вижу ничего плохого в пустых GET-параметрах.

andymark 23.01.2015 17:45

Спасибо за наводку))) :victory:
действительно в $params всё было :write:

Заработала как часики)))

А как насчет того чтоб карта автоматом обновлялась при выборе параметра, не подскажешь?


Часовой пояс GMT +3, время: 18:16.