Autor Zpráva
Mufna
Profil
Zdravím Vás. Řeším problém se začleněním javascriptu do PHP souboru. Mám php stránku s formulářem a chtěl bych, aby probíhala validace pomocí JS. Dříve jsem měl kompletní HTML stránku a validační javascript v hlavičce, no jak jsem přešel na PHP, tak občas něco musím řešit. Zkoušel jsem použít include či require a pomocí toho načítat samostatný *.js soubor, ale to nefunguje. Chtěl bych to právě takto nějak udělat, tzn. načítat js soubor.

<?php
  require ("html1.php");
  require ("../js/form_validation.js");
  wrt_header(0);
?>


Následuje HTML kód a v něm je někde ten formulář:

<form name="sendform" method="post" action="sendform.php" onsubmit="return validate_form();">
BetaCam
Profil
Mufna

no to si ho klidně načti, ale pokud vím tak JS musíš mít obalen tagy <script></script>
Mufna
Profil
BetaCam

Myslíš tím v tagu form ? V externím souboru asi ne.
imploder
Profil
Funkce require() je zřejmě obdobou příkazu require, který v dřívějších verzích PHP existoval. Zvláštní je na něm to, že soubory se přilinkují do kódu na místo, kde se require nachází, ještě před samotným provedením skriptu. Z toho vyplývá, že soubor se načte právě jednou nezávisle na tom, kolikrát a jestli vůbec se daná větev programu provede. Prostě něco jako instrukce pro překladač (ty věci, co se v C píšou za # na začátku řádku) spíš než normální funkce. Lepší je používat include(), které se chová úplně normálně.

S tvojím postupem je asi problém v tom, že začleňuješ javascript do PHP kódu jako by to byl PHP kód k provedení. Není divu, že ve výstupu skriptu se pak neobjeví. To, co chceš, je zapsat JS na standartní výstup, ne ho nechat provádět jako PHP kód. Takže správně by to mělo být třeba takhle:
$f = fopen("../js/form_validation.js", "r"); // otevře soubor 
fpassthru($f); //vypíše soubor na výstup a zavře ho 

To jde samozřejmě zkrátit na
fpassthru(fopen("../js/form_validation.js", "r"));
Mufna
Profil
imploder

Díky za poučení, alespoň jsem trochu moudřejší. Jdu to nějak jak píšeš zkusit, snad to dám do kupy a pojede mi to.
BetaCam
Profil
imploder
Funkce require() je zřejmě obdobou příkazu require, který v dřívějších verzích PHP existoval.

Co je to za nesmyslnou větu??

Z toho vyplývá, že soubor se načte právě jednou

Po znamená právě jednou??

Mufna

nevim proč to dělat složitě když do jde jednoduše :

js.js
<script>
function aaa()
{
alert("sdfsdf")
};
</script>


neco.php

<?php echo file_get_contents('js.js');
echo '<a href="#" onclick="aaa()">aaa</a>';

 ?>


nebo

<?php echo <script src="js.js"></script> ?>


ale nevim nejsem JS GURU
imploder
Profil
BetaCam
>> „Funkce require() je zřejmě obdobou příkazu require, který v dřívějších verzích PHP existoval.“
Co je to za nesmyslnou větu??
Na té větě není nic nesmyslného. Píše se o tom na té stránce, zkus na ni kliknout. Include a require byly dřív příkazy, v poněkud starší knize od Koska, kterou mám, se používají jenom tyto příkazy a o funkcích include() a require() tam není ani zmínka. O chování require se tam píše zhruba to, co v manuálu o funkci require(). Podrobně jsem to nezkoumal, asi to prostě změnili z příkazů na funkce.

„Z toho vyplývá, že soubor se načte právě jednou“
Po znamená právě jednou??
Co je to za nesmyslnou větu?? :-)
O Po jsem nic nepsal. Ani nevím, co to je.

<?php echo file_get_contents('js.js');
echo '<a href="#" onclick="aaa()">aaa</a>';

 ?>

nebo
<?php echo <script src="js.js"></script> ?>


ale nevim nejsem JS GURU

Především zřejmě nejsi PHP GURU. Chybí ti tam uvozovky. Řetězce se v PHP, stejně jako v Javascriptu, dávají do apostrofů nebo uvozovek. Bez nich to samozřejmě nemůže fungovat. Takhle by to fungovat mělo:
<?php echo "<script src=\"js.js\"></script>"; ?>

Javascript je skoro v pořádku, snad jen by se měl uvádět i druh skriptu a taky středníkem se ukončuje příkaz, ne blok (nevěř Měsíčkovi ty bludy, co píše v tomhle vlákně):
<script type="text/javascript">
function aaa()
{
alert("sdfsdf");
}
</script>

Když už ale soubor načítáš do tagu <script>, není potřeba a možná se ani nesmí ho dávat současně i do souboru se skriptem (aby tam nebyl ještě jednou zanořený). Ale možná to nevadí, PHP taky překousne zanořené zobáčky <? a ?> při includování (tato situace nastane, když se v kódu - uzavřeném mezi zobáčky poněvadž tam být musí - zavolá include() a vloží soubor, ve kterém je veškerý kód taktéž uzavřen mezi zobáčky).

