Autor Zpráva
Jcas
Profil *
function vypln(prvek, hodnota) {
    alert(prvek);
    if(prvek==[object HTMLInputElement]) {
alert('true');
}
fandaa
Profil
Jcas:
if(prvek.tagName && prvek.tagName.toLowerCase() == "input")
_es
Profil
fandaa [#2]:
To sa dá (v HTML) zredukovať na:
if(prvek.tagName == "INPUT")
Jcas
Profil *
super, děkuju
_es
Profil
Jcas:
O niečo efektívnejšie, no nemusí fungovať v starších prehliadačoch (IE6):
if(prvek instanceof HTMLInputElement)
alebo
if(prvek.constructor == HTMLInputElement)
Joker
Profil
Pro jistotu ještě poznamenám, že v podobných situacích by mohlo být žádoucí zachytávat i některé prvky, které nejsou <input>
Například <textarea>.
Jcas
Profil *
Tak vyplnit input a textareu je snadné. Trochu problém mám nastavit selected pro option a checked pro radion. U radia narážím na problém stejného name="" u elementu. U selktu to bude ještě trochu těžší.

Jistě už chápete, že Funkci chci předávat $_POST[name]=hodnota

function vypln(prvek, hodnota) {
//    if(prvek.tagName.toLowerCase()=="input") {
//prvek.value = hodnota;
//    }
//    if(prvek.tagName.toLowerCase()=="select" && prvek.option.value==hodnota) {
//        prvek.option.selected = true;
//    }  
    if(prvek.tagName.toLowerCase()=="textarea") {
        prvek.innerHTML = hodnota;
    }
    if(prvek.tagName.toLowerCase()=="input") {
        alert('rad');
    }
    
alert(true);
//    alert(prvek.type);

}
vypln(document.formular.rad, 'teta z depa');



ps. Rvu to do zkoušečky a alertama testuju, kdy to přestane fungovat.
if(prvek.tagName.toLowerCase()=="input") {
prvek.value = hodnota;
}
 if(prvek.tagName.toLowerCase()=="textarea") {
 prvek.innerHTML = hodnota;
 }
Toto funguje perfektně.


U selectu budu muset nějak zjistit, které option má value==hodnota.

U radia nevím, když tam zavazí více stejných name.
Chamurappi
Profil
Reaguji na Jokera:
Formulářové prvky uvnitř formuláře mají ve vlastnosti form referenci na formulář, takže by možná stačilo kontrolovat prvek.form.


Reaguji na Jcase:
Toto funguje perfektně.
Pochybuji. Proč měníš innerHTML a ne value?

U selectu budu muset nějak zjistit, které option má value==hodnota.
I <select> má vlastnost value.
_es
Profil
Jcas:
if(prvek.tagName.toLowerCase()=="textarea") {
To je zbytočne neefektívny kód, stačí:
if(prvek.tagName=="TEXTAREA")

Jistě už chápete, že Funkci chci předávat $_POST[name]=hodnota
Nechápem, na čo do toho montuješ nejaké výrazy z PHP, ide predsa len o JS kód.

K čomu je tá funkcia vlastne dobrá? Máš nejaké vlastné elementy, vieš aké, na čo sa znovu zisťuje akého sú „typu“? Prečo to vypĺňanie hodnôt nespravíš nejako rozumnejšie, bez nejakého zbytočného overovania a pod.?
Jcas
Profil *
Chamurappi:
Pochybuji. Proč měníš innerHTML a ne value?
Protože jsem se v základech naučil, že textarea je párový tag a obsah je mezi zažínajícím a končícím tagem.

I <select> má vlastnost value.
Ano, ale v $_POST mám přeci $_POST['name selectu'] = 'value vybraného option'
????


_es:
Chtěl jsem zkusit jednu JS funkci na vyplnění celého formuláře, která by sloužila i na jiné formuláře - je to stále dokola. 5 stránek, 5 formulářů a všechny stejně vyplňované.
Už jsem to jednou vyplňoval na straně servu. Nyní to zkouším pomocí JS.
_es
Profil
Jcas:
Protože jsem se v základech naučil, že...
To predsa nijako nesúvisí s otázkou, treba si pozrieť tie správne základy, napríklad developer.mozilla.org/en-US/docs/Web/API/HTMLTextAreaElement.

ale v $_POST mám přeci
No a v JS môžeš hodnotu jednoduchého selectu (bez možnosti mnohonásobného výberu) nastaviť jednoducho:
objektSelectu.value='value vybraného option'

Možno ti ešte pomôže, že jednotlivé „podtypy“ inputu zistíš z vlastnosti type: developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-type
Jcas
Profil *
_es:
Děkuju - jdu studovat. Zatím jsem ten select vyřešil takto: Také špatně?
    if(prvek.tagName.toLowerCase()=="select") {
        for (var i = 0; i < prvek.length; i++) {
            prvek[i].selected = prvek[i].value==hodnota?true:false;
        }
   }
ps. pouhé prvek.tagName=="select" mi ve zkoušečce nefunguje
juriad
Profil
https://developer.mozilla.org/en-US/docs/Web/API/Element.tagName

In XML (and XML-based languages such as XHTML), tagName preserves case. On HTML elements in DOM trees flagged as HTML documents, tagName returns the element name in the uppercase form. The value of tagName is the same as that of nodeName.
_es
Profil
Jcas:
ps. pouhé prvek.tagName=="select" mi ve zkoušečce nefunguje
Myslel som že je z ukážok jasné, že tam majú byť veľké písmená, teda prvek.tagName=="SELECT".

Zatím jsem ten select vyřešil takto: Také špatně?
Radu na jednoduché riešenie si dostal v [#11].
Jcas
Profil *
_es:
radu na jednoduché řešení nemůžu pochopit a taky někde dělám chybu, protože mi nefunguje.
To co jsi napsala mám pocit že znamená prvek.value=hodnota;
_es
Profil
Jcas:
mám pocit že znamená prvek.value=hodnota;
No a vyskúšal si to?
Jcas
Profil *
Jistě, :)
Ale samozřejmě s překlepy. Děkuji
    if(prvek.tagName=="SELECT") {
prvek.value=hodnota;
        }
Už mi zbývá jenom to radio.

Tady mne zatím pouze napadlo nastavit na serveru počet volání, dle toho, kolik těch inputů máme.
Tohle by prošlo.
    if(prvek.tagName=="INPUT"&&prvek.type=="radio") {
        if(prvek.value==hodnota) {prvek.checked=true;}
    }
vypln(document.formular.rad[0], 'hodnota');
vypln(document.formular.rad[1], 'hodnota');
Jcas
Profil *
Vyplnění formuláře JS scriptem. Zdá se, že to funguje perfektně. Když jsem to řešil pomocí php, tak jsem buď používal echo '<input.......value="'.$hodnota.'">'; Někde jinde-výš jsem musel řešit, zda vyplňuji odeslaný $_POST, nebo data z DB a kontrolovat existenci.
Na tomto mi vadila Nepřehlednost HTML kódu. Když to je php syntax, tak jako řetězec mám(v editoru) vše zelené-v barvě řetězce.

Tak jsem to zkoušel řešit přerušením php. <input....value="<?php echo $hodnota ?>">
To jsem měl hezký HTML ale zase ta část vloženého php kódu.....

Tak jsem to zkusil tím JS a je to moc hezký. Mám form s 25 prvky a krásně se vyplňuje. A použiji to i na další form. Jen jde o to, správně volat funkci. type="radio", tam nemám, takže ten problém - viz předchozí příspěvek neřeším.
Finální JS
function vypln(prvek, hodnota) {
    if((prvek.tagName == "INPUT" && prvek.type == "text") || prvek.tagName == "TEXTAREA") {
        prvek.value = hodnota;
          }

    if(prvek.tagName=="SELECT") {
        prvek.value = hodnota; 
            }

    if(prvek.tagName=="INPUT" && prvek.type == "radio") {
          prvek.checked = prvek.value==hodnota ? true : false; 
            }

    if(prvek.tagName == "INPUT" && prvek.type == "checkbox") {
          prvek.checked = prvek.value==hodnota ? true : false; 
            }
    }
A takto si na straně servu nachystám volání JS.

echo '<script type="text/javascript" >';

if(isset($_POST['enter'])) {
    foreach($_POST as $index => $obsah) {
        if(!empty($_POST[$index])) {
            echo 'vypln(document.formular_ou.'.$index.', "'.$obsah.'");'; // vypln("name prvku formulare", "hodnota')
            }
        }    
    }
    elseif(isset($data)&&is_array($data)) {        // data z DB. $data[id_vlastnosti]=>array $row[sloupec]=>hodnota

        foreach($data as $index => $obsah) {        // obsahem je jeden řádek z DB
          foreach($obsah as $col => $ulozeno) {        // $col = sloupec v DB, $ulozeno = hodnota v buňce
             if($col=='hodnota') { 
             echo 'vypln(document.formular_ou.'.$obsah['nazev'].', "'.$ulozeno.'");'; 
                 }
              if($col=='poznamka') { 
               echo 'vypln(document.formular_ou.'.$obsah['nazev'].'_pozn, "'.$ulozeno.'");'; 
                   }
             if($col=='verejne') { 
             echo 'vypln(document.formular_ou.'.$obsah['nazev'].'_free, "'.$ulozeno.'");';
                 }
              }
           } 
        }

echo '</script>';

Takže děkuji, za rady. Tento způsob se mi dost líbí. JS funkci řešit už příště řešit nemusím (až na radia), HTML mám taky čistý a jediné co je třeba je jinde kus php, který se nemotá s HTML a pouze je třeba předat JS funkci správné hodnoty.
juriad_
Profil *
Kdybys to napsal rovnou, tak bychom ti to rozmluvili. Takto se nedělá, řeší se to napsáním funkce v php, která vypíše příslušný prvek s parametrem name a stav. Nebo se použije nějaký šablonovací systém, který to již má hotové.
Cesta přes JS není správná.
Jcas
Profil *
juriad:
Dobře no, tak to udělám v php. Ona už es_ mi to trochu rozmlouvala.
Chtěl jsem to zkusit a funguje to dobře.

Co přesně se nedělá? Vyplňovat form pomocí JS? Nebo to jak pomocí php vypisuji mezi <script></script>
Fisir
Profil
Reaguji na Jcase:
Co přesně se nedělá? Vyplňovat form pomocí JS?
Přesně. Pokud máš možnost, jak formulář vyplnit bez JavaScriptu, využij ji. Co když budu mít JavaScript vypnutý?

Ona už es_ mi to trochu rozmlouvala.
Opravil bych to na on (ten _es) :-).
Jcas
Profil *
Nyní už o tom nepolemizuji. Předělám to na php. Jen odpověď na tvou otázku:
Fisir:
Co když budu mít JavaScript vypnutý?
Tak budou potrestáni za to, že dělají kraviny. :) = nic nevloží, nic nezmění, nic neodešlou.
Fisir
Profil
Reaguji na Jcase:
Špatná odpověď – řeknou sbohem a půjdou ke konkurenci.
Jcas
Profil *
Fisir:
Žádná není. :)

