|
|
|
| Здравствуйте уважаемые форумчане.
Существует многостроничный раздел сайта, на каждой странице которого находится
определённое количество записей с checkbox.
После нажатия кнопки должны показываться все отмеченные записи, независимо от того на
какой странице были поставлены галочки.
Проблема в том как запоминать отмеченные checkbox, при переходе на
другую страницу. Т.е роблема иммено в способе сохранения значений массива, а не в
отправке формы по ссылке на другую страницу (это и так понятно).
Всё это ослажняется тем, что уже открытые записи (т.е которые были нами помечены
до нажатия на кнопку), должны каждая иметь возможность быть закрыта(ссылка "ЗАКРЫТЬ")
независимо от других.
Дак вот где лучше и правильней сохранять значения массива checkbox. (Куки не наш метод))) ) | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 13:43)
| | А сессия что не годится? | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 13:43)
| | передавать информацию об отметках в скрытом поле формы. | |
|
|
|
|
|
|
|
для: Trianon
(17.09.2008 в 13:53)
| | Т.е отметили , кликнули по ссылке на другую страницу, отправив этим форму, першли на другую страницу, присвоили скрытому полю значение из адресной строки, снова перешли и прибавили к старому значению скрытого поля новый url и т.д. ? | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 14:15)
| | >Т.е отметили , кликнули по ссылке на другую страницу, отправив этим форму, першли на другую страницу, присвоили скрытому полю значение из адресной строки, снова перешли и прибавили к старому значению скрытого поля новый url и т.д. ?
В том, что Вы написали я не понял ни слова.
реализация может быть произвольной.
Суть же в том, что в форме, помимо чекбоксов этой страницы, присутствует скрытое поле (поля) , передающее информацию об элементах на других страницах. | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 14:15)
| | Чет не понятно. А зачем вам на другой странице данные о чекбоксах предыдущей страницы? Вы ведь на этой странице не разотметите все равно чекбоксов с предыдущей. | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 13:43)
| | а не в отправке формы по ссылке на другую страницу (это и так понятно)
Значения полей формы отправляются скрипту обработчику, у уж сформирует он страницу или нет
это уже совсем другая история.
Дак вот где лучше и правильней сохранять значения массива checkbox. (Куки не наш метод))) )
На сервере. И если вас (как и меня в данном случае) не устраивает сессия, то используйте файлы (если это какой-нибуть конфигурационный файл) или базу данных (я выбираю БД)
2 sim5 не поверите я горячё люблю и обажаю сессии, но это опять не тот случай... так уж вышло))) | |
|
|
|
|
|
|
|
для: Valick
(17.09.2008 в 15:07)
| | Вы сперва спросите у автора - ему это постоянно надо, или на время сессии, а потом уж в любви объясняйтесь. ) | |
|
|
|
|
|
|
|
для: sim5
(17.09.2008 в 15:09)
| | >Чет не понятно. А зачем вам на другой странице данные о чекбоксах предыдущей страницы? Вы ведь на этой странице не разотметите все равно чекбоксов с предыдущей.
Мне не нужно их разотмечать, мне нужны id тех записей которые были отмечены.
т.е. при нажатии на кнопку "показать" должны выводиться только те записи которые были помечены независимо от того на какой странице эта гадость произашла).
ИМХО: работать с GET проще чем с переменной сесии и куками, учитывая то, что уже показанные записи(которые у нас вывились после нажатия на кнопку "показать") должны иметь возможность быть закрытыми по одной. | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 16:07)
| | Зачем вам в строку собирать эти значения? Если вы будете при преходах со страницы на страницу "прикручивать" этот выбор с каждой страницы, думаю, вы понимаете какой длины портянка к вашему url будет "пришита"?
Вы говорите словами общими, а не конкретными, те есть что и как у вас, потому и я вам говору в общем.
1. Можно держать в сессии массив выбранных чекбоксов, имя которого равно имени страницы (или ее id).
2. Можно хранить переменную по имени страницы или ее id, которая будет содержать маску указывающую на состояния чекбоксов.
Нужно вам узнать, что творилось на странице, получаете массив/переменную этой страницы из сессии и... чего вам хочется. | |
|
|
|
|
|
|
|
для: Valick
(17.09.2008 в 15:07)
| | To Valick.
Ради такой мелочи использовать БД не хочется - должны быть менее затратные способы.
Но это ИМХО. | |
|
|
|
|
|
|
|
для: new_user
(17.09.2008 в 16:11)
| | должны быть менее затратные способы
А гонять туда сюда ненужные данные не накладно? Но если уж так хочется сериализуйте и передавайте как сказал Трианон, скрытым полем, ну уж ни как не засовывайте их в URL | |
|
|
|
|
|
|
|
для: Valick
(17.09.2008 в 20:12)
| | Их даже скрытым полем передавать не надо. А сессия будет работать быстрее, чем обращения к базе. Да и вообще, если бы речь шла о сохранении и для каждого авторизованного юзера, тогда еще можно вести разговор о сохранении в базе, иначе как вы себе представляете такое сохранение? Если для всех одно значение в таблице, то значит уровнять всех пользователей, хочет кто-то или не хочет... | |
|
|
|
|
|
|
|
для: sim5
(17.09.2008 в 20:39)
| | >Их даже скрытым полем передавать не надо. А сессия будет работать быстрее, чем обращения к базе.
Собственно, я посоветовал (и в общем-то настаиваю на) передавать данные скрытым полем, из тех соображений, что сервер один, а пользователей много. И если есть возможность малой кровью освободить сервер от нагрузки, которую вполне может взять на себя клиент - это нужно сделать. В данном случае совершенно непонятно, зачем серверу хранить что-то между обращениями.
И даже более того. Если я открою подобную страницу сразу в двух окнах - я буду ожидать, что наборы элементов для этих окон будут обрабатываться независимо. С сессиями такой номер либо совсем не пройдет, либо потребует изрядных извращений. | |
|
|
|
|
|
|
|
для: Trianon
(18.09.2008 в 00:17)
| | Trianon, а зачем передавать скрытым полем, если нам надо перенести эти данные только временно - от одной страницы к другой? А далее их в любом случае надо где-то сохранить. Ведь в конечном итоге, никак не хорошо будет, если накапливать их в скрытых полях. Почему вы считаете что не пойдет сессиях? Давайте рассуждать. Первое, не известно как отдаются эти состояния - либо после их выбора отправляем форму, либо пользователь может отметить чекбоксы и уйти на другую страницу. А также не известно, каким образом осуществляется адресация страниц. К тому же, если запоминать состояния нужно не только при переходе от странице к странице, а нужен сквозной перенос через любое число страниц, то сколько же накопится скрытых полей? Да и нужно будет учитывать, чтобы не появились дубликаты таких полей.
Не понятно, что имеет ввиду автор под "Скрыть", если это на стороне клиента, то опускаем это и относим к другой задаче. Остальное я бы сделал так, предполагая, что отправки формы при выборе чекбоксов не предполагается, и они служат только как информация о выборе того или иного на странице. К примеру, страницы выводятся по id. Тогда:
<script>
//функция получения состояний чекбоксов на странице
//и передачи маски их состояния в url запрос
function setCheck(n) {
var lnk = document.getElementById("chk").href;
if (lnk.indexOf("bit") < 0) {
lnk += "&bit=" + Math.pow(2,n-1);
document.getElementById("chk").href = lnk;
} else {
var bt = lnk.substr(lnk.lastIndexOf("=")+1);
bt ^= Math.pow(2,n-1);
document.getElementById("chk").href = lnk.slice(0, lnk.lastIndexOf("=")+1)+bt;
}
}
</script>
<input type="checkbox" name="as[]" value="1" onclick="setCheck(this.value)"><br>
<input type="checkbox" name="as[]" value="2" onclick="setCheck(this.value)"><br>
<input type="checkbox" name="as[]" value="3" onclick="setCheck(this.value)">
<a id="chk" href="untitled1.html?pid=1">Page 1</a>
|
В этом случае мы всегда будем передавать с каждой страницы маску состояний чекбоксов. На сервере, на любой запрашиваемой странице, пишем:
<?
session_start();
if (!isset($_SESSIN['check'])) $_SESSIN['check'] = array();
if (isset($_GET['bit'])) $_SESSIN['check'][$_GET['pid']] = $_GET['bit'];
|
Тогда мы будем иметь массив с ключами id страниц и со значениями состояния чекбоксов на этих страницах. Ну а далее уже что хочется. Достаточно, зная id запрашиваемой страницы, число необходимых чекбоксов на ней, при выводе этих чекбоксов, проверять в массиве $_SESSIN['check'] наличие индекса и отметить (как выбранные) чекбоксы, которые установленны, согласно маске. Ну может еще и скрыть описания не выбранных чекбоксов и т.п..
Чем этот вариант плох и как сильно он будет загружать червер? | |
|
|
|
|
|
|
|
для: sim5
(18.09.2008 в 08:25)
| | Зачем накапливать скрытые поля - вроде достаточно одного?
Такой вариант (грубый)
<?php
if ( !empty($_GET['box']) ) {
foreach($_GET['box'] as $index=>$val) {
$_box.= $index.',';
}
$_box = substr( $_box, 0, strlen($_box)-1 );// отрезаем последнюю запятую
if ( $_GET['url']!=='' ) {
$_box = $_GET['url'].','.$_box; // если скрытое поле не пустое прибавляем к существующим новые значения
}
if (isset( $_GET['button']) ) {// если нажата кнопка делаем запрос к БД
@mysql_query("SELECT * FROM table WHERE id IN(".$_GET['url'].")");//далее в php блоке обработка результата из БД.
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Untitled Document</title>
</head>
<body>
текущяя стр. <?php echo $_GET['page']?>
<form id="form1" name="form1" method="get" action="">
<label>
<input type="checkbox" name="box[1]" value="1" />
<br />
</label>
<label>
<input type="checkbox" name="box[2]" value="2" />
<br />
</label>
<label>
<input type="checkbox" name="box[3]" value="3" />
</label>
<p><br />
<br />
<input type="text" name="page" id="_page" /><!--в этом поле хранится номер страницы (поле должно быть скрытым)-->
<br />
<br />
<input type="text" name="url" id="_url" value="<?php echo $_box?>" /><!--здесь хранятся ранее отмеченные checkbox (поле должно быть скрытым)-->
</p>
<p>
<input type="submit" name="button" id="button" value="Submit" />
</p>
<p>pages
<a href="#" onclick="document.getElementById('_page').value='1';document.forms['form1'].submit();">1</a> |
<a href="#" onclick="document.getElementById('_page').value='2';document.forms['form1'].submit();">2</a> |
<a href="#" onclick="document.getElementById('_page').value='3';document.forms['form1'].submit();">3</a>
</p>
</form>
</body>
</html>
|
| |
|
|
|
|
|
|
|
для: new_user
(18.09.2008 в 09:37)
| | Так если вам нужно получить эти состояния на другой странице, и после этого успешно забыть их, тогда хватит и одного. Но тогда вообще нафик ничего не надо никаких скрытых полей, вообще ничего, если разобраться. А вот это зачем?:
<a href="#" onclick="document.getElementById('_page').value='1';document.forms['form1'].submit();">1</a> | |
|
|
|
|
|
|
|
для: sim5
(18.09.2008 в 09:41)
| | Мне их нужно помнить до нажатия на кнопку (извините если раньше непонятно написал).
>А вот это зачем?:
<a href="#" onclick="document.getElementById('_page').value='1';document.forms['form1'].submit();">1</a>
При переходе на другую страницу, что бы узнать отмеченные чекбоксы мне надо отправить форму(document.forms['form1'].submit;) и при этом не забыть на какую стр. я хочю попасть(document.getElementById('_page').value='1';).
>Но тогда вообще нафик ничего не надо никаких скрытых полей, вообще ничего, если разобраться.
Это как? Объясните пожалуста. | |
|
|
|
|
|
|
|
для: new_user
(18.09.2008 в 10:05)
| | Не городите ерунды! Зачем тогда вам чекбоксы, коли вы управляете значениями с помощью ссылок? При каждом клике вы отправляете форму, а значит можно выбрать только один чекбокс! А вам нужна возможность выбора нескольких, не так-ли? И именно проблема этого вас волнует, которую вы неверно назвали в теме своей "сохранением"? Вы либо неверно формулируете свой вопрос, либо не можете объянить чего вам надо. Поэтому, по крайней мере для меня, то что вы делаете сейчас, это полный бред. | |
|
|
|
|
|
|
|
для: sim5
(18.09.2008 в 10:12)
| | Вы код смотрели, мы в переменной $_GET['url'], после нажатия на "красную кнопку" имеем значения всех чекбоксов(), отмеченных на всех из трёх страниц.
Если это бред, скажите как лучше (после того как всё стало понятно).
ЗЫ. А вопросы я действительно формулирую не очень. Извините. | |
|
|
|
|
|
|
|
для: new_user
(18.09.2008 в 10:52)
| | Я к тому, что вы имеете три ссылки (кстати их всего и будет 3?), по этой ссылке вы что-то получаете в базе. Из переданных чекбоксов вы чего-то там получаете и все. Что они у вас делают эти значения? Чему у вас служат эти чекбоксы, если они не ничего не выполняют, и тем неменее вы хотите гонять их между страницами?
Вы напишите подробно суть того, чего в конечном итоге вы хотите, для чего эти чекбоксы, почему их значения надо сохранять? Как сохранять, чтобы можно было получить их значения на любой произвольной странице? И т.д.. | |
|
|
|
|
|
|
|
для: sim5
(18.09.2008 в 11:22)
| | Будет результат поиска по 11 параметрам (все передаются по GET), выводимый постранично (число выводимых записей на одной странице задаётся юзером и сохраняется в кук, страниц конечно будет не 3), напротив каждой записи есть чекбокс, value которого соответствует айдишнику этой записи(записи ессно берутся из БД).
Юзер отмечает нужное, переходит на другую страницу, там тоже отмечает и т.д., но поняв что уже пора остановится, нажимает "красную кнопку", условно названную "показать все, что Вы наотмечали на этой и предыдущих страницах".
Мне нужны id отмеченных записей(на любой странице), что бы вставить их SQL- запрос.
для Trianon
>А при чем здесь php?!
Если Вы имели ввиду JS то:
1. PHP привычней,
2. На JS переносить данные от одной странице к другой я могу только куками или опять же через URL(наверно). | |
|
|
|
|
|
|
|
для: new_user
(18.09.2008 в 12:23)
| | >но поняв что уже пора остановится, нажимает "красную кнопку"
Аргумент конечно железный :) А если не поймет, тогда что?
Трудно представить что надо искать, толи в этих записях, но что? Толи сами записи, а не много ли? Может быть сделать поиск как: на сайте, в разделе, на странице...? Вы уж как-то оганичьте запрос на поиск, хотя, повторяю, непонятно чего вам искать. Но коли вам нужны id записей, то лучше их хранить все таки в сесии, так как у вас нет гарантии того, что юзер вернется со страницы Z на страницу К и не разотметит какой либо ранее выбранный чекбокс. В этом случае, как вы собираетесь перебирать вашу запись в скрытом тексте, чтобы удалить id разотмеченного чекбокса? Вам в любом случае потребуется для этого JS. К тому же, при любых возвратах, пользователь должен видеть ранее выбранное им, иметь возможность что-то удалить из выброа, что-то добавить... И как вам тут поможет скрытое поле? Не майтесь вы, сессия хороший инструмент для этого, а вот хранить где-то id страницы не надо, зачем это? | |
|
|
|
|
|
|
|
для: sim5
(18.09.2008 в 13:06)
| | >К тому же, при любых возвратах, пользователь должен видеть ранее выбранное им, иметь возможность что-то удалить из выброа, что-то добавить...
Перебъется))). А так да логично.Спасибо
После всех перипитий интересно мнение Trianonаа. | |
|
|
|
|
|
|
|
для: new_user
(18.09.2008 в 13:58)
| | Нельзя так, если вы уж хотите дать свободу выбора пользователю, то что это за свобода? Вас просто материть будут нещадно. | |
|
|
|
|
|
|
|
для: new_user
(18.09.2008 в 10:05)
| | А при чем здесь php?! | |
|
|
|
|
|
|
|
для: sim5
(18.09.2008 в 08:25)
| | >Trianon, а зачем передавать скрытым полем, если нам надо перенести эти данные только временно - от одной страницы к другой?
Так ведь не факт, что этот переход произойдет.
Таким образом я на клиентской стороне накапливаю аргументы запроса.
Когда Пользователь нажмет окончательную "красную кнопку" - запрос будет отдан на исполнение.
Вот тогда и придется чего-то сохранять, удалять, перекладывать из таблицы в таблицу и т.п.
А до тех пор, сервер считает, что его и не трогали.
>А далее их в любом случае надо где-то сохранить. Ведь в конечном итоге, никак не хорошо будет, если накапливать их в скрытых полях.
Я как раз считаю, что там им самое место. Необязательно - в скрытых, но обязательно - в аргументах запроса.
>Почему вы считаете что не пойдет сессиях?
Да не считаю я, что не пойдет.
Я считаю, что не нужно, если можно избежать. | |
|
|
|
|
|
|
|
для: Trianon
(18.09.2008 в 10:01)
| | Ну теперь это уже чисто риторически, коли автор "высказался наконец-то" :) А после высказывания, стало понятно, что вообще к чему все это, если при каждом выборе он отправляет форму. О каком сохранении каких-то состояний может идти речь, если при таком способе будет отправлено только одно тукущее изменение? Нафига тогда все нужно, хотелось бы спросить автора? :) | |
|
|
|
|