Jak nejlépe přidat k prvku formuláře kus javascriptu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xTrip
Člen | 15
+
0
-

zdravím,
jak nejlépe řešit situaci, kdy mám nějaký vlastní, nebo i stávající formulářový prvek a potřebuji k němu přidat nějaký javascript. Ne validační, ale pro rozšíření funkčnosti. Toto řešení se mi nezdá zrovna nejkrásnější:

<?php

class Calendar extends Nette\Forms\FormControl
{

        public function getControl()
        {

           ob_start();
           echo $this->control;
           echo '<script type="text/javascript">
		....
                </script>';
           return ob_get_clean();
        }
}
?>

jde to lépe?

díky

hrach
Člen | 1838
+
0
-

hm, co třeba pomocí Nette\Html – použít jako prázdný container :)

Jod
Člen | 701
+
0
-

Ja používam jQuery, všetko si prekne zadefinujem do .js súboru pri loade.

Napr.:

Máš kalendár/e s classou calendar. Vytvoríš si súbor custom.js

<script>
$(document).ready(function(){
	$('.calendar').click(function() {
		// vlastný kód, napr.
		alert($(this).val());
	});
}
</script>

Nejak takto, alebo hladáš iné riešenie?

Editoval Jod (7. 12. 2008 16:18)

xTrip
Člen | 15
+
0
-

Ano nějak takto. Akorát trochu univerzálnější řešení. V tom skriptu máš natvrdo $('.calendar'). Když se to generuje v getControl, použiju $("#' . $this->getHtmlId() . '"). Čili jde mi jednak o to, abych se dostal k id prvku. Druhak jsem toto chtěl udělat už v constructoru prvku, měl bych všechny javascripty k dispozici už před renderováním a vypsal bych si je v konečném xhtml kodu na jednom místě, třeba v layoutu. Ale v konstruktoru se nemohu dostat k id budoucího html elementu

Jod
Člen | 701
+
0
-

Načo to tam pchať po idčkach, keď stačí dať kalendáru classu, a javascript obslúži daný component. Ale iste sa vyskytne prblém, keď treba používať idčka, to som skúšal riešiť tak, že som kódom vygeneroval niečo ako var calendarId = $calendar a potom v js to použil, ale nepozdáva sa mi to tiež moc.

xTrip
Člen | 15
+
0
-

hrach napsal(a):

hm, co třeba pomocí Nette\Html – použít jako prázdný container :)

Díky, to je asi nejrozumnější řešení.

public function getControl(
{
	$code = 'nějaký js kód';
	$js = Html::el('script')->type('text/javascript')->setText($code);
	$control = Html::el()->add(parent::getControl())->add($js);
	return $control;
}

Editoval xTrip (7. 12. 2008 22:43)

Jod
Člen | 701
+
0
-

Teoreticky by si miesto premennej mohol radšej pridať Template, bolo by to pohodlnejšie :)
Je to dobré riešenie, len ja radšej pchám javascript do externých súborov, je to viac seo =D

xTrip
Člen | 15
+
0
-

Jod napsal(a):

Teoreticky by si miesto premennej mohol radšej pridať Template, bolo by to pohodlnejšie :)
Je to dobré riešenie, len ja radšej pchám javascript do externých súborov, je to viac seo =D

Přesně tak. Javascript budu mít v externím souboru, naimportuji, přefiltruji a vložím do Html:el(‚script‘).

To se mi jeví jako docela pěkné řešení.

Původně jsem chtěl vlastní javascriptové rozšíření nějak přidat k javascriptu, které se generují s validací a myslel jsem, že by se pak vše vypsalo společně pod formulářem.

Zatím su spokojený.

Ještě mne napadlo jedno řešení, ale ještě jsem ho nezkoušel. Jde o to, že celou tuhle taškařici dělám vlastně jen kvůli tomu, abych získal id prvku. Pak by však stačilo ten javascriptový kód obalit funkcí, které se id prvku předá, umístit to do souboru a naimportovat jako externí javascript. U prvku pak použít prostě onclick.
Pak bych ale ani nepotřeboval vytvářet vlastního potomka FormControl a mohl bych to celé naroubovat třeba na obyčejný input prvek.

Tak tohle musím vyzkoušet :-) To se jeví jako ještě zajimavější.