Checkbox volani php v onChange
- Popik
- Člen | 30
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.
- Popik
- Člen | 30
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 | 555
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
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 | 555
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 | 1661
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 | 555
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
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 | 1661
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")');