Když jsme u toho, co si myslíte o přepisování $_POST.
Stavba je taková, že:
if(isset($_POST)) {} //odeslaný form
else isset($data) //data z DB

Když dám:
<input type="text" name="organizace" size="50" id="org_name" disabled <?php vypln('value', 'organizace'); ?>>

Tak funkce vypln() uvidí &_POST, ale neuvidí $data

Takže co když v průchodu pole $data udělám něco jako:
$_POST['jmeno'] = $data[1]['jmeno'];
Fisir
Profil
Reaguji na Jcase:
Obvykle se přepisování $_POST a podobně nedoporučuje, pokud na to zapomeneš a budeš s tím polem chtít někdy v budoucnu pracovat, budeš se divit, co se to děje. Raději nějakou pomocnou proměnnou.
Kcko
Profil
Jcas:

Takže co když v průchodu pole $data udělám něco jako:

$_POST['jmeno'] = $data[1]['jmeno'];

Tak je to totální prásarána.

Funkce by měla přebírat zdroj dat ze kterých bude hodnotu vytahovat.

Tj.

function vypln($key, array $array){

if (array_key_exists($key, $array))
  return $array[$key];
  
  return NULL; // nebo něco defaultního

}

Pak tedy voláš co potřebuješ.

vypln("jmeno", $_POST); // $_POST bych si nejdříve ošetřil přes sanitizační funkci.
Jcas
Profil *
Kcko:
Nemůžu volat vypln("jmeno", $_POST), protože pokud existuje $data, tak neexistuje $_POST.

