Autor Zpráva
Silencer
Profil *
Mam problem s odosielacim formularom. Dorabam ho na jednu stranku, kde pribudol obchod - ponuka niekolkych druhov tovaru. Vo formulari som chcel navstevnikom ponuknut moznost objednat si jeden alebo aj viac tovarov naraz. Zobrazi sa najprv jeden riadok, po klinuti na "pridaj riadok" sa pod to zobrazi dalsi atd. Vsetko funguje ako ma, ale problem je s obsahom premennej. Kedze tych riadkov moze byt niekolko a neviem dopredu kolko, musel som zvolit nejaky pocitadlo riadkov. Ale nesedia mi asi premenne, lebo obsah prveho riadka mi neodosle, namiesto toho je prazdny retazec.
Skusal som vselijake moznosti. Ked som napr. do "pocetriadkov" vlozil na zaciatku scriptu nulu, tak to zase neodosielalo poslednu hodnotu. Skusal som menit $i aj za jednotku, prip. som rozsiril podmienku na mensia a rovna sa. Nic vsak nepomohlo, a ani tie zmeny na seba logicky nenadvazovali, aby ma vedeli posunut spravnym smerom.
Povodny zdrojovy kod, z ktoreho som cerpal, je ovela zlozitejsi, tam sa uz da vyberat aj z ponuky, nielen rucne vpisovat. Ja som z neho chcel vytiahnut iba pre mna potrebnu cast. Vsetko je so suhlasom autora, ale rady od neho sa nemozem dockat.
Viete mi niekto pomoct? Som uz zufaly, sedim nad tym dlho a nemam uz ani ziadne dalsie napady.

Prikladam dolezite casti kodu:

Definovanie scriptu:


<script type="text/javascript">
var PocetRiadkov=1;
function pridajRiadok(){
div = document.getElementById("obj1")
div.innerHTML += "&nbsp;";
div.innerHTML += "<input type='text' size='40' maxlength='200' name='tovar["+PocetRiadkov+"]'>";
div.innerHTML += "<br>";
PocetRiadkov++;
}
</script>


Formular samotny: ukrojena najdolezitjsia cast kodu, kde su podmienky a cykly, ostatne klasicke html veci som nekopiroval


<tr>
<td width="150" align="right" valign="top"><b>Objednávany tovar:</b><br></td>';
if(!is_array($tovar)){ $tovar[0]=""; }
echo ' <td width="300" align="left" valign="top" id="obj1">';
for($i=0;$i<count($tovar);$i++){ echo '&nbsp;<input type="text" size="40" maxlength="200" name="tovar[$i]"><br>';};
echo '
</td>
</tr>


Tato cast odosiela hodnoty na mail:


$message.="<b>Tovar:</b><br>";
for($i=0;$i<count($tovar);$i++){ $message.=$tovar[$i]."&nbsp;[$i]<br>";}
vinnetou
Profil *
Podle kodu bohuzel radit nemuzu, protoze neznam PHP. Resil jsem ale neco obdobneho pomoci ASP. Matlo mne tam to, ze prvni prvek pole je v javascriptu prvek s indexem 0, zatimco v ASP 1. Nebude problem v necem podobnem?
peta
Profil *
vinnetou
prvni prvek pole je v javascriptu prvek s indexem 0
???
To mas nejak divne nastavene, ne? Vzdy se cisluje cokoliv od nuly. Netyka se to jen javascriptu. Tak ale ASP nevedu, takze mozne to je.

Silencer
??? if(!is_array($tovar)){ $tovar[0]=""; }
Nezkolabuje ti to na tomto?
Inac ked nieco odosles, nechaj si to zobrazit.
print_r($_POST); //alebo printr(), neviem, ako sa to pise, teraz; zobrazuje to pole

Dalej mi tu chyba to najdvolezitejsie, ten DIV obj1!
Cili radit sa asi neda, ked nemas hlavnu cast scriptu, kam sa riadky pridavaju a formular, ktory to odosiela a do ktoreho sa to pridava a z neho odosiela dalej...

for($i=0;$i<count($tovar);$i++) {$message.=$tovar[$i]."&nbsp;[$i]<br>";}
pouzivam: (ale len taka zaujimavost)
foreach ($tovar as $key => $value)
{$message.=$value."&nbsp;[$key]<br>";}

A tiez ma stve, ze tu davas PHP kod...
Silencer
Profil *
Vazne neviem, ci to nekolabuje na tomto:
if(!is_array($tovar)){ $tovar[0]=""; } 

Ale ked to tam nedam, neukaze sa prvy riadok a aj ked si ich pridam, tak stale neposiela prvu hodnotu.

obj1 je definovane ako id stlpca <td> !!! takze riadky sa pridavaju do miesta <td id="obj1"></td> - 4.riadok v scripte, kde je Formular samotny ...

ten zdrojak "foreach" je na otestovanie, co uklada do akej premennej, ci to vyskusat ako riesenie?

Za to, ze som to dal do Javascriptovej sekcie sa ospravedlnujem, som tu novy. Povodne som uvazoval, ze problem je v Javascripte. Ale dal som to aj do PHP sekcie. Este raz sorry.
peta
Profil *
Silencer
Ten foreach je take pekne riesenie tohoto riadku, neriesi to tvoj problem:
a) for($i=0;$i<count($tovar);$i++) {$message.=$tovar[$i]."&nbsp;[$i]<br>";}
b) foreach ($tovar as $key => $value) {$message.=$value."&nbsp;[$key]<br>";}

