Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сохранение выбора в select (https://javascript.ru/forum/misc/58840-sokhranenie-vybora-v-select.html)

steepfox 13.10.2015 18:53

Сохранение выбора в select
 
Приветствую. Есть такой код:

<select name="sel" onchange="document.location=this.value">

<option value="{$obj_doska->base_url_page.$add_param_url_2}">Обычная сортировка</option>

 
<option  value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=date&tsort=desc" {$obj_doska->name_sort == "date" && $obj_doska->type_sort == "desc" ? $on_class : ""}">Новые</option>

<option value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=date&tsort=asc" {$obj_doska->name_sort == "date" && $obj_doska->type_sort == "asc" ? $on_class : ""}">Старые</option>

<option value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=cost&tsort=desc" {$obj_doska->name_sort == "cost" && $obj_doska->type_sort == "desc" ? $on_class : ""}">Дороже</option>


<option value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=cost&tsort=asc" {$obj_doska->name_sort == "cost" && $obj_doska->type_sort == "asc" ? $on_class : ""}">Дешевле</option>

</select>


Как можно сделать сохранение выбора option при обновлении страницы? На данный момент, при нажатии на один из пунктов, происходит фильтрация, но значение не сохраняется.

php не предлагать)

laimas 13.10.2015 19:04

Цитата:

Сообщение от steepfox
php не предлагать

А что лень на сервере проверить и отметить выбранную опцию?

steepfox 13.10.2015 19:06

Весь код расположен в html файле.

рони 13.10.2015 19:16

steepfox,
onchange ->сохранить this.value в localStorage
при загрузке проверить - если есть установить

laimas 13.10.2015 19:16

И что? Это {$obj_doska->base_url_page}?{$add_param_url_1}sort=cost&tsort= desc и другие чье произведение, сервера или клиента? Да и вообще это слишком так определять сортировку.

steepfox 13.10.2015 19:17

Можно как-то на моем примере это реализовать? laimas подтвердит, что я в этом деле бум бум )

steepfox 13.10.2015 19:19

laimas, я понимаю, что данная сортировка это бред, но выбирать не приходится. Как можно в моем случаи реализовать это?

laimas 13.10.2015 19:25

Вот у вас в коде {$obj_doska->name_sort == "cost" && $obj_doska->type_sort == "desc" ? $on_class : ""} - и это проверка сервером условия (тернарный оператор), что нельзя также серверу проверить какие ключи пришли и соответственно выбрать опцию?

У вас четыре комбинации из двух ключей, первая опция должна быть выбрана, если:

$_GET['sort']=='date' && $_GET['tsort']=='desc' ? 'selected' : null


для остальных свои комбинации. И этот оператор проблематично вставить в тело опций?

PS. Сортировка по возрастанию (ASC) она по умолчанию, гонять это значение туда сюда нет смысла.

steepfox 13.10.2015 19:34

Как я понял, нужно данный код прописать куда-то сюда?

<option  value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=date&tsort=desc" {$obj_doska->name_sort == "date" && $obj_doska->type_sort == "desc" ? $on_class : ""}">Новые</option>

laimas 13.10.2015 19:40

<option  value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=date&tsort=desc" {$obj_doska->name_sort == "date" && $obj_doska->type_sort == "desc" ? $on_class : ""}" {$_GET['sort']=='date' && $_GET['tsort']=='desc' ? 'selected' : null}>Новые</option>


Надо полагать, что ключи сортировки $_GET['sort'] и $_GET['tsort'] до вывода этого списка обрабатываются и возможно присваиваются неким переменным, поэтому вместо $_GET['sort'] и $_GET['tsort'] в операторе можно использовать их.

steepfox 13.10.2015 19:53

Выводится ошибка:

(!) Notice: undefined index:_GET

laimas 13.10.2015 20:01

$_GET - это суперглобальный массив, и даже при первом открытии этой страницы, когда запроса на сортировку не было, условие $_GET['keyname'] никогда не вернет ошибки ибо $_GET['keyname'] в этом случае вернет что и положено - null, если выключать вывод предупреждений на экран, что на удаленном сервере обязательно нужно делать, в том числе и не выводить ошибки, а писать их в лог. файл.

Notice: - это не ошибка, а предупреждение. Делайте дополнительную проверку isset($_GET['keyname']), если не уверены в правоте своей. И я уже говорил, где-то до вывода уже должна быть проверка пришедших параметров (ключей) сортировки, используйте их.

steepfox 13.10.2015 23:46

А можно по другому это сделать?

laimas 14.10.2015 00:05

По другому это как? Ну так по уму списки выгодно выводить в цикле, дабы не писать по много раз одно и то же, да если еще и в значения опций помещать только изменяемое, а не все скопом, то все упрощается. Кроме того, два ключа определяют 4 набора сортировки, которые с успехом можно заменить на 0-3, где четные значения определяют сортировку tsort по возрастанию, нечетные по убыванию, а деленное по модулю 2 это значение определит поле сортировки sort.

