Селект поле, запомняне на стойност.

teroristd

Registered
Здравейте, на началната страница имам селект поле с три опции за подреждане на резултата. В зависимост от това коя опция е избрана правя различна заявка към базата. До тук всичко работи, проблема е че имам странициране и когато се избере например втора страница браузъра се рефрешва и губя стойността която е била избрана. Какво може да се направи? Нещо към сесия ме върти, но не мога да измисля как трябва да стане. Ето какво имам.

View
PHP:
<form name="myform" method="post">

            <select id="select" name="select" onchange="submitform();">
                <option disabled selected value> ---</option>
                <option value="order_date">Дата на публикуване</option>
                <option value="order_price_low">Цена (възходящ ред)</option>
                <option value="order_price_high">Цена (низходящ ред)</option>
            </select>

        </form>

Controller
PHP:
               //Равносилно на $_POST['select'];
               $select = $this->_normalize->post('select');

                if ($select == null)
                {
                     $this->_model->defaultOrder();
                }
                elseif ($select == 'order_date')
                {
                     $this->_model->dateOrder();
                }
                elseif ($select == 'order_price_low')
                {
                     $this->_model->priceLowOrder();
                }
                elseif ($select == 'order_price_high')
                {
                     $this->_model->priceHighOrder(); 
                }

                $this->layout();
 
Най-лесно ще стане ако предаваш избрания резултат чрез GET.

Код:
<?php
$selectedOrder = 'default';

if($_GET['order'])
$selectedOrder = $_GET['order'];
?>

Така ще можеш да си селектваш избраната стойност.

Код:
<option <?=($selectedOrder == 'order_date') ? 'selected'; > value="order_date">Дата на публикуване</option>


Съотвено трябва да оправиш и линковете към другите страници.

Код:
<a href="file.php?page=2&order=<?=$selectedOrder;?>
 
Мисля че това при мен няма да се получи, защото линковете ми са от тип controller/method/params. Един вид нямам &order=нещо.

Ето какъв ми е линка localhost/market/public/index/run/1 като цифрите са страниците.
 
teroristd каза:
Мисля че това при мен няма да се получи, защото линковете ми са от тип controller/method/params. Един вид нямам &order=нещо.

Ето какъв ми е линка localhost/market/public/index/run/1 като цифрите са страниците.

Ти пак може да си подаваш параметри през GET, url-a ще е:

Код:
localhost/market/public/index/run/2?parameter=value
 
Значи темите ти винаги са такива - даваме ти правилни решения, ти не искаш да ги направиш.

Затова ще ти кажа това, което искаш да чуеш - използвай сесия. Перфектното решение за този проблем е. Даже може да ползваш redis например. Така ще може да ги кешираш и да работи изключително много по-бързо това решение.
 
Не разбирам защо се заяждаш. Какво лошо има в това че търся по различно решение. Точно ти в друга тема ми каза да не си развалям урл-а. Вече всички теми тука се превръщат в някакви спорове и спам. Приел съм всички решения които съм могъл да направя. Може да се види в 90% от темите съм дал точка на някого.
 
teroristd каза:
Предпочитам да не развалям урл-а. Някакъв друг начин няма ли?
В такъв случай не го "разваляй", а добави нужното поле след наклонената черта - controller/method/params/[order_id]
(щом идеята ти е да няма символи като "?" и "=" )
 
На скоро ми се наложи този проблем да реша и аз лично го направих чрез cookie.
Бисквитки :) за няколко часа, може и сесия.
 
Винаги можеш да добавиш тази променлива като параметър в линка.

Не знам какъв framework ползваш, затова ти дадох прост пример с $_GET.
 
deam0n каза:
Винаги можеш да добавиш тази променлива като параметър в линка.

Не знам какъв framework ползваш, затова ти дадох прост пример с $_GET.

Принципно пробвах, обаче не можах да го направя. Не знам къде греша но това което се получава е че самото поле остава селектирано, но в контролера при рефреш пост-а връща null и се изпълнява винаги дефаултовата заявка.
 
