Využij akce až 80 % zdarma při nákupu e-learningu. Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Pythonu
python week
Avatar
Martin2525
Člen
Avatar
Martin2525:16.6.2020 10:17

Ahojte, mám v JS formulár, kde si môžem x krát zopakovať celé input pole.
Pod scriptom mám už php, kde potrebujem tvoriť novú premennú inú po každom vyplnení formuláru.

  <div id=mujdiv></div>
      <p><input type="button" value="Pridať ďalšieho kandidáta" onclick="novyKandidat()"></p>
      <script>
         function novyKandidat() {

         var div, str;
         str = '\
         <form action="index.php" method="post">\
         <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\
         <p><input type="submit" value="Uložiť údaje"></p>\
         </form>\
         <hr>\
         ';
         div = document.getElementById('mujdiv');
        div.innerHTML += str;
        }

     novyKandidat(); // aby pridal prvi formular

     </script>

   <?php


    $prem = "kandidat" . $i; //zmena mena premennej na kandidat$i pre class Kandidat
    $$prem = new Kandidat($_POST['meno'], $_POST['priez'], $_POST['mesto'], $_POST['zvoleny']);




// Prozatímna kontrola výpisov rôznych kandidátov
echo $i;
$kandidat1->vypisMeno();
$kandidat1->vypisPriezvisko();
$kandidat1->vypisMesto();
$kandidat2->vypisMeno();
$kandidat2->vypisPriezvisko();
$kandidat2->vypisMesto();

Vie mi niekto poradiť, ako sa to dá urobiť?
Aby som ma $i=1 a po každom vyplnení a odoslaní formu čo je v JS skripte sa zvýšila o 1.
Ďakujem.

Zkusil jsem: Skúšal som vytvoriť v JS premennú, a poslať ju potom cez $?POST do php, ale mojimi znalosťami som to zatiaľ nezvládol.

 
Odpovědět
16.6.2020 10:17
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2020 14:55

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 &lt a >.

function escapeHtml(str) {
    var map = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'":  "&apos;"
    };
    return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}
...
//        div.innerHTML += str;
        div.innerHTML += escapeHtml(str);
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
16.6.2020 14:55
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:16.6.2020 15:05

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"];
 
Nahoru Odpovědět
16.6.2020 15:05
Avatar
Martin2525
Člen
Avatar
Odpovídá na Peter Mlich
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é

Editováno 16.6.2020 15:59
 
Nahoru Odpovědět
16.6.2020 15:58
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Martin2525
Člen
Avatar
Martin2525:16.6.2020 18:06

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ť.

 
Nahoru Odpovědět
16.6.2020 18:06
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.6.2020 8:49

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
Editováno 17.6.2020 8:50
 
Nahoru Odpovědět
17.6.2020 8:49
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:17.6.2020 8:56

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[]"
 
Nahoru Odpovědět
17.6.2020 8:56
Avatar
Martin2525
Člen
Avatar
Martin2525:17.6.2020 9:29

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:

  1. Vyplním kandidáta, a stlačím pridať, vymaže mi to vypísané
  2. č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?

Editováno 17.6.2020 9:30
 
Nahoru Odpovědět
17.6.2020 9:29
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.