передача данных из сложной формы [способы реализации]

Ivan826

на onclick checkbox'a повешена такая функция
function change
{
var srcElement;
id=window.event.srcElement.id;
if(document.getElementById(id).value=='yes')
{
document.getElementById(id).value='off';
}
else
{
document.getElementById(id).value='yes';
}
}

В ишаке работает, в лисе - нет
Пишет window.event has no properties
Как правильно?

otets-mihail

change(event) ?

dedwowan

передавать ссылку на чекбокс и работать по ней

Ivan826

Да нет, надо просто определить id елемента, который вызвал эту функцию. Как?

pitrik2

ИЕ как всегда использует нестандартные вещи
правильно будет так
(код для отлова нажатия Ентер)
function change(f, e) {
var keycode;
if (window.event)
keycode = window.event.keyCode;
else if (e)
keycode = e.which;
else
return true;
if (keycode == 13) {
if(validateSearch(f
clickSearch(f);
}
return true;
}
а вот как вызывать:
onkeypress="return enterSearch(this.form, event)

pitrik2

если просто сам элемент нао, то зачем извращаться?
function change(el) {
alert(el.value);
}
<input type="checkbox" onClick="change(this)">

Ivan826

немогу править хтмл. Немогу в функцию что-то передать. надо что бы сама определяла id елемента

dedwowan

О чем я и говорил. Почему-то автора это не устраивает

dedwowan

Вообще, насколько я помню, тебе будут посылаться только значения yes, т.к. нечекнутый чекбокс, при сабмите формы на сервер, ничего не передает.

pitrik2

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

pitrik2

лучше скажи что тебе нужно
может придумаем как это по-другому сделать не используя onClick

Ivan826

C этим я наебался в своё время пиздец как. Поэтому при нажатии меняю значение value, а перед сабмитом пробегаю все чекбоксы и "зажигаю" их, что бы значения передавали (иначе я хъуй массив передаваемый разгребу). Сложно короче всё там.
Блин, ребят! Ну есть код, который работает в ишаке
id=window.event.srcElement.id;  
. Хочу точно тоже самое, но работающее в FF! Как?

pitrik2

C этим я наебался в своё время пиздец как. Поэтому при нажатии меняю значение value, а перед сабмитом пробегаю все чекбоксы и "зажигаю" их, что бы значения передавали (иначе я хъуй массив передаваемый разгребу). Сложно короче всё там.
чего за бред?
первый раз ТАКОЕ вижу
на серваке проверяешь пришло значение или нет
если не пришло - значит uncheked
нафига городить такую ерунду?

pitrik2

если ты не можешь менять html
могу предложить такой вариант: добавить листенер на событие через DOM
здесь примеры:
http://lojjic.net/script-library/IEtoW3C-test.html
тойсть ты добавишь к своему чекбоксу обработчик события
и в нем укажешь параметры

Ivan826

Предложи мне иную схему решения такой задачи:

Есть n элементов выводимые построчно. У них есть некие параметры. Из этих параметров 2 типа имя и checkbox долны менятся по нажатию кнопки изменить. То есть по нажатию на checkbox сабмита быть не долджно, по нажитю "Энтер" должно передаваться в фаил, и там менятся всё содержимое checkbox'ов и полей "имя" у всех n элементов. При этом полей "имя" и checkbox'ов может быть не по одному, как на примере, а несколько.

dedwowan

Для конкретно приведенного примера
<inpu type="text" name="name1"> <input type="checkbox" name="show" value="name1"><br>
<inpu type="text" name="name2"> <input type="checkbox" name="show" value="name2"><br>
<inpu type="text" name="name3"> <input type="checkbox" name="show" value="name3"><br>
В результате передается 3 переменные name1, name2, name3 и массив show, в котором перечисляются обьекты, которые надо показывать.
Переделать этот для нескольких текстовых полей и чекбоксов - дело техники.

pitrik2

самый очевидный вариант такой:
пример HTML строчки для элемента:

<tr><td>
Edit <input type="text" name="name_1_1">
<input type="checkbox" name="show_1_1">
</td></tr>

пример, когда 2 имени и 2 чекбокса:

<tr><td>
Edit <input type="text" name="name_1_1">
<input type="checkbox" name="show_1_">
Edit <input type="text" name="name_1_2">
<input type="checkbox" name="show_1_2">
</td></tr>

внизу странички:
<input type="submit" value="изменить">
первое число после подчеркивания означает Id элемента
второе число означает номер поля для этого элемента
теперь обработчик на сервере:
(пишу схематически, потому как не было сказано какой язык)

// size - количество элементов
for(id=1; id <= size; id++) {
int size1 = 5; // количество полей для этого элемента
for(num = 1; num <= size1; num++) {
String name = getParameter("name_" + id + "_" + num);
boolean isChecked = (getParameter("chk_" + id + "_" + num) != null);
// записываем в файл
}
}

Ivan826

1) Нихрена это не массив будет! Для массива надо "name[]" писать.
2) Во вторых в твоём примере, если checkbox не отмечен, он не перешлётся и в массиве мешанина будет
Рябят! Неотмеченный чекбок НЕПЕРДАЁТСЯ!

