Diskuze: Premenná z JS do php
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.


V tom prikladu jsem ti to preci prepsal na pole. https://jsfiddle.net/54w073vu/ Jen je nutne si hlidat pocet pridanych.
<input type="hidden" name="pocet" value="0" id="muj_input">
...
var pocet = 0;
function pridej() {
{
var input;
pocet += 1
input = document.getElementById('muj_input');
input.value = pocet;
...
}
---
v php pak
function getRequest($name, $value_default='')
{return isset($_POST[$name]) ? $_POST[$name] : $value_default;}
$pocet = getRequest('pocet') * 1;
$kandidati = array();
for ($i=0; $i<$pocet; $i++)
{
$kandidati[] = array(
getRequest('meno')[$i],
getRequest('priez')[$i],
getRequest('mesto')[$i],
getRequest('zvoleny')[$i]
);
}
Je to sice krkolomne, ale tez funkcni. Elegantnejsi by bylo prave to druhe reseni...
V tom prikladu, na fiddle, si vsimni jedne dulezite veci. Ja tam javascriptem neklonuji cely form, nybrz jen ty inputy. Ty v tom svem klonujes cely form. To dela uplne jiny html kod.
<!-- tohle vytvari tvuj kod -->
<!-- kazdy ten form muze by odeslany na jinou url -->
<form action="odesli na url1">
<inputy>
<odesilaci tlacitko>
</form>
<form action="odesli na url1">
<inputy>
<odesilaci tlacitko>
</form>
<form action="odesli na url1">
<inputy>
<odesilaci tlacitko>
</form>
<!-- -------------- -->
<!-- tohle vytvari muj kod, jenom jsem se nenamahal tam -->
<!-- pridat form tag, na fiddle.net -->
<!-- a vsechny inputy odesilam jednim tlacitkem na 1 url -->
<form action="odesli na url1">
<div>
<inputy>
<inputy>
<inputy>
<inputy>
</div>
<odesilaci tlacitko>
</form>
Zkus se nekdy podivat do www prohlizece, jaky html kod ti to produkuje. Ve firefoxu se to dela tak, ze kliknes mysi na stranku, ctrl+a (oznacit vse), kliknes pravym tl mysi do oznacene oblasti a je tam tlacitko Zobrazit zdrojovy kod vyberu. To zobrazuje i kod generovany pres js.
Nebo to muzes prohnat pres escapovaci funkci, ktera html tagy premeni na < a >.
function escapeHtml(str) {
var map = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'"
};
return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}
...
// div.innerHTML += str;
div.innerHTML += escapeHtml(str);
+20 Zkušeností
+2,50 Kč

