Checkbox volani php v onChange

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

Ahoj,

chtěl bych se zeptat jak vyřešit tento problém. Chci aby se mi pokaždé když změním stav Checkboxu zavolala metoda, která by zjistila stav zaškrtnutí a podle toho by volala další příslušné metody.

Momentálně jsem se dopracoval po hledání zde na foru k tomuto :

<?php
$form->addCheckbox('control_mode', 'Zapnout řízení')
                ->controlPrototype->onChange('alert("text")');
?>

To funguje akorát já bych potřeboval místo toho ‚alert(„text“)‘ volat nějakou php metodu ne JS.

Lze to nějak udělat nebo se musí použít AJAX.

Díky za rady.

Honza Kuchař
Člen | 1662
+
-2
-

Zjisti si, jak funguje HTTP a hned ti bude jasné co použít. ;-)

Popik
Člen | 30
+
0
-

Už je mi to jasnější. Díky za nasměrování. Ale stále to nemám dořešené.

Dostal jsem se do tohoto stadia:

<?php
   $form->addCheckbox('control_mode', 'Zapnout řízení')
                    ->controlPrototype->onChange('window.open("?presenter=Control","_self")');
?>

Ale co mam přidat abych volal funkci v tom prezenteru?

Díky.

srigi
Nette Blogger | 558
+
0
-

Nie to nie je spravna cesta. Vobec controlPrototype->onChange nepouzivaj. Urob to tak, ze v sablone kde to kces, si pred tagom <body> includni jQuery a svoj vlastny JS subor. Do neho potom daj

$(function(){
	$('#ID_TOHO_CHECKBOXU').change(function(){
		$.ajax( // nastuduj si ajax na docs.jquery.com
			url : URL KDE TO MA SMEROVAT,
			data: $(this).val()
		);
	});
});

Teraz ma napadlo, ze tu URL si musis nejako preniest do toho svojho JS suboru. Idealne (ak teda pojdes tou cestou co som naznacil – vola sa to unobtrusive javascript) je preniest si ju cez nejaky atribut daneho tagu.

Takze controlPrototype nakoniec vyuzijes, ale na to aby si URL zapisal to toho atributu. Najlepsie bude pouzit bezny atribut rel.

$form->addCheckbox('control_mode', 'Zapnout řízení')
     ->controlPrototype->rel($this->link(<ROUTA> [,arg [,arg ...]]));

V tom ajaxe si tu URL vytiahnes cez jQuery, cca takto

		$.ajax( // nastuduj si ajax na docs.jquery.com
			url : $(this).attr('rel'),
			data: $(this).val()
		);
Popik
Člen | 30
+
0
-

No povedlo se mi udělat polofunkční řešení a to takové, že jsem volal fci. submit();

<?php
...
  $form->addCheckbox('control_mode', 'Zapnout řízení')
                ->controlPrototype->onChange('submit();');

  $form->onSubmit[] = array($this, 'controlFormSubmitted');
...
?>

To fungovalo a controlFormSubmitted se zavolalo ale jen tehdy, když byl zaskrtnuty a já ho chtěl odškrtnout. Jinak ne. Potřebuju aby to fungovalo pro oba případy tj. zaškrtávání i odškrtávání.

srigi
Nette Blogger | 558
+
0
-

Popik napsal(a):
Potřebuju aby to fungovalo pro oba případy tj. zaškrtávání i odškrtávání.

No tak nebud lenivy a nakod si to co som pisal vyssie. A nedaval JS kod do elementov ako onSubmit(), onChange(). Takto sa kodilo v 90 rokoch a je to velmi nedoporucovane ;)

Editoval srigi (23. 5. 2010 12:15)

Honza Kuchař
Člen | 1662
+
0
-

Ještě doplním:

url : {link funkce!},

Presenter:

function handleFunkce() {
	// bla
}

//EDIT: ten onchage atribut opravdu nepoužívej. Pokud se chceš dozvědět více, hledej „unobstructive JavaScript“

Editoval Honza Kuchař (23. 5. 2010 13:44)

srigi
Nette Blogger | 558
+
0
-

Honza Kuchař napsal(a):

Ještě doplním:

url : {link funkce!},

Bohuzial toto nebude fungovat, ked bude pouzity externy JS subor (nerenderuje sa frameworkom). Vtedy je nutne URL „vyrenderovat“ do nejakeho HTML atributu a cez DOM si ju vytiahnut.

Ak by bol JS kod priamou sucastou View sablony, tak to samozrejme neplati (odstavec vyssie), ale ani priamy zapis JS kodu do HTML nie je IMHO doporucovane (XHTML to priamo zakazuje).

Popik
Člen | 30
+
0
-

No, nezlobte se, ale přijde mi, že jdete s kanonem na vrabce. Mám jiné řešení. Doufám, že to někomu dalšímu pomůže až bude čelit podobnému problému. Každopádně děkuji Honzovi Kuchařovi za správné nasměrování.

<?php

protected function createComponentControlForm() {
     $form = new AppForm;
     $control = new ControlModel();

     $form->addCheckbox('control_mode', 'Zapnout řízení')
                    ->controlPrototype->onChange('window.open("?do=writeaccessstatus&
presenter=control","_self")');

     if ($control->getAccessStatus() == 1){
        $form['control_mode']->setValue(1);

     }

     return $form;
}

public function handleWriteAccessStatus(){
    $control = new ControlModel();
    $values = $this->createComponentControlForm()->getForm();


    if (strPos($values,"checked")) {
         $control->setAccessStatus(0);

    }else{
        $control->setAccessStatus(1);
    }
     $this->redirect('this');

}
?>
Honza Kuchař
Člen | 1662
+
0
-

Má to jednu chybu, co kdy změníš název presenteru, tak na toto jistě zapomeneš… Nebo dokonce pokud změní router, tak to bude uplně mimo. oprav

->controlPrototype->onChange('window.open("?do=writeaccessstatus&presenter=control","_self")');

na

->controlPrototype->onChange('window.open("'.$this->link("writeAccessStatus!").'","_self")');
Popik
Člen | 30
+
0
-

Dobře, díky za připomínku :-)

David Grudl
Nette Core | 8136
+
0
-

Nemělo by tam být onchange místo onChange?