pitrik2

1) Нихрена это не массив будет! Для массива надо "name[]" писать.
2) Во вторых в твоём примере, если checkbox не отмечен, он не перешлётся и в массиве мешанина будет
Рябят! Неотмеченный чекбок НЕПЕРДАЁТСЯ!
1) это именно массив и будет!
2) да не перешлется но при этом никакой мешанины не будет
да!
НЕ ПЕРЕДАЕТСЯ
кто с этим спорит?
но НАХРЕНА его передавать?
ни на одно сайте он не передается а у тебя передается
НАХРЕНА?
если не передался - значит НЕ ОТМЕЧЕН

dedwowan

1) Это будет таки массив
2) Повторяю для неумеющих читать - это будет масив с именами тех текстовых полей, которые надо показывать. Если имени текстового поля в массиве нет, значит показывать его не надо.
Если даже такого обьяснения тебе мало, то я уж прямо и не знаю, как еще обьяснить

Ivan826

тагда научи глупого как разгребать массив вида
Array ( [name] => Array ( [0] =>раздел [1] => yes [2] => ещё один [3] => off [4] => третий [5] => yes ) [id] => Array ( [0] => 3 [1] => 3 [2] => 2 [3] => 2 [4] => 1 [5] => 1 ) [what] => Array ( [0] => name [1] => view [2] => name [3] => view [4] => name [5] => view ) [query] => edit=text&parent=0 )
в котором в помассиве [what] (собственно что меняем) может неоказаться данных чекбоксов

Ivan826

Это я понимаю, ты расскажи лучше как такой переданный массив разгребать

dedwowan

Никак. У тебя неправильные пчелы, дающие неправильный мед.

dedwowan

оч. просто
1. Обнулить все предыдущие значения
2. Поменять те значения, которые указаны в массиве на еденичку.

pitrik2

как ты получил данные массивы?
[name] [id] [what]
нафига вообще получал их
зачем писать сложно и неправильно, если можно просто и правильно?
может все таки дашь кусок кода
или хотя бы скажешь на каком языке пишешь

Ivan826

