Здравейте!
Ако заглавието ви се струва странно и чуждо, не бъразйте да отминавате: все някога ще ви се наложи да обработвате падащо меню, чиято стойност е "multiple" - т.е. позволява селектирането на повече от една възможности... или пък ви се налага да прехвърлите масив за обработка към втори скрипт в друг файл...
Причнита да стигна до тук е тази тема:
http://web-tourist.net/forum/viewtopic.php?t=3439&start=15
Въпросът ми обаче е вече много по-широк. Имам Js-код, който прехвърля стойности от едно падащо меню в друго. Стойността на второто меню е "multiple", т.е. избор на янколков ъзможности.
Скрипта работи чудесно, но авторите (макар да са го адресирали за работа с РНР) са допуснали малка неточност - вместо масив, скрипта предава променлива.
Ето скрипта (съдържанието на падащото меню се създава динамично от БД):
<HTML>
<HEAD>
<script type="text/javascript">
function move(fbox, tbox) {
var arrFbox = new Array();
var arrTbox = new Array();
var arrLookup = new Array();
var i;
for(i=0; i<tbox.options.length; i++) {
arrLookup[tbox.options.text] = tbox.options.value;
arrTbox = tbox.options.text;
}
var fLength = 0;
var tLength = arrTbox.length
for(i=0; i<fbox.options.length; i++) {
arrLookup[fbox.options.text] = fbox.options.value;
if(fbox.options.selected && fbox.options.value != "") {
arrTbox[tLength] = fbox.options.text;
tLength++;
} else {
arrFbox[fLength] = fbox.options.text;
fLength++;
}
}
arrFbox.sort();
fbox.length = 0;
tbox.length = 0;
var c;
for(c=0; c<arrFbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrFbox[c]];
no.text = arrFbox[c];
fbox[c] = no;
}
for(c=0; c<arrTbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrTbox[c]];
no.text = arrTbox[c];
tbox[c] = no;
}
}
function selectAll(box) {
for(var i=0; i<box.length; i++) {
box.selected = true;
}
}
</script>
</HEAD>
<BODY>
<form method="POST" name="combo_box" ACTION="prered_1.php">
<table cellpadding="4" cellspacing="0" border="0">
<tr>
<td>
<select multiple size="10" name="list1" style="width:150" onDblClick="move(document.combo_box.list1,document.combo_box.list2)">
<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);
$query="SELECT * FROM sydyrzhanie order by red";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");
$broi=mysql_num_rows($result);
while ($row = mysql_fetch_array($result))
{
$id=$row["id"];
$name=$row["name"];
echo "<option value='$id'>$name</option>";
}
mysql_close();
?>
</select>
</td>
<td align="center" valign="middle">
<input type="button" onClick="move(this.form.list2,this.form.list1)" value="<<" id=button1 name=button1>
<input type="button" onClick="move(this.form.list1,this.form.list2)" value=">>" id=button2 name=button2>
</td>
<td>
<select multiple size="10" name="list2" style="width:150" onDblClick="move(document.combo_box.list2,document.combo_box.list1)">
</select>
</td>
</tr>
<tr><td align="center" colspan="3"><input type="submit" name="submit_button" value="Submit" onClick="selectAll(document.combo_box.list2);"></td></tr>
</table>
</form>
</BODY>
</HTML>
Демо:
http://tntm.org/probna_3/red_2.php
Js-та е взет от тук:
http://www.javascriptkit.com/script/script2/picklist2.shtml
След снощното ровене разбрах, че заради недостатъците на ХТМЛ за да се използва пълноценно опцията "multiple" се налага използването на Js, който да извърши селектирането на избраните опции. Разбрах също и че подобни форми + Js се обработват ДИРЕКТНО от РНР-скриптове:
http://bg2.php.net/manual/en/faq.html.php
(по специално: 4. How do I get all the results from a select multiple HTML tag? и предпоследния пост на потребител по темата: "this code selects all elements with javascript
and hands them over to an array in php")
Вече знам, как да обработя резултата от "multiple"-заявка. Не успях обаче да подкарам Js-та. За да укажем, че ще изпрати масив от формата (повярвайте ми - знам, че изпраща масив!!!) името на формата - отбелязано по-горе в червено- трябва да съдържа знака за масив "[]".
Не разбирам от javascript, но се опитах да сменя името на падащото меню и там, където то се използва. За съжаление след промените ми скрипта не извършва пренасянето м/у двете падащи менюта (каквото е основното му действие).
Въпросът ми е по-скоро свързан с javascript, а не с РНР:
Как във формата и скрипта, където присъства "list2" да се смени на "list2[]". Аз опитах много комбинации, но не успях.
Макар въпросът ми да е свързан с javascript, той касае най-вече работата с РНР, затова си позволявам да го поместя тук. Още повече, че възможността за пренасяне на масиви чрез пост-метода се оказа слабо понятна и на някои опитни програмисти, с които коментирах темата днес.
Ако ви вълнува единствено как да обработвате падащо меню с повече от един избор (а то позволява да си спестите доста код, когато на търсачките си искате да сложите търсене по всички категории напр), погледнете връзката към bg2.php.net, дадена по-горе и вземете наготово скрипта даден в мнението на потребителя.
Ще ми помогнете много обаче, ако ми кажете как да подкарам проблемния javascript.
Благодаря предварително!
Ако заглавието ви се струва странно и чуждо, не бъразйте да отминавате: все някога ще ви се наложи да обработвате падащо меню, чиято стойност е "multiple" - т.е. позволява селектирането на повече от една възможности... или пък ви се налага да прехвърлите масив за обработка към втори скрипт в друг файл...
Причнита да стигна до тук е тази тема:
http://web-tourist.net/forum/viewtopic.php?t=3439&start=15
Въпросът ми обаче е вече много по-широк. Имам Js-код, който прехвърля стойности от едно падащо меню в друго. Стойността на второто меню е "multiple", т.е. избор на янколков ъзможности.
Скрипта работи чудесно, но авторите (макар да са го адресирали за работа с РНР) са допуснали малка неточност - вместо масив, скрипта предава променлива.
Ето скрипта (съдържанието на падащото меню се създава динамично от БД):
<HTML>
<HEAD>
<script type="text/javascript">
function move(fbox, tbox) {
var arrFbox = new Array();
var arrTbox = new Array();
var arrLookup = new Array();
var i;
for(i=0; i<tbox.options.length; i++) {
arrLookup[tbox.options.text] = tbox.options.value;
arrTbox = tbox.options.text;
}
var fLength = 0;
var tLength = arrTbox.length
for(i=0; i<fbox.options.length; i++) {
arrLookup[fbox.options.text] = fbox.options.value;
if(fbox.options.selected && fbox.options.value != "") {
arrTbox[tLength] = fbox.options.text;
tLength++;
} else {
arrFbox[fLength] = fbox.options.text;
fLength++;
}
}
arrFbox.sort();
fbox.length = 0;
tbox.length = 0;
var c;
for(c=0; c<arrFbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrFbox[c]];
no.text = arrFbox[c];
fbox[c] = no;
}
for(c=0; c<arrTbox.length; c++) {
var no = new Option();
no.value = arrLookup[arrTbox[c]];
no.text = arrTbox[c];
tbox[c] = no;
}
}
function selectAll(box) {
for(var i=0; i<box.length; i++) {
box.selected = true;
}
}
</script>
</HEAD>
<BODY>
<form method="POST" name="combo_box" ACTION="prered_1.php">
<table cellpadding="4" cellspacing="0" border="0">
<tr>
<td>
<select multiple size="10" name="list1" style="width:150" onDblClick="move(document.combo_box.list1,document.combo_box.list2)">
<?
$user="***";
$password="***";
$database="***";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$chars="SET CHARACTER SET cp1251";mysql_query($chars);
$query="SELECT * FROM sydyrzhanie order by red";
$result=mysql_query($query)
or die ("Zaqwkata ne mozhe da se izpylni!");
$broi=mysql_num_rows($result);
while ($row = mysql_fetch_array($result))
{
$id=$row["id"];
$name=$row["name"];
echo "<option value='$id'>$name</option>";
}
mysql_close();
?>
</select>
</td>
<td align="center" valign="middle">
<input type="button" onClick="move(this.form.list2,this.form.list1)" value="<<" id=button1 name=button1>
<input type="button" onClick="move(this.form.list1,this.form.list2)" value=">>" id=button2 name=button2>
</td>
<td>
<select multiple size="10" name="list2" style="width:150" onDblClick="move(document.combo_box.list2,document.combo_box.list1)">
</select>
</td>
</tr>
<tr><td align="center" colspan="3"><input type="submit" name="submit_button" value="Submit" onClick="selectAll(document.combo_box.list2);"></td></tr>
</table>
</form>
</BODY>
</HTML>
Демо:
http://tntm.org/probna_3/red_2.php
Js-та е взет от тук:
http://www.javascriptkit.com/script/script2/picklist2.shtml
След снощното ровене разбрах, че заради недостатъците на ХТМЛ за да се използва пълноценно опцията "multiple" се налага използването на Js, който да извърши селектирането на избраните опции. Разбрах също и че подобни форми + Js се обработват ДИРЕКТНО от РНР-скриптове:
http://bg2.php.net/manual/en/faq.html.php
(по специално: 4. How do I get all the results from a select multiple HTML tag? и предпоследния пост на потребител по темата: "this code selects all elements with javascript
and hands them over to an array in php")
Вече знам, как да обработя резултата от "multiple"-заявка. Не успях обаче да подкарам Js-та. За да укажем, че ще изпрати масив от формата (повярвайте ми - знам, че изпраща масив!!!) името на формата - отбелязано по-горе в червено- трябва да съдържа знака за масив "[]".
Не разбирам от javascript, но се опитах да сменя името на падащото меню и там, където то се използва. За съжаление след промените ми скрипта не извършва пренасянето м/у двете падащи менюта (каквото е основното му действие).
Въпросът ми е по-скоро свързан с javascript, а не с РНР:
Как във формата и скрипта, където присъства "list2" да се смени на "list2[]". Аз опитах много комбинации, но не успях.
Макар въпросът ми да е свързан с javascript, той касае най-вече работата с РНР, затова си позволявам да го поместя тук. Още повече, че възможността за пренасяне на масиви чрез пост-метода се оказа слабо понятна и на някои опитни програмисти, с които коментирах темата днес.
Ако ви вълнува единствено как да обработвате падащо меню с повече от един избор (а то позволява да си спестите доста код, когато на търсачките си искате да сложите търсене по всички категории напр), погледнете връзката към bg2.php.net, дадена по-горе и вземете наготово скрипта даден в мнението на потребителя.
Ще ми помогнете много обаче, ако ми кажете как да подкарам проблемния javascript.
Благодаря предварително!