Според мен най-лесно и тарикатско е да сложиш едно скрито поле в формата за сортиране като не искаш да закачаш параметри към url-а, което е малко тъпо, но ето как БИ могло да стане .


Даже ако някой ден ти се наложи да правиш страница за търсене и искаш и там да сложиш тоя селект за подреждане, може да добавиш и още една проверка, която да ти добавя още едно поле и разбира се така може да ги екстрактнеш в отделен файл, за да няма излишни копирания, но ти си знаеш ;д
PHP:
<form name="myform" method="post">

            <select id="select" name="select" onchange="submitform();">
                <option disabled selected value> ---</option>
                <option value="order_date">Дата на публикуване</option>
                <option value="order_price_low">Цена (възходящ ред)</option>
                <option value="order_price_high">Цена (низходящ ред)</option>
            </select>

[color=darkred]      <input type="hidden" name="page" value="<?php echo (isset($page) ? $page : '1');?>">

      <?php if(isset($q)): ?> <input type="hidden" name="q" value="<?php echo $q;?>"> <?php endif; ?>[/color]
        </form>

Пробвай

:idea: :?:
 
Когато отидеш на нова страница най-вероятно ти го показва null заради този ред:

Код:
 $select = $this->_normalize->post('select');

В случая трябва да провериш дали има зададен параметър за сортиране от линка и да използваш него като $select.
Код:
$select = $this->_normalize->post('select');

if(isset($parametar_ot_linka))
   $select = $parametar_ot_linka;
 
Ще пробвам и по двата начина. @joTunkiq не можах да схвана каква ти е идеята за скритото поле. Би ли обяснил по-подробно.
 
Лично за мен най-правилният вариант е с промяна на линка - тоест да си взимаш опцията от $_GET.

Другият вариант са бисквитките/сесиите, ама трябва постоянно да следиш какво имаш в тях и при избор от потребителя да ги променяш.
 
teroristd каза:
Ще пробвам и по двата начина. @joTunkiq не можах да схвана каква ти е идеята за скритото поле. Би ли обяснил по-подробно.

Виж сега, до колкото разбирам имаш странициране на някаква страница. Имаш и НЯКАКВА форма за сортиране, но като сортираш не ти помни страницита, и не искаш да предаваш през ГЕТ номера на страницата.

Та, моето решение е да включиш в тази форма скрити полета, за да влязат като ПОСТ. И ти дадох пример с твоята форма за сортиране.

Идеята е тя като се постне да има вътре скрито поле, което да му подадеш $page променливата от гет, пост или от където ти идва и като пратиш формата директно да се предава.

Като ти дадох пример и ако имаш тръсене в тази страница - трябва да пердадеш и ключовата дума - може да стане по същия начин :)


:?:

EIDT: Това е от страна на падащото меню.

А за линковете на страницирането имам също решение. тъй като не знам каква система ползваш или нещо такова, но в PHP има една много яка функция за билдване на урл "http_build_query"

Пример:

PHP:
<a href="http://moqsait.com/<?php echo http_build_query([
	"page" => 1,
	"sort" => $_POST['sort']
]); ?>">1</a>

<a href="http://moqsait.com/<?php echo http_build_query([
	"page" => $page+1,
	"sort" => $_POST['sort']
]); ?>">следваща</a>

ЕДИТ 2:

Дал си пример как ти изглежда url-а
Ето какъв ми е линка localhost/market/public/index/run/1 като цифрите са страниците.

Вероятно ползваш htaccess, най-вериятно това е проблема, че не сработват get променливите. А може би ползваш CI ? Може би ако поставиш още един параметър на метода $page или $sort, който да не е задължителен :

Пример:
PHP:
class Index 
{
	
	function run($id, $page=1, $sortBy='title')
	{
		# code...
	}
}

Но ако може да ни светнеш точно с какво работиш и htaccess ако ползваш да го покажеш, може той да не е наред нещо .? :idea: :?:
 
Благодаря за отговорите. В крайна сметка единственият начин по който успях да го направя е като направих формата гет. Сега имам pretty links ugly query :D ама карай да върви, по важното е че работи.
 

Горе