Ок. Вот форма (уже сгенерённая)
<form onsubmit="check_checkboxes;" action="actions/change.php" method="post" style="display: inline">
<table border="0" cellpadding="1" cellspacing="0" style="font-size: 11px;margin: 0px; padding:0px;">
<tr><tr><tr><td><a href="actions/change_prior.php?edit=text&act=fullup&id=3"><img style="border: none;" alt="" title="Вверх до конца" src="images/fullup.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=up&id=3"><img style="border: none;" alt="" title="Вверх" src="images/up.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=down&id=3"><img style="border: none;" alt="" title="Вниз" src="images/down.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=fulldown&id=3"><img style="border: none;" alt="" title="Вниз до конца" src="images/fulldown.gif"></a></td>
<td>
<a href="actions/del.php?id=3&query=edit=text&parent=0" class="del" title="Удалить элемент" onClick="if(!confirm('Вы хотите удалить элемент &laquo;павыавыh&raquo;.\nВы уверены?'{return false;}">Del</a>
</td><td style="padding-left: 5px;">
<a href="?id=3&edit=text" title="Редактировать">Edit</a>
</td><td>
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name[]" maxlength="50" value="павыавыh">
<input type="hidden" name="id[]" value="3">
<input type="hidden" name="what[]" value="name">
</td><td class="text">
<input type="checkbox" name="name[]" id="1" onclick="change;" value="yes" checked>Показывать элемент
<input type="hidden" name="id[]" value="3">
<input type="hidden" name="what[]" value="view">
</td></tr><td><a href="actions/change_prior.php?edit=text&act=fullup&id=2"><img style="border: none;" alt="" title="Вверх до конца" src="images/fullup.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=up&id=2"><img style="border: none;" alt="" title="Вверх" src="images/up.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=down&id=2"><img style="border: none;" alt="" title="Вниз" src="images/down.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=fulldown&id=2"><img style="border: none;" alt="" title="Вниз до конца" src="images/fulldown.gif"></a></td>
<td>
<a href="actions/del.php?id=2&query=edit=text&parent=0" class="del" title="Удалить элемент" onClick="if(!confirm('Вы хотите удалить элемент &laquo;иваива&raquo;.\nВы уверены?'{return false;}">Del</a>
</td><td style="padding-left: 5px;">
<a href="?id=2&edit=text" title="Редактировать">Edit</a>
</td><td>
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name[]" maxlength="50" value="иваива">
<input type="hidden" name="id[]" value="2">
<input type="hidden" name="what[]" value="name">
</td><td class="text">
<input type="checkbox" name="name[]" id="2" onclick="change;" value="off">Показывать элемент
<input type="hidden" name="id[]" value="2">
<input type="hidden" name="what[]" value="view">
</td></tr><td><a href="actions/change_prior.php?edit=text&act=fullup&id=1"><img style="border: none;" alt="" title="Вверх до конца" src="images/fullup.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=up&id=1"><img style="border: none;" alt="" title="Вверх" src="images/up.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=down&id=1"><img style="border: none;" alt="" title="Вниз" src="images/down.gif"></a></td>
<td><a href="actions/change_prior.php?edit=text&act=fulldown&id=1"><img style="border: none;" alt="" title="Вниз до конца" src="images/fulldown.gif"></a></td>
<td>
<a href="actions/del.php?id=1&query=edit=text&parent=0" class="del" title="Удалить элемент" onClick="if(!confirm('Вы хотите удалить элемент &laquo;Аля улю&raquo;.\nВы уверены?'{return false;}">Del</a>
</td><td style="padding-left: 5px;">
<a href="?id=1&edit=text" title="Редактировать">Edit</a>
</td><td>
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name[]" maxlength="50" value="Аля улю">
<input type="hidden" name="id[]" value="1">
<input type="hidden" name="what[]" value="name">
</td><td class="text">
<input type="checkbox" name="name[]" id="3" onclick="change;" value="yes" checked>Показывать элемент
<input type="hidden" name="id[]" value="1">
<input type="hidden" name="what[]" value="view">
</td></tr>
</table>
<input type="hidden" name="query" value="edit=text&parent=0">
<br><input type="submit" class="submit" value="Изменить">
</form>

вот JavaScript
 function check_checkboxes
{
for( var i = 1; i <= 3; i++ )
{
document.getElementById(i).checked=true;
}

}
function change
{
var srcElement;
id=window.event.srcElement.id;
if(document.getElementById(id).value=='yes')
{
document.getElementById(id).value='off';
}
else
{
document.getElementById(id).value='yes';
}
alert(document.getElementById(id).value);
}