В цикле получаем код списка сравнивая итерацию с единственным GET параметром (0-3), и если равны, то выбираем опцию.

Еще по другому, это на клиенте всю портянку значений опций сравнивать параметром url, но я даже и писать такого не буду, такое можно советовать только ленивым. ;)

steepfox 14.10.2015 00:59

Наконец нашел код, где формируются код тегов option, нужно только определиться, какую из них использовать, а как это сделать не понимаю. Сам код:

<?php


function formation_html_select_from_mas($mas,$on_choose_value=false,$choose_value="",$on_add_begin=false,$value_add_begin=-1,$name_add_begin="Выберите...",$return_only_html = false)
  {
   
   $html="";
   $selected=false;
   
   foreach ($mas as $key => $value)
     {
      $element_choose="";
      if ($on_choose_value && $choose_value == $key)
        {
         $element_choose="selected='selected'";
         $selected=true;
        }
      $html.="<option $element_choose value='$key'>$value</option>";
     }
   if ($on_add_begin)
     {
      $html="<option value='$value_add_begin'>$name_add_begin</option>".$html;
     }
   if ( !$return_only_html )
     $rez=array("html"=>$html,"selected"=>$selected);
    else
      $rez = $html;
   return ($rez);
  }


function formation_html_select_from_mas_rows($mas,$key_value,$key_name,$on_choose_value=false,$choose_value="",$on_add_begin=false,$value_add_begin=-1,$name_add_begin="Выберите...",$return_only_html = false)
  {
   // если $key_value равняется false, то для значения option будет браться ключ соответствующей строки массива
   $html="";
   $selected=false;
   
   foreach ($mas as $key_row => $one_row)
     {
      $key= ( ( $key_value === false ) ? $key_row : $one_row[$key_value] );
      $value=$one_row[$key_name];
      $element_choose="";
      if ($on_choose_value && $choose_value == $key)
        {
         $element_choose="selected='selected'";
         $selected=true;
        }
      $html.="<option $element_choose value='$key'>$value</option>";
     }
   if ($on_add_begin)
     {
      $html="<option value='$value_add_begin'>$name_add_begin</option>".$html;
     }
   if ( !$return_only_html )
     $rez=array("html"=>$html,"selected"=>$selected);
    else
      $rez = $html;
   return ($rez);
  }

laimas 14.10.2015 05:05

Из серии "найди пять отличий"? :) Нет бы проверять аргументы и соответственно выполнение, плодятся близнецы именами разные.

Какая используется - так по имени функции, не хватает на это опыта, так на время выяснения предварите вывод списка произвольным текстом, по которому и будет найдено, например в первой функции строку 7 заменить на $html="Ищу 1";, а во второй строку 35 на $html="Ищу 2";

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

steepfox 14.10.2015 11:15

Разработчик движка сказал,что именно эти функции используются.

steepfox 14.10.2015 11:17

Как связать все это дело с предыдущим кодом? Так как используется при выборе фильтрации 5 пунктов.

laimas 14.10.2015 11:37

Цитата:

Сообщение от steepfox
Разработчик движка сказал,что именно эти функции используются.

Разработчик? Так третируйте его, что же вы маетесь, с бедламом вашего разработчика даже с коньяком не охота разбираться. :)

Вы задайте своему разработчику вопрос - как может код на физически существующей странице, в котором не чисто html-результат некой функции, а монотонно прописанная строка каждой опции списка с php-вставками, может иметь отношение к некой функции?

laimas 14.10.2015 11:42

Цитата:

Сообщение от steepfox
Как связать все это дело с предыдущим кодом?


Что именно связать - функции разработчика с кодом, который вы ранее показывали? Так это с вопросом к разработчику.

Цитата:

Сообщение от steepfox
Так как используется при выборе фильтрации 5 пунктов.


Да хоть 55, и если не описывать каждый набор "портянками", то хоть 255, все равно будет компактно. И эту компактность (наборы) запросто можно описать единственным числом.

steepfox 14.10.2015 11:46

Думаю, что разработчик зависнет от такого вопроса :)

Мне просто нужно, чтобы запоминался выбор, этих пунктов)

"И эту компактность (наборы) запросто можно описать единственным числом." - как это можно сделать, следуя из моего примера?)

laimas 14.10.2015 12:23

Я вам уже рассказывал как - проверять состояния пришедших параметров запроса, и по условию выбирать опцию. Либо на клиенте получаете из url параметры (location.search.substring(1)), ищите списках такие же, можно разделив значение опции по ? и взять второй элемент (.split('?')[1]), можно рег. выражением. Можно полностью сравнивать url со значением, если позволяет. Нашли, выбрали опцию.

Цитата:

Сообщение от steepfox
как это можно сделать, следуя из моего примера?