Mufno, zkus to takhle:
-- js.js --
function aaa() 
{ 
alert("sdfsdf"); 
}


-- neco.php --
<?php echo <script src="js.js" type="text/javascript"></script> ?>
Měsíček
Profil
"(nevěř Měsíčkovi ty bludy, co píše v tomhle vlákně): "

Ano nevěř mu to ;-), ale přečti si to.
Mastodont
Profil
imploder
asi to prostě změnili z příkazů na funkce
Include jako funkce umí vrátit obsah načteného souboru, to je asi hlavní přínos této změny.
imploder
Profil
Měsíček
Jen jsem si domyslel, odkud ten podivný zápis asi tak má. Rozhodně ne z žádného seriózního zdroje.
Měsíček
Profil
"Především zřejmě nejsi PHP GURU. (na Betacama) "

Jinak Betacam je jeden z nejlepších na této diskusi, kteří se tady věnují PHP :) a to, že v rychlosti zapomene na uvozovky zdaleka nic neznamená, ber to jako radu ne buzeraci :)
BetaCam
Profil
imploder

V pořádku začnem se chytat za slova jak chceš.

„Po znamená právě jednou??“
Co je to za nesmyslnou větu?? :-)
O Po jsem nic nepsal. Ani nevím, co to je.


Překlep připomenu neboj.

Především zřejmě nejsi PHP GURU. Chybí ti tam uvozovky. Řetězce se v PHP, stejně jako v Javascriptu, dávají do apostrofů nebo uvozovek. Bez nich to samozřejmě nemůže fungovat.

Promiň odborníku. Takže tohle záleží na situaci a samotném stringu. Sou stringy ktere projdou i bez uvozovek. Ty rád vypínáš chyby viď? Tak si je vypni a dej si do scriptu :

<?php echo aaaaa; ?>


Copak ti to ukáže??

-- neco.php --
<?php echo <script src="js.js" type="text/javascript"></script> ?>


Sorry ale nechyběj ti tam uvozovky?? No nic

Include a require byly dřív příkazy, v poněkud starší knize od Koska, kterou mám, se používají jenom tyto příkazy a o funkcích include() a require() tam není ani zmínka.

A neni náhodou require jazykovej konstrukt??
imploder
Profil
BetaCam
jj chybí mi tam uvozovky. asi jsem to zkopíroval od tebe. Tak promiň, já do nich řetězce vždycky zavírám, nevěděl jsem, že to není nutné. Bývá to běžný problém.
V pořádku začnem se chytat za slova jak chceš.
Nezačnem. OK, rozumíš tomu všemu líp než já, já jsem o té možnosti nevěděl. Stačí? Spoustu lidí prostě neznám, tak nevylučuju, že udělají nějakou elementární chybu.

Měsíček
Když je to tak úžasně správná syntaxe, tak proč např. ve zmiňované knize o ní není ani zmínka? Prostě středník ukončuje příkaz a ne blok. A jak správně upozornil es, ne vždycky se dá žádný příkaz a prázdný příkaz zaměňovat.
Měsíček
Profil
"Spoustu lidí prostě neznám, tak nevylučuju, že udělají nějakou elementární chybu. "

Tak je nesuď :)

"Když je to tak úžasně správná syntaxe, tak proč např. ve zmiňované knize o ní není ani zmínka?"

Máš e-mail, jestli jsi ochoten se mnou komunikovat rád vysvětlím i tuto otázku.

"A jak správně upozornil es, ne vždycky se dá žádný příkaz a prázdný příkaz zaměňovat."

A basta!
Ssob
Profil
Uvozovky nebo apostrofy kolem řetězců jsou nutné. Viz http://diskuse.jakpsatweb.cz/index.php?action=vthread&forum=9&topic=75 382#6
DoubleThink
Profil *
A neni náhodou require jazykovej konstrukt??
Je, a vždy byl. Závorky jsou tam navíc, nemají žádný význam.

Řetězce se v PHP, stejně jako v Javascriptu, dávají do apostrofů nebo uvozovek. Bez nich to samozřejmě nemůže fungovat.
$str = <<<EOT
Jsem hustý řetězec bez uvozovek!
EOT;
BetaCam
Profil
DoubleThink
„A neni náhodou require jazykovej konstrukt??“
Je, a vždy byl. Závorky jsou tam navíc, nemají žádný význam.


Omlouvám se to nebyla otázka pouze rýpnutí do implodera.

imploder

„V pořádku začnem se chytat za slova jak chceš.“
Nezačnem. OK, rozumíš tomu všemu líp než já, já jsem o té možnosti nevěděl. Stačí?


