Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Передача значения из js в php при onclick в html (https://javascript.ru/forum/events/44324-peredacha-znacheniya-iz-js-v-php-pri-onclick-v-html.html)

malltaf 15.01.2014 18:19

Передача значения из js в php при onclick в html
 
Добрый день. Есть связка html, javascript, php. Нужно, чтобы в $res записывалась текущий value из select'а. Т.е. пользователь выбрал 66, в $res передалось 6, изменил выбор на 55, передалось 5 и т.д.
Не пойму, что именно делаю не так. Подскажите, будьте любезны, знатоки, надеюсь на вашу помощь. Спасибо.

P.S. На данный момент он передает только первое значение по умолчанию при загрузке страницы, т.е. 4, на onclick не реагирует.
<html>  
<select id="usrstrcol" onchange="add()" name='usrstrcol'>   
  <option value="4" />44
  <option value="5" />55
  <option value="6" />66
</select>
<br>
</html>

<script type="text/javascript">
function add(){
var slct=document.getElementById('usrstrcol').value;
return slct;
}
</script>

<?php 
if (isset($_GET['slct']))
 {    
  $res = $_GET['slct'];
  echo "через js: ". $res;
 }
 else
 {
  // Вызов файла средствами javaScript с параметрами через метод GET
  echo "<script type='text/javascript'>\n";
  echo "location.href=\"${_SERVER['SCRIPT_NAME']}?${_SERVER['QUERY_STRING']}" . "&slct=\" + add();\n";
  echo "</script>\n";
  exit();
 }
?>

kostyanet 15.01.2014 22:57

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

Кто вас так научил делать? Нарисуйте форму и грузите ее элементарным способом через onchange="this.form.submit()" списка. На сервере, соответственно, проверяйте по имени списка.

Вот все что вам надо:

<html>  
<form name="form" action="" method="get">
<select id="usrstrcol" onchange="this.form.submit()" name='usrstrcol'>   
  <option value="4" />44
  <option value="5" />55
  <option value="6" />66
</select>
</form>
</html>


И на сервере

if(isset($_GET['usrstrcol']) // blah-blah-blah...

kostyanet 15.01.2014 23:02

Цитата:

${_SERVER['QUERY_STRING']}
Что за хрень? Легких путей не ищите, да?

Чтобы форма поддерживала все необходимые аргументы в $_SERVER['QUERY_STRING'] в нее надо набить столько скрытых полей, сколько аргументов требуется поддержать.

Отсюда мораль. Когда get-ссылок больше чем в форме полей, то проще перейти на ссылки вообще. То есть сделать список в формате ul-li в каждом элементе которого будет тупо готовая ссылка.

malltaf 16.01.2014 11:04

Сделал, как Вы написали (касательно формы). Теперь страница обрабатывается при выборе value и передается серверу, но при этом невозможно выбрать дефолтное значение (44), при его выборе ничего не происходит, или если сделать дефолтным другое ("5" selected />, например), то его выбор также не передается на сервер. Как это исправить возможно? Думаю, это же решит проблему передачи дефолтного значения сразу на сервер при первой загрузке страницы.
Спасибо.

P.S. ВОЗМОЖНО НЕСУЩЕСТВЕННАЯ ИНФОРМАЦИЯ.
Опишу подробнее изначально желаемое: на сайте должен быть выбор количества выводимых товаров (10, 25, 50, 100, к примеру), это самое количество хранится/записано в простой переменной php, которая потом обрабатывается в функции вывода этих товаров. Решив проблему в этом вышеприведенном и, казалось бы, несложном коде, подозреваю, что решу ее и на сайте. Надеюсь на вашу помощь.

<html>  
<form name="form" action="" method="get">
<select id="usrstrcol" onchange="this.form.submit()" name='usrstrcol'>   
  <option value="4" />44
  <option value="5" />55
  <option value="6" />66
</select>
</form>
</html>

<?php
if(isset($_GET['usrstrcol']))
 {    
  $res = $_GET['usrstrcol'];
  echo "через js: ". $res;
 }

malltaf 16.01.2014 13:28

Исправил ситуацию, добавив на сервере 4, как дефолтное значение.

else
 {
 $res = 4;
  echo "через js: ". $res;


Но, к сожалению, при выборе 44 (или повторном выборе любого дефолтного значения) по-прежнему ничего не происходит.

Кроме того, как сделать так, чтобы при выборе select выбранное значение оставалось выбранным, а не сбрасывалось на дефолтное (хотя в $res и оставляет верное значение)?

kostyanet 18.01.2014 02:30

Короче, все что написано на сервере в value то и будет default value. value элемента который имеет value будучи предустановленным является значением по умолчанию, его нельзя "сбросить" стандартными методами, типа кнопкой reset. Только программно - скриптом, например.

kostyanet 18.01.2014 02:35

Цитата:

на сайте должен быть выбор количества выводимых товаров (10, 25, 50, 100, к примеру),
Юзер выбрал 50. Вы показали ему 50 и поставли selected="selected" элементу в котором 50. Юзер не может выбрать еще раз 50, потому что оно уже выбрано и показано.

Цитата:

как сделать так, чтобы при выборе select выбранное значение оставалось выбранным,
У вас есть данные что юзер выбрал, ваш этот $res. Когда создается список надо проверять совпадение и обозначать выбор.

Нашел для списков. С ними гораздо проще чем с кнопками на хтмле:

echo '<label>Страница:<select name="' . $key . '" onchange="this.form.submit()">', PHP_EOL;
			foreach($this->pages as $value => $index) {
				echo '<option value="', $value, '"';
				echo ($index) ? ' selected="selected"' : null,'>';
				echo ($value) ? $value : 'Все';
				echo '</option>', PHP_EOL;
			}
			echo '</select></label>';


А, блин, это же рендер уже. Ну в общем один из $index в массиве всегда 1, остальные 0. Тот который 1 это текущий, активный. Получаете его гетом или чем там.

malltaf 20.01.2014 12:41

На данный момент решил проблему следующим образом:
if(isset($_GET['usrstrcol'])) {    
  $sortval = $_GET['usrstrcol'];
	switch($sortval)
		{
		case(10):
		$colstr='10';
		$c10="selected='selected'";
		break;
		case(25):
		$colstr='25';
		$c11="selected='selected'";
		break;
		case(50):
		$colstr='50';
		$c12="selected='selected'";
		break;
		case(100):
		$colstr='100';
		$c13="selected='selected'";
		break;
		}
}
else {
$sortval = 25;
$colstr = 25;
$c0 = "selected='selected'";
	}
 
$listsort2="
<form name='form' action='' method='get'>
<select id='usrstrcol' onchange='this.form.submit()' name='usrstrcol'>
<option value=''".$c0." disabled='disabled' style='display:none;' />25
<option value='10'".$c10." />10
<option value='25'".$c11." />25
<option value='50'".$c12." />50
<option value='100'".$c13." />100
</select>
</form>";

, где $listsort2 затем выводится на странице с соответствующими шаблонами.

Теперь проблема заключается лишь в том, что при попытке выбрать какое-либо значение в комбо-боксе адрес страницы сбрасывается на дефолтный. Например, я нахожусь на странице http://localhost/?ci...27880&pid=27847, где выбираю значение 50 и вместо того, чтобы оказаться на http://localhost/?cid=catac&id=27880...7?usrstrcol=50, происходит перенаправление на http://localhost/?usrstrcol=50. Как добавить корректный редирект, чтобы оставаться на той же странице, чтобы, собственно, видеть результат своего выбора?
По-прежнему надеюсь на Вашу помощь. Заранее спасибо.

P.S. переменная $colstr и выводит нужное количество товаров на странице.

kostyanet 21.01.2014 13:22

Опять бред. Вместо switch пишется map. То есть массив где например в качестве ключа - ввод, а в качетсве значения - вывод. На входе допустим 5, на выходе допустим 45, на входе член, на выходе яйца, и в таком роде. Синтаксически вместо переключателя получится так

if(isset(my_map[$_GET['user_col']])) // если есть такой ключ и значение не нулл, то что-то сделать

По второму вопросу. Чтобы поддержать GET-ссылку в форме должны быть соответстующие скрытые поля.

Допустим в гете есть параметр cid=cata, а а форме нет такого поля. Естественно форма отправит только те поля, которые есть и которые successful. Следовательно вы добавляете поле

<input type="hidden" name="cid value="cata""/>

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

kostyanet 21.01.2014 13:27

Поэтому если у вас GET-ссылок много, то проще перейти на GET-ссылки целиком и не насиловать форму.

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

Ну вот, а кнопка имеет ссылку, а ссылку надо сгенерить. Поэтому пишется где-то глобальный или классовый генератор ссылок, который общается с GET и сооружает вам по команде что угодно.

В php полезны в этом смысле две функции Pecl: parse_str() и инвариант http_build_query()


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