К вашему примеру это отношения не имеет, это надо полностью переделать подход к описанию параметров фильтра. Рассказывать все не буду, ибо все равно впустую будет. Но, компьютеры работают исключительно на двоичной арифметике, в которой единица (бит) может принимать два состояния, два бита - 4, 3 бита - 8, 4 бита - 16, и т.д. 2 в степени n. Описание различных наборов, это представление из N-бит бит сдвинутых влево на N разрядов, тогда двойным словом (32 разряда) можно описать столько состояний фильтра и сортировки, что даже в вашей базе не найдется столько.

steepfox 15.10.2015 13:52

Спасибо за ответ.)

"Можно полностью сравнивать url со значением, если позволяет."

Как подобное можно реализовать?

laimas 15.10.2015 15:55

Как было написано ранее. Свойство location.href возвращает полный url. Обращение к свойству href тега А также вернет полный url, даже если в нем указан относительный путь, например href="?a=1", включая пртокол, домен, путь и параметры запроса.
Свойство же опции вернет полный url только в случае, если он так прописан.

steepfox 16.10.2015 14:43

Как все сложно.. А на моем примере можно как-то реализовать все это дело?

laimas 16.10.2015 15:59

Какой еще пример нужен. Если используется jQ, то по загрузке страницы обойти опции списка сравнивая их значения с url.

$('selector').children('[value='+location.href+']').prop('selected', 1)


где selector, селектор вашего списка, по которому к нему можно обратиться - имя класса или идентификатора. Значение опции в этом случае должно быть абсолютным путем. Но можно сравнивать только по параметрам запроса, как говорилось выше.

steepfox 18.10.2015 16:02

Спасибо за ответ. Смотрите, данный код можно ли разместить на странице, которая была приведена выше?:

<?php


function formation_html_select_from_mas($mas,$on_choose_value=false,$choose_value="",$on_add_begin=false,$value_add_begin=-1,$name_add_begin="Выберите...",$return_only_html = false)
  {
   
   $html="";
   $selected=false;
   
   foreach ($mas as $key => $value)
     {
      $element_choose="";
      if ($on_choose_value && $choose_value == $key)
        {
         $element_choose="selected='selected'";
         $selected=true;
        }
      $html.="<option $element_choose value='$key'>$value</option>";
     }
   if ($on_add_begin)
     {
      $html="<option value='$value_add_begin'>$name_add_begin</option>".$html;
     }
   if ( !$return_only_html )
     $rez=array("html"=>$html,"selected"=>$selected);
    else
      $rez = $html;
   return ($rez);
  }


function formation_html_select_from_mas_rows($mas,$key_value,$key_name,$on_choose_value=false,$choose_value="",$on_add_begin=false,$value_add_begin=-1,$name_add_begin="Выберите...",$return_only_html = false)
  {
   // если $key_value равняется false, то для значения option будет браться ключ соответствующей строки массива
   $html="";
   $selected=false;
   
   foreach ($mas as $key_row => $one_row)
     {
      $key= ( ( $key_value === false ) ? $key_row : $one_row[$key_value] );
      $value=$one_row[$key_name];
      $element_choose="";
      if ($on_choose_value && $choose_value == $key)
        {
         $element_choose="selected='selected'";
         $selected=true;
        }
      $html.="<option $element_choose value='$key'>$value</option>";
     }
   if ($on_add_begin)
     {
      $html="<option value='$value_add_begin'>$name_add_begin</option>".$html;
     }
   if ( !$return_only_html )
     $rez=array("html"=>$html,"selected"=>$selected);
    else
      $rez = $html;
   return ($rez);
  }




И далее в опциях, к примеру, вместо value="{$obj_doska->base_url_page.$add_param_url_2}", будет value="1"

<select name="sel" onchange="document.location=this.value">

<option value="{$obj_doska->base_url_page.$add_param_url_2}">Обычная сортировка</option>

 
<option  value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=date&tsort=desc" {$obj_doska->name_sort == "date" && $obj_doska->type_sort == "desc" ? $on_class : ""}">Новые</option>

<option value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=date&tsort=asc" {$obj_doska->name_sort == "date" && $obj_doska->type_sort == "asc" ? $on_class : ""}">Старые</option>

<option value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=cost&tsort=desc" {$obj_doska->name_sort == "cost" && $obj_doska->type_sort == "desc" ? $on_class : ""}">Дороже</option>


<option value="{$obj_doska->base_url_page}?{$add_param_url_1}sort=cost&tsort=asc" {$obj_doska->name_sort == "cost" && $obj_doska->type_sort == "asc" ? $on_class : ""}">Дешевле</option>

</select>

laimas 18.10.2015 16:10

А почему не разработчику своему этот вопрос?

Я вообще не понимаю нахрена нужны две функции, которые делают одно и тоже, за небольшим косметическим различием. И с этим вопросом к разработчику.

Последний код, это непосредственно прописанный html-код списка, если вы хотите заменить его вызовом функции, то по причине описанной выше - к разработчику, лично я бы выбросил это к чертовой матери.

Вам уже было показано как это сделать на клиенте, если вы не можете разобраться на сервере.


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