kde $tovar je tvoje pole; $key je mnou zvolena premenna a $ value to iste
Usporiadanie:
$tovar
$key=>$value
$tovar = array(
0=>"noze",
1=>"vydlicky"
);
ALEBO
$tovar = array("noze","vydlicky");
ALEBO
$tovar1 = array(
'zbozie'=>"noze",
'cena'=>"vydlicky"
);
ALEBO
$tovar = array(
'1'=>"vydlicky"
'0'=>"noze",
);
V tomto pripade ti ale for($i=0...) vypise noze,vydlicky ALE foreach zachovava poradia, cize vydlicky, noze (to je taka drobna nevyhoda, nehladie na to, ze sa zle obmedzuje rozsah od 1 do 5)

"Povodne som uvazoval, ze problem je v Javascripte"
Mozno je, ale ked tu das PHP zdrojak, tak tomu rozumie uz menej ludi :)
Nicmenej by docela bodol odkaz na stranku, alebu uplny kod, pretoze z tohto sa neda poradit...

div = document.getElementById("obj1")
Tu by som pridal var
var div = document.getElementById("obj1")
Zvolil by som inu premennu ako div, lebo div moze znamenat pole vsetkych DIVov na stranke.

div.innerHTML += "&nbsp;";
Tento riadok si niesom isty, ci ti bude fungovat, ci to skutocne prida nbsp. Ja viem, ze som skusal cez JS-DOM a moc mi to neslo. Mozno cez inner to ide.

Tu a aj tu by som pridal \n
for($i=0;$i<count($tovar);$i++){ echo '&nbsp;<input type="text" size="40" maxlength="200" name="tovar[$i]"><br>';};
div.innerHTML += "&nbsp;";
div.innerHTML += "<input type='text' size='40' maxlength='200' name='tovar["+PocetRiadkov+"]'>";
div.innerHTML += "<br>";

$t = "";
for($i=0;$i<count($tovar);$i++){
$x = "\n".'&nbsp;<input type="text" size="40" maxlength="200" name="tovar[$i]"><br>';
$t.=$x;
}
echo $t;
var x,i;
x = "\n"+'&nbsp;<input type="text" size="40" maxlength="200" name="tovar["+PocetRiadkov+"]"><br>';
div.innerHTML +=x;
Alebo tam pouzit zapis s lomitkami
x= "\n&nbsp;<input type=\"text\" size=\"40\" maxlength=\"200\" name=\"tovar["+PocetRiadkov+"]\"><br>";
$x= "\n&nbsp;<input type=\"text\" size=\"40\" maxlength=\"200\" name=\"tovar[$i]\"><br>";

... ale ako vravim, bez ostatneho kodu to je iba taky tip, ako by som to napisal ja, ale to vobec nemusi mat vpliv na tvoj problem. To si treba totiz vyskusat, co ti to robi nazivo a co vypisuje JS konzola, ked tvrdis, ze je chyba v JS.
vinnetou
Profil *
vinnetou
prvni prvek pole je v javascriptu prvek s indexem 0
???
To mas nejak divne nastavene, ne? Vzdy se cisluje cokoliv od nuly. Netyka se to jen javascriptu. Tak ale ASP nevedu, takze mozne to je.

No par let uz s ASP delam. Proste je to tam od 1.
peta
Profil *
vinnetou Ok, sak mozne to je. Jen je to atypicke. Obvykle se cisluje od nuly.
Chamurappi
Profil
Reaguji na vinnetoua:
ASP je široký pojem. Ve starém ASP šlo psát jak v JavaScriptu (JScriptu), tak ve VBScriptu (ten býval výchozí). V obou jazycích začínají běžná pole nulou, nehledě na to, kolik let v nich děláš. Chceš-li se vzpouzet, utluču tě oficiální dokumentací.
vinnetou
Profil *
Jj, napsal jsem to blbe. Myslel jsem to tak, ze napr. Request.Form.Key(5) odpovida 5. poli formulare, zatimco document.formular.elements[5] 6.

Vzpouzet se urcite nehodlam :)
Luka
Profil *
<select name="list" class="sbox" onchange="location.href=this.options[this.selectedIndex].value">
<option value="nakup.php?pocet=1">1</option>
<option value="nakup.php?pocet=2">2</option>
<option value="nakup.php?pocet=3">3</option>
<option value="nakup.php?pocet=4">4</option>
</select>

for($i=0; $i < $pocet; $i++)
{
echo '<input type="text" name="tovar[]" size="50" class="ibox" />
}

neviem, asi som to spravne nepochopil, ale ked si cez URL predas premennu pocet tak ta ti zopakuje tolko krat input kolko chces a potom taketo pole ako je teraz napr. tovar[] sa uz da lahko prechadzat
Silencer
Profil
Vsetkym vdaka za pomoc, na php fore mi pomohol jeden manik.
Chyba bola, ze to malo byt cele v uvodzovkach a nie v apostrofoch.
Diky a majte sa!!
Toto téma je uzamčeno. Odpověď nelze zaslat.

0