Potřebuji jiný zápis. Doslovně:
Je v poli pole, které má prvek s klíčem==hodnotě.


if(in_array(array_key_exists('jmeno',????), $data)) {echo $data[?]['jmeno'];}

Nevím, jak na ten zápis. (mohl bych to odchytit průchodem, ale chci se naučit používat funkce php)
- v poli $data jsou pouze pole. (1=>array, 2=>array, 3=>array)
- Pouze jediné pole obsahuje klíč 'jméno'. Tedy $data[?]['jmeno']. Ale nevím, které to je.
juriad
Profil
Něco nadhodím, nejspíš to bude obsahovat hromadu nedokonalostí, ale snad pochopíš, jaké to má přednosti:
<?php
# na začátek nějaké funkce pro generování formulářových polí:

function combineAttrs($attrs) {
    $str = '';
    foreach ($attrs as $key => $val) {
        if ($str != '') {
            $str .= ' ';
        }
        $str .= $key;
        if ($val != NULL) {
            $str .= '="' . htmlspecialchars($val) . '"';
        }
    }
    return $str;
}

function inputText($name, $value = NULL, $attrs = array()) {
    $input = '<input ';
    $attrs['type'] = 'text';
    $attrs['name'] = $name;
    if (is_string($value)) {
        $attrs['value'] = $value;
    }
    $input .= combineAttrs($attrs);
    $input .=  ">\n";
    return $input;
}