вот обработчик (change.php)
foreach($_POST["id"] as $id)
{
$what=$_POST["what"][$i];

$name=$_POST["name"][$i];
mysql_query("UPDATE ".$row["edit"]." SET ".$what."='".addslashes($name)."' WHERE id='".$id."'")or die("Database error!: ".mysql_error;
$i++;
}

Язык - PhP.

pitrik2

mysql_query("UPDATE ".$row["edit"]." SET ".$what."='".addslashes($name)."'")or die("Database error!: ".mysql_error;
поясни строчку
не понимаю какая строчка в таблице изменится
если сделать так:
UPDATE tablename SET name='name'
то изменятся ВСЕ строчки в таблице
это явно не то что нужно...

Ivan826

Блин, сорри, вырезал чуть больше лучайно
mysql_query("UPDATE ".$row["edit"]." SET ".$what."='".addslashes($name)."' WHERE id='".$id."'")or die("Database error!: ".mysql_error;

pitrik2

просто по оператору Update можно понять структуру БД и тогда можно дать тебе правильный код и указать ошибки в твоем

pitrik2

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

Ivan826

А ты думаешь в чём смысл изъёба с чекбоксами? Как раз для того что бы данные пришли в нужном порядке. Они в нужном порядке и приходят, проверь.
Если ты предложишь мне код обработчика (нне на 10 страниц, а компактного) работающего с данными пришедшими в разнобой - респект и пиво тебе обеспечено

pitrik2

почему нельзя вот эту строчку заменить на чтото такое:
$name=$_POST["name"][$i];
if($what == 'view' && $name == null)
$name = 'no';
таким образом будут обрабатываться неприходящие чекбоксы
(сорри, не помню синтаксиса ПХП, но думаю понятно что я имею ввиду)

pitrik2

тьфу блин
уже сам понял что так не выйдет
тьфу блин
нужно енто дело В КОРНЕ переписать

Ivan826

Предложи как! Я с радостью! Меня самого это парит, ибо на модемном коннекте юзверь видит после сабмита галки во всех чекбоксах, и его это этого подклинивает

pitrik2

правильный код будет такой:

foreach($_POST["id"] as $id) {
$iName = $_POST["name_".$id];
$iView = $_POST["view_".$id];
if($iView == null)
$iView = 'no';
mysql_query("UPDATE ".$row["edit"]." SET name='".addslashes($iName)."', view='".addslashes($iView)." WHERE id='".$id."'")or die("Database error!: ".mysql_error;
$i++;
}

Ivan826

Нифига не получается - смещение значений произходит

pitrik2

вот эту хренотень
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name[]" maxlength="50" value="Аля улю">
<input type="hidden" name="id[]" value="1">
<input type="hidden" name="what[]" value="name">
</td><td class="text">
<input type="checkbox" name="name[]" id="3" onclick="change;" value="yes" checked>Показывать элемент
<input type="hidden" name="id[]" value="1">
<input type="hidden" name="what[]" value="view">
заменяем на:
<input type="hidden" name="id[]" value="1">
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name_1" maxlength="50" value="Аля улю">
</td><td class="text">
<input type="checkbox" name="view_1" value="yes" checked>Показывать элемент
обрати внимание
мой код стал В РАЗЫ короче твоего

pitrik2

я как раз сделал то что мы тебе и говорили
имеем хидден массив айдишников
<input type="hidden" name="id[]" value="1">
<input type="hidden" name="id[]" value="2">
<input type="hidden" name="id[]" value="3">
и имеем сами поля, в названиях которых указан айдишник
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name_1" maxlength="50" value="Аля улю">
<input type="checkbox" name="view_1" value="yes" checked>
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name_2" maxlength="50" value="Аля улю">
<input type="checkbox" name="view_2" value="yes" checked>
<input type="text" class="inp3" style="width: 200px;" title="элемента" name="name_3" maxlength="50" value="Аля улю">
<input type="checkbox" name="view_3" value="yes" checked>

Ivan826

Ты убил некоторые вещи возникшие из-за модульности структуры (элементы строки набираются автоматически а от проблемы неотсылания так и не избавился

pitrik2

Ты убил некоторые вещи возникшие из-за модульности структуры (элементы строки набираются автоматически а от проблемы неотсылания так и не избавился
я убил неверный код
в чем проблема набирать автоматически мой код?
где это я нарушил модульность?
я только удалил неверный(избыточный) html-код
проблемы неотсылания НЕТУ
как можно избавиться оттого чего и так нету?
в моем коде такой проблемы нет в принципе
он короче твоего в разы
а для юзверей сидящих на модеме короткий код - это главное

Ivan826

Слуша, я повтыкал, ты прав по ходу!
Завтра попробую реализовать.

pitrik2

Слуша, я повтыкал, ты прав по ходу!
Завтра попробую реализовать.
блин
ну что ты за человек
ты никогда не слушаешь что тебе говорят?
это не я прав
это правы все программисты мира
все так делают
я никогда не задумывался лучший ли это способ или нет
но он по любому лучше твоего

avinir60

Есть такая штука:

function onClick(evt)
{
if (_isIe)
var id = getId(event.srcElement.id);
else
var id = getId(evt.target.id);
alert(id);
}

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

pitrik2

товарищ
вы не читали предыдущие посты?
он же сказал: ему хочется чтобы у функции не было параметров
а так сделать невозможно
как сделать с передачей параметра evt в функцию - это и так всем понятно
Оставить комментарий
Имя или ник:
Комментарий: