Js, PHP и HTML или как може да се предава масив със $_POST

sizif

Registered
Здравейте!

Ако заглавието ви се струва странно и чуждо, не бъразйте да отминавате: все някога ще ви се наложи да обработвате падащо меню, чиято стойност е "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.

Благодаря предварително!
 
sizif каза:
Макар въпросът ми да е свързан с javascript, той касае най-вече работата с РНР, затова си позволявам да го поместя тук. Още повече, че възможността за пренасяне на масиви чрез пост-метода се оказа слабо понятна и на някои опитни програмисти, с които коментирах темата днес.

Понятието си е слабо но съм ти направил един пример как да листнеш лесно
това което си изпратил и да го обработиш като масив.
Понеже знам, че с масивите се справяш и ще ти е лесно после да ги
обработваш съм ти го написал кратко и ясно.


Искаш данните изпратени с POST метода да ги обработваш като масив.
<select multiple="multiple" size="10" name="list1[]">
може да съдържа няколко стойности .
В случая 1,2,3,4,5,6,7,8 и т.н.

Ето ти демо:

http://admin.web-tourist.net/demo/prered_1.php

ето ти кода:
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

</HEAD>
<BODY>


<form method="POST" ACTION="prered_1.php">
<table cellpadding="4" cellspacing="0" border="0">
<tr>
<td>
<select multiple="multiple" size="10" name="list1[]">
<option value='1'>Home</option>
<option value='5'>Новини</option>
<option value='2'>За нас</option>
<option value='3'>Проекти</option>
<option value='4'>Клиенти</option>
</select>
</td>

<tr><td align="center" colspan="3">
<input type="submit" value="Submit" ></td></tr>
</table>
</form>



<?
if ( isset($HTTP_POST_VARS['list1']) )
{
$list = $HTTP_POST_VARS['list1'];
echo "Вие избрахте:<br/>";
for($i = 0; $i < count($list); $i++)
{

echo $list[$i]."<br/>";

}
}
?>



елементарно е .

Знаеш броя и стойността на елементите .
Може да ги обхождаш и т.н.

Друг е въпроса, че кода който ти искаш да подкараш е
с javascript и там ще ми трябва време да го разглеждам (а в момента нямам такова).

Надявам се поне да съм помогнал с пращането и обработването на данните.
 
Здравей, Админ!

Това вече го знам, даже умишлено си позволих толкова пространни обяснения, а също и даването на толкова много връзки към информцията, която касае въпроса, защото е рядка хипотеза, а може да свърши много работа... :( Все пак, благодаря, че си отделил време!

Проблема ми е в javascript-а. Добавянето на квадратните скоби към името на падащото меню във формата от моя пост не дава резултат, защото javascript-а, който извършва преместването и селектирането не го чете, а без него пращам празна форма и получавам празен масив :(

Иначе с други кодове с едно падащо меню се справих - за прехвърляне на масиви към втори файл падащото меню се явява добра възможност, но на мен ми е нужно да подкарам кода с двете падащи менюта или друг с подобно действие...

Колкото до демото, което си дал, в него въпреки опцията multiple, маркираш само една стойност. Всички примери за нейното прилагане използваха някакъв javascript. Аз пробвах онзи от страницата на рнр (в предния пост давах връзка към него) - най-краткия от които намерих и върши работа. Ако на някой му трябва подобен код, може да го използва за образец - селектира всичко маркирано...

Тази нощ ще се опитам да инкорпорирам два други скрипта, така че да действат като този с двете менюта, но ще е игра на налучкване...

Ще пусна темата и в други форуми, дано не ме хокат много :?
 
sizif каза:
Здравей, Админ!


Колкото до демото, което си дал, в него въпреки опцията multiple, маркираш само една стойност.


Ако натиснеш Crtl може да маркираш всичко.

Да разбрах, че искаш да свържеш двата скрипта но аз не съм изтрезнявал вече 2 дена и буквално не мога да мисля в момента.
 
Да с контрол става, но е по-удобно, когато js се грижи за това... :) Както и да се направи обаче - де да имах избор, все ми трябват две взаимносвързани менюта :(

Иначе знам, че си много зает, не се притеснявай! Когато можеш винаги си ми помагал, даже с цели скриптове, не мога да се оплача изобщо! :)
 
sizif каза:
Да с контрол става, но е по-удобно, когато js се грижи за това... :) Както и да се направи обаче - де да имах избор, все ми трябват две взаимносвързани менюта :(

Иначе знам, че си много зает, не се притеснявай! Когато можеш винаги си ми помагал, даже с цели скриптове, не мога да се оплача изобщо! :)

Ще мисля по въпроса но не сега. :wink:
 
Благодаря! :)

Ако междувремемно постигна резултат, ще пиша тук!

Ползотворна работа!
 
sizif: Написал съм ти в другата тема елементарното решение на проблема ти... без да се налага да променяш скриптове...

Приятно осмисляне на ситуацията :) /ако все пак не можеш да разбереш каво точно става - пиши :)/
 
Вече пробвах (и писах в другата тема): ТРЪГНА!!!

Много ти благодаря! На теб и на Админ, който се изтормози покрай мен :) А и на сотаналите, които предлагаха решения...

Хиля се като малоумен... Вися 4 дни над това, ако имаш идея, какви варианти разигравах (това и това така, тук- друго, тук кавички, там единични, а сега обратно и пр) ще ми дадеш награда за комбинторика :))

Можеш да видиш демото, макар че после ще направя истинско "демо", за този който би имал нужда от такъв скрипт, защото това е част от по-голям код и ще го човъркам (освен това тбалицата, която пренрежда си е съвсем сериозна) :)

Ползотворна вечер на всички!
 

Back
Горе