Takhle, ja nevim, jak moc jsi zacatecnik, ale na strance muzes mit vice
formularu. To neni nic proti nicemu. Ale ty asi o to nestojis. Spis slo o
nechteny omyl.
Ten program potrebujes udelat tak, aby jsi vygeneroval html kod jako je
tento:
<form action="index.php" method="post">
<p>Meno:<br> <input type="text" name="meno[]"></p>
<p>Priezvisko: <br><input type="text" name="priez[]"></p>
<hr>
<p>Meno:<br> <input type="text" name="meno[]"></p>
<p>Priezvisko: <br><input type="text" name="priez[]"></p>
<hr>
<p><input type="submit" value="Uložiť údaje"></p>
</form>
a nebo tento:
<form action="index.php" method="post">
<p>Meno:<br> <input type="text" name="item[0][meno]"></p>
<p>Priezvisko: <br><input type="text" name="item[0][priez]"></p>
<hr>
<p>Meno:<br> <input type="text" name="item[1][meno]"></p>
<p>Priezvisko: <br><input type="text" name="item[1][priez]"></p>
<hr>
<p><input type="submit" value="Uložiť údaje"></p>
</form>
<?php
$item_list = isset($_POST['item']) ? $_POST['item'] : array();
// nebo je to tez
$item_list = array(); if (isset($_POST['item'])) { $item_list = $_POST['item']; }
// nebo
if (isset($_POST['item'])) { $item_list = $_POST['item']; } else { $item_list = array(); }
var_dump($item_list); // to by melo byt uz hotove pole, jake mas v tematu vedle
// ja radeji pouzivam anglicke nazvy item_list = $kandidat, casto vyjadruji lepe podstatu promenne
// $kandidat[] = array("meno" => "$meno", "priez" => "$priez", "rc" => "$rc", "mesto" => "$mesto");
// echo $kandidat[0]["meno"];
Martin2525:16.6.2020 15:58
Ďakuje Ti veľmi!
Som začiatočník, učím sa to z tutoriálov dnes tretí deň asi
Z tohto čo si poslal už vyjdem, jedno z tých riešení som už mal
napísané aj sám, ale nefungovalo mi, teraz už vidím že preto pretože som
mal zlú syntaxi.
Tak ale hold včera som ešte nevedel, akú má syntax JS a akú PHP. Resp všetky vychytávky.
Myslím, že z tohto už to dám, keď tak písnem ešte, díky.
Díky moc, myslím že to rozchodím, keď tak ešte písnem.
Klonovanie formu som si tiež urobil (zmenil sám), pretože som v určitej
chvíli chcel vyskúšať, či do toho nemôžem pridať,m do tej JS funkcie aj
PHP kód, ktorý obsluhuje $_POSTY
Až potom som prišiel na to, že premenné
Tak sa mi to podarilo, díky moc.
Písal som aj SZ, ale už je bezpredmetná.
<form action="index.php" method="post">
<div id="mujdiv"></div>
<p><input type="button" value="Pridať ďalšieho kandidáta" onclick="novyKandidat()"></p>
<p><input type="submit" value="Uložiť údaje"></p>
</form>
<script>
function novyKandidat() {
var i = 1;
var div, str;
str = '\
<p>Meno:<br> <input type="text" name="meno[]"></p>\
<p>Priezvisko: <br><input type="text" name="priez[]"></p>\
<p>Mesto: <br><input type="text" name="mesto[]"></p>\
<p>Bol kandidát zvolený: <br><input type="radio" name="zvoleny[]" value="ano"> Áno\
<input type="radio" name="zvoleny" value="nie"> Nie\
<hr>\
';
div = document.getElementById('mujdiv');
div.innerHTML += str;
}
novyKandidat(); // aby pridal prvi formular
</script>
<?php
print_r($_POST);
$item_list_meno = isset($_POST['meno']) ? $_POST['meno'] : array();
$item_list_priezvisko = isset($_POST['priez']) ? $_POST['priez'] : array();
$item_list_mesto = isset($_POST['mesto']) ? $_POST['mesto'] : array();
var_dump($item_list_meno);
var_dump($item_list_mesto);
var_dump($item_list_priezvisko);
A hádže mi to výpis, presne ako potrebujem.
Už s tým môžem ďalej pracovať.
Js tam ma jen tu zaludnost s lomitkem na konci radku, pokud chces string mit na vic radku. Jeste mne napadlo, ze jsem ti tam mohl dat "\n", zalomeni radku.
$php = "aaa
bbb";
echo $php; // vyrobi html kod
aaa
bbb
js = "aaa\
bbb";
document.write(js); // (nebo innerHTML) vyrobi html kod
aaabbb
js = "aaa\
\nbbb";
document.write(js); // (nebo innerHTML) vyrobi html kod
aaa
bbb
Je jedno, zda pouzivas dvojitou uvozovku nebo jednoduchou. Ale u js myslim \n jde napsat jen do dvojite. Hlavni je u uvozovek, ze uvozovky stejneho typu musis zalomitkovat
str = '<input type="text" name="meno">';
str = '<input type=\'text\' name=\'meno\'>';
str = '<input type=text name=meno>'; // pokud tam neni mezera, muze se text psat v html bez uvozovek, ale je to risk, ze je zapomenes, kdyz tam byt musi
str = "<input type=\"text\" name=\"meno\">';
str = "\n<input type=\"text\" name=\"meno\">';
str = "\n"+'<input type="text" name="meno">'; // a sloby pouzit pluska na propojovani retezcu, pr:
js = "aaa\
\nbbb";
document.write(js); // (nebo innerHTML) vyrobi html kod
aaa
bbb
js = "aaa"+
"\nbbb"+
"";
document.write(js); // (nebo innerHTML) vyrobi html kod
aaa
bbb
js =
"aaa"+
"\nbbb"
Podstatne je, ze, kdyz v js zacnes uvozovku, tak na stejnem radku musi skoncit uvozovkou nebo zpetnym lomitkem \.
To icko se tam pise takhle:
// kod, ktery jsi poslal do soukromych zprav
<input type="hidden" name="presuni" value=(i)>\
<input type="hidden" name="presuni" value=' + i + '>\
// kod tady
<p>Meno:<br> <input type="text" name="meno[]"></p>\
<p>Meno:<br> <input type="text" name="meno[' + i + ']"></p>\
Jeste by to slo udelat jinak. Takove neco jako sablona.
<div id=bbb></div>
<div id=aaa style="display:none">
<p>Meno:<br> <input type="text" name="meno[]"></p>
<p>Priezvisko: <br><input type="text" name="priez[]"></p>
<p>Mesto: <br><input type="text" name="mesto[]"></p>
<p>Bol kandidát zvolený: <br><input type="radio" name="zvoleny[]" value="ano"> Áno
<input type="radio" name="zvoleny" value="nie"> Nie
<hr>
</div>
...
var div1, div2;
div1 = document.getElementById('aaa');
div2 = document.getElementById('bbb');
div2.innerHTML += div1.innerHTML; // pokud tam nebudes nikde davat to icko
// a += b, je totez jako: a = a + b
A jeste mne napadla vcera vecer jedna vec, ze tam nemas labely
<label> aaa <input> </label> -- kliknutim na text aaa, ti kurzor pro psani textu skoci do inputu
aaa <input> -- kliknutim na text aaa, se nestane nic
<label for="bbb"> aaa </label> <input id="bbb"> -- kliknutim na text aaa, ti kurzor pro psani textu skoci
<label for="meno[0]"> aaa </label> <input id="meno[0]" name="meno[0]"> -- tady bys musel pouzit cislovani pro id, protoze id musi byt unikatni string, nejde pouzit "meno[]"
Díky moc za tieto príklady.
Moc mi pomáhajú.
Ja som si včera ten formulár už pekne cez css naštyloval.
A našiel cez jQuery kus kódu na kontrolu vstupov.
A zrejme využijem ten systém ukladania do poľa cez premennú "i"
a tento príklad ukladania, ktorý si mi poslal včera:
<input type="hidden" name="pocet" value="0" id="muj_input">
...
var pocet = 0;
function pridej() {
{
var input;
pocet += 1
input = document.getElementById('muj_input');
input.value = pocet;
...
}
---
v php pak
function getRequest($name, $value_default='')
{return isset($_POST[$name]) ? $_POST[$name] : $value_default;}
$pocet = getRequest('pocet') * 1;
$kandidati = array();
for ($i=0; $i<$pocet; $i++)
{
$kandidati[] = array(
getRequest('meno')[$i],
getRequest('priez')[$i],
getRequest('mesto')[$i],
getRequest('zvoleny')[$i]
);
}
Totižto keď opakujem len inputy, nie celý formulár, má to 2 chyby:
- Vyplním kandidáta, a stlačím pridať, vymaže mi to vypísané
- čiže by som musel nejak najprv naklikať počet a potom vypisovať, čo nie je user friendly
Ako obecne urobím to, aby sa mi zobrazil form input kandidáta, vyplním ho,
dám odoslať zrejme, a kliknem na pridať kandidáta a zobrazia sa mi ďalšie
čisté inputy?
Predpokladám, že musím opakovať celý form, nie len inputy?
Alebo sa to dá urobiť tak, že budem zobrazovať vždy na čistej obrazovke len inputy, a tie už vypísané mi ostanú niekde v pamati a tlačítkom submit to už len na raz odošlem?
Zobrazeno 8 zpráv z 8.