Ne nerozumim tomu všemu lépe než ty. Já sám se považuji za začátečníka jak v PHP tak v jiných oblastech. Nikdy se nebudu považovat za pokročilého nebo snad dokonce profesionála. Víš proč?? Protože pokud bych se za jedno z toho začal považovat neměl bych už tendenci se zlepšovat a učit se dál a dál nové věci. Mám rád věcnou diskusi, ale rozhodně nemám rád útočný tón, který si zde předvedl. Kdyby si své pripomínky ( k zapomenutým apostrofům ) napsal normálně a né tak útočně jak si předvedl rád bych si s tebou nad tím tématem podiskutoval a možná by sme se i oba něco přiučili, ale bohužel to se nestalo.

Jen jsem si domyslel, odkud ten podivný zápis asi tak má. Rozhodně ne z žádného seriózního zdroje.( Ohledně mého zápisu JS)

Většina lidí co mě tady zná, zná i můj názor na JS. Tedy to, že sem jeho zarputilí odpůrce. Proč? Nikdy se nesnažím udělat aplikaci postavenou na tom co si může klient vypnout. Musím se přiznat, že v podstatě neznám ani moc syntaxi JS a ani ji moc nechci znát. JS uznávám pouze u věcí které :

1) Neovlivní chod aplikace a pokud je JS vypnut u klienta tak vše funguje jak má.
2) Spadá k bodu 1) a je to validace vstupů formuláře před samotnou validací na straně serveru.

Ano vzhledem k tomu, že sem odpůrcem JS a v podstaně ani neznám jeho syntaxi ( čím se vůbec netajím ) sem se řídil podle pana googla a na dotaz "JavaScript Funkce" mi vrátil odkaz na stránku světe div se www.jakpsatweb.cz/javascript/funkce.html odkud sem zápis vytáhl v podstatě copy&paste stylem. A jak je tam zapsán s ; za }. Opravdu se omlouvám, že sem to zkopíroval špatně, ale hlavně jde o to že to se zdejším tématem nemělo nic společného a zápis byl pouze ilustrativní.
es
Profil *
Ak by som sa mýlil, tak ma opravte, no vo všetkých programovacích jazykoch používajúcich { a },
je ; za } vždy nadbytočná, okrem prípadu, kedy by bolo treba naozaj vložiť prázdny príkaz.
A za } môže ísť hneď ďalší príkaz, aj bez oddelenia nejakým "bielym" znakom.
Měsíček
Profil
"Ak by som sa mýlil, tak ma opravte, no vo všetkých programovacích jazykoch používajúcich { a }, "

Nemýlíš se.

"Opravdu se omlouvám, že sem to zkopíroval špatně, ale hlavně jde o to že to se zdejším tématem nemělo nic společného a zápis byl pouze ilustrativní."

Zkopíroval jsi to dobře.
es
Profil *
Nemýlíš se.
Mýliš sa, že sa nemýlim, aj keď pre použitie na bloky to asi platí.
V PHP5 je na string $s možné pre prístup k prvému znaku použiť syntax $s[1] aj $s{1}.
A pre syntax {} tvrdenie neplatí. Možno aj preto je táto syntax v PHP6 zavrhnutá.
es
Profil *
Oprava, príklad je pre prístup k druhému znaku.
Mufna
Profil
Tak koukám, jakou jsem tím svým dotazem rozvířil diskusi :-o

Jen musím podotknout, že tady někdo (BetaCam) uváděl v externím skriptu konstrukci:

js.js
<script>
function aaa()
{
alert("sdfsdf")
};
</script>

což je špatně. <script></script> tam vůbec nemá být, pouze samotná funkce. Ale to už jsem naštěstí věděl již dřív. Hlavně že jste mi zde poradili použít pro načtení JS do PHP normální echo, což mě nenapadlo. Tím jsem to vyřešil a funguje to. Takže všem kdo se mi snažili poradit díky !

Včetně správné syntaxe (no, nevím jestli mám použít slovo "správné", taky nejsem žádný PHP ani JS Guru - takže řekněme spíše "funkční" syntaxe) to vypadá takto:

<?php
  require ("html1.php");
  echo '<script src="../js/form_validation.js" type="text/javascript"></script>';
  wrt_header(0);
?>
es
Profil *
<?php require 'html1.php'; ?>
<script src="../js/form_validation.js" type="text/javascript"></script>
<?php wrt_header(0); ?>
Načo používať PHP na vypisovanie stále toho istého textu?
Mufna
Profil
es

Načo používať PHP na vypisovanie stále toho istého textu?

Tak asi máš recht. Byl jsem z toho začlenění JS v PHP souborech na začátku trochu zmatený, ale vlastně je to úplně v poho. Místo abych JS umístil do HTML hlavičky, která se načítá do každé stránky, dal jsem ho jen do stránky s formulářem, tedy těsně před formulář.

Takže nakonec, vlastně úplně jednoduše, takhle:

<?php
  require ("html1.php");
  wrt_header(0);
?>

<div main> atd.

<div class="formbox">
  <script src="../js/form_validation.js" type="text/javascript"></script>
  <form name="sendform" method="post" action="sendform.php" onsubmit="return validate_form();">

<?php
  wrt_footer();
?>


To tvoje je stejný, já to udělal takto, abych měl ve výsledným zdrojáku stránky větší pořádek.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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