function inputCheckbox($name, $checked = false, $attrs = array()) {
    $input = '<input ';
    $attrs['type'] = 'checkbox';
    $attrs['name'] = $name;
    if ($checked) {
        $attrs['checked'] = NULL;
    }
    $input .= combineAttrs($attrs);
    $input .=  ">\n";
    return $input;
}

function inputRadio($name, $value, $checked = false, $attrs = array()) {
    $input = '<input ';
    $attrs['type'] = 'radio';
    $attrs['name'] = $name;
    $attrs['value'] = $value;
    if ($checked) {
        $attrs['checked'] = NULL;
    }
    $input .= combineAttrs($attrs);
    $input .=  ">\n";
    return $input;
}

function textarea($name, $value, $rows = NULL, $cols = NULL, $attrs = array()) {
    $area = '<textarea ';
    $attrs['name'] = $name;
    if ($rows > 0) {
        $attrs['rows'] = $rows;
    }
    if ($cols > 0) {
        $attrs['cols'] = $cols;
    }
    $area .= combineAttrs($attrs);
    $area .=  ">\n";
    $area .= htmlspecialchars($value);
    $area .= "\n</textarea>\n";
    return $area;
}

function option($key, $val, $selected) {
    $opt = '';
    $opt = '<option ';
    $attrs = array('value' => $key);
    if (in_array($key, $selected)) {
        $attrs['selected'] = NULL;
    }
    $opt .= combineAttrs($attrs);
    $opt .= '>';
    $opt .= htmlspecialchars($val);
    $opt .= "</option>\n";
    return $opt;
}

function options($options, $selected) {
    $opts = '';
    foreach ($options as $key => $val) {
        if (is_string($val)) {
            $opts .= option($key, $val, $selected);
        } elseif (is_array($val)) {
            $opts .= '<optgroup label="' . htmlspecialchars($key) . "\">\n";
            $opts .= options($val, $selected);
            $opts .= "</optgroup>\n";
        }
    }
    return $opts;
}

function select($name, $options, $selected = array(), $multiple = NULL, $size = NULL, $attrs = array()) {
    $select = '<select ';
    $attrs['name'] = $name;
    if ($size > 0) {
        $attrs['size'] = $size;
    }
    if ($multiple) {
        $attrs['multiple'] = NULL;
    }
    $select .= combineAttrs($attrs);
    $select .=  ">\n";
    $select .= options($options, $selected);
    $select .= "</select>\n";
    return $select;
}

?>


<?php

# teď si definujeme data; třeba je vytáhneme z databáze

$username = 'juriad';
$cech = true;
$pohlavi = 'muz';
$popis = 'ahoj, jak se máš?';
$znalosti = array('en', 'PHP', 'C');
?>

<!-- a definice vlastního formuláře -->
<form>
    <?php echo inputText('jmeno', $username); ?>
    <?php echo inputCheckbox('cech', $cech); ?>
    <?php echo inputCheckbox('francouz'); ?>
    <?php echo inputRadio('pohlavi', 'muz', $pohlavi == 'muz'); ?>
    <?php echo inputRadio('pohlavi', 'zena', $pohlavi == 'zena'); ?>
    <?php echo textarea('popis', $popis); ?>
    <?php echo select('znalosti', array(
                    'jazyky' => array('en' => 'angličtina', 'de' => 'němčina', 'es' => 'španělština'),
                    'programování' => array('C' => 'Cčko', 'PHP' => 'Pehapko', 'C#' => 'Sí šárp'),
                    'pletení' => 'pletení'), $znalosti, true, 3); ?>
</form>

Vypíše to:
<form>
    <input type="text" name="jmeno" value="juriad">
    <input type="checkbox" name="cech" checked>
    <input type="checkbox" name="francouz">
    <input type="radio" name="pohlavi" value="muz" checked>
    <input type="radio" name="pohlavi" value="zena">
    <textarea name="popis">
ahoj, jak se máš?
</textarea>
    <select name="znalosti" size="3" multiple>
<optgroup label="jazyky">
<option value="en" selected>angličtina</option>
<option value="de">němčina</option>
<option value="es">španělština</option>
</optgroup>
<optgroup label="programování">
<option value="C" selected>Cčko</option>
<option value="PHP" selected>Pehapko</option>
<option value="C#">Sí šárp</option>
</optgroup>
<option value="pletení">pletení</option>
</select>
</form>
Jcas
Profil *
juriad:
Ten čas, co jsi tomu dal si snad ani nezasloužím.
Právě jsi zabil 4hod. mé práce. :)))
Ale co se mi na tom líbí je, že jsem nenarazil na nic, čemu bych nerozumněl. (teda zatím).
Děkuju

A když už jsis s tím dal takovou práci, tak by možná stálo za to, to nějak vypíchnout. "generování formuláře" nebo tak nějak. Tady je to zašité v JS pod absolutně blbým názvem vlákna.
juriad
Profil
Jcas:
Snažil jsem se to napsat co nejjednodušeji, a proto to spoustu věcí neumí. Je to použitelné jen na jednoduchoučké formy.
Lepší a přehlednější by to bylo objektově (jako to má Nette).

Na generování formů jsem zběžně našel:
http://www.dyn-web.com/php/form_builder/ (nevypadá moc pěkně, přijde mi příliš nízkoúrovňový)

nebo v Nette je také něco dostupného:
http://doc.nette.org/en/2.1/forms (to se mi opravdu líbí, ale nevím, zda je to možné použít samostatně; třeba se k tomu vyjádří Jan Tvrdík).

ostatní:
Prosím o vyjádření, zda je moje ukázka natolik užitečná, aby se to nějak zužitkovala.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: