#1 16. 5. 2009 16:05
Nahrávání RadioListu AJAXove podle vyberu
Zkusil jsem vyuzit threade „Spojení formulářů s AJAXem“, kde David popisuje, jak na to, ale moc uspesny sem nebyl.
Nevim jak pak dostat druhy RadioList, ktery se nacte na zaklade prvniho vybraneho.
V presenteru mam
$form->addGroup('Způsob dodání');
$form->addRadioList('shipping','', $shipping->getShipping()->select('*')->fetchPairs('id','title'));
$form->addGroup('Způsob platby');
$form->addRadioList('payment','');
$form['shipping']->getControlPrototype()
->onchange('loadBox(1, this.value);');
$form['payment']->getControlPrototype()
->onchange('loadBox(2, this.value);');
...
if ($form->isSubmitted()) {
// teprve nyni dosadime hodnoty
$form['payment']->setItems( ... tady netusim co hodit ...);
if ($form->isValid()) {}
} else {
$form['payment']->setDisabled();
$form['submit1']->setDisabled();
}
v sablone mam
<script type="text/javascript">
function loadBox(phase, value)
{
if (phase === 1) {
// zvolena hodnota prvniho select boxu
$('#frmform-submit1').attr('disabled', true);
// natáhne obsah druhého selectboxu pomocí AJAXu
$.get("?do=loadData", {"value": value, "phase": phase}, function(data) {
$('#frmform-payment').parent().html(data);
});
} else if (phase === 2) {
$('#frmform-submit1').attr('disabled', false);
}
}
</script>
{$form}
a pak jeste handler
public function handleLoadData($phase, $value) {
$form = $this->template->form;
$payment = new Payments();
if ($phase == 1) {
// naplníme select box prvky a vypíšeme na výstup
$form['payment']->setItems($payment->getPayments()->select(array('id','title'))->where('shippingId = %i',$value)->fetchPairs('id','title'));
$form['payment']->setDisabled(FALSE);
echo $form['payment']->getControl();
}
// konec zpracování
$this->terminate();
}
handler mi vrati spravne to co ma, ale uz nevim jak to dostat zpatky do toho formulare…
DOPLNENO: a jeste by me zajimalo, jak docasne do te druhe skupiny napsat „Vyberte způsob platby“. Jakmile by uzivatel vybral způsob, text by se vyhodil a misto nej by byl pozadovany RadioList… diky
Editoval cuga (16. 5. 2009 16:13)
Offline
#3 17. 5. 2009 11:39
Re: Nahrávání RadioListu AJAXove podle vyberu
Podívej se třeba na tento příklad. Jde o to, že bys měl vyrenderovat rovnou vše a nepotřebné věci skrýt. A poté po kliknutí pouze zobrazit konkrétní část a ne načítat AJAXem. Takhle ti aplikace bude fungovat (i když méně komfortně) i bez JavaScriptu a vyhneš se časovému zdržení při AJAXovém požadavku.
Offline
#5 17. 5. 2009 13:15
Re: Nahrávání RadioListu AJAXove podle vyberu
to nAS: hmmm, krome toho, ze se mi to nepodarilo rozchodit, je taky problem, ze nevim, jak vytahnout z jednoho radiolistu aktualni hodnotu a podle toho odkryt pozadovany div…
zkusil sem to takhle:
$form->addGroup('Způsob dodání');
$sub = $form->addContainer('shipping');
foreach($shipping->getShipping()->select('*')->fetchPairs('id','title') as $id => $title) {
$sub->addRadioList('shipping'.$id,'', array($id => $title))
->addRule(Form::FILLED, 'Vyberte způsob dodání')
->addCondition(Form::FILLED, TRUE) // conditional rule: if is checkbox checked...
->toggle('paymentBox'.$id); // toggle div #sendBox
}
$form->addGroup('Způsob platby');
$sub = $form->addContainer('payment');
foreach($payments->getPayments()->select('shippingId')->toFluent()->setFlag('DISTINCT')->fetchAll() as $row) {
$form->addGroup()
->setOption('container', Html::el('div')->id('paymentBox'.$row->shippingId));
$sub->addRadioList('payment'.$row->shippingId,'', $payments->getPayments()->select('*')->where('shippingId = %i',$row->shippingId)->fetchPairs('id','title'))
->addRule(Form::FILLED, 'Vyberte způsob platby');
}
Aaaakorat, ze diky tomu mam vic radiolistu, takze muzu vybrat zaroven dva druhy dopravy i dva zpusoby platby…
Offline
#6 18. 5. 2009 2:12
Re: Nahrávání RadioListu AJAXove podle vyberu
Třeba takhle:
// Shipping type
$shipping = $form->addRadioList('shipping', 'Shipping type', array('plane' => 'by plane', 'bus' => 'by bus'));
$shipping->addCondition(Form::EQUAL, 'plane')
->toggle('planeBox');
$shipping->addCondition(Form::EQUAL, 'bus')
->toggle('busBox');
// group Plane
$form->addGroup()
->setOption('container', Html::el('div')->id('planeBox'));
$form->addText('planeNum', 'Plane Number', 35);
// group Bus
$form->addGroup()
->setOption('container', Html::el('div')->id('busBox'));
$form->addText('busNum', 'Bus Number', 35);
Offline
#8 21. 5. 2009 8:50
Re: Nahrávání RadioListu AJAXove podle vyberu
Vcera jsem ten ajax resil taky a problem je v tom, ze to co pouzivas posila HTML fragment NEobaleny v JSON. Pokud jsi jeste nacetl neco takovehoto tak vsechny prichozi pozadavky v AJAX jsou ocekavany v JSON coz ty nemas. Takze to nenacti a je to vyresene:)
Vcera mi to trvalo asi hodinu nez jsme to vyresil:)
Asi by to chtelo aktualizovat onen http://forum.nette.org/…aru-s-ajaxem nebo dovysvetlit problem s JSON. Ja na to nemam znalosti – zaitm.
Offline
#9 24. 6. 2009 15:11
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
Tak nakonec jsem to rozpohyboval (pozadavek totiz skoncil pri volani neexistujici funkce spinner() – casem dopisu), ale nenacitaji se mi hodnoty do druheho selectboxu:
Mam to takto:
<?php
if ($form->isSubmitted())
{
// teprve nyni dosadime hodnoty
$form['mesto']->setItems( ... );
if ($form->isValid()) {
}
} else {
$form['mesto']->setDisabled();
$form['submit1']->setDisabled();
}
?>
Tady nevim co mam dosadit za hodnoty i kdyz dam napr $form[‚mesto‘]->setItems(array(1 ⇒ ‚hodnota1‘)); tak se mi toto pole nenacte.
Dale mam funkci loadBox()
<script type="text/javascript">
function loadBox(phase, value)
{
if (phase === 1) {
// zvolena hodnota prvniho select boxu
$('#frmregistraceForm-submit1').attr('disabled', true);
// zobrazi symbol, že se něco načítá
//spinner();
// natáhne obsah druheho selectboxu pomocí AJAXu
$.get("?do=loadData", {"value": value, "phase": phase}, function(data) {
$('#frmregistraceForm-mesto').parent().html(data);
});
} else if (phase === 2) {
// zvolena hodnota druheho select boxu, povolí tlačítko submit
$('#frmregistraceForm-submit1').attr('disabled', false);
}
}
</script>
handler je takovyto:
<?php
public function handleLoadData($phase, $value)
{
$form = $this->template->form;
$data = new Database();
if ($phase == 1) {
// naplníme select box prvky a vypíšeme na výstup
$form['mesto']
->setItems($data->getMesta()->select(array('id', 'nazev'))->where('kraj = %s', $value)->orderBy('nazev')->fetchPairs('id', 'nazev'));
$form['mesto']->setDisabled(FALSE);
echo $form['mesto']->getControl();
}
// konec zpracování
$this->terminate();
}
?>
Editoval dotTwelve (24. 6. 2009 18:12)
Offline
#10 25. 6. 2009 10:30
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
Druhy SELECTbox se mi v pozadi nacte, s tim ze:
<select onfocus="this.onmousewheel=function(){return false}" onchange="loadBox(2, this.value);" name="mesto" id="frmregistraceForm-mesto"><option value="646">ADAMOV</option>
atd...
Jenze po vybrani kraje v prvnim selectu se skryje druhy select a uz se nezobrazi…
Kde muze byt chyba? :-(
Ztroskota mi to na funkci echo:
<?php
echo $form['mesto']->getControl();
?>
Editoval dotTwelve (26. 6. 2009 12:32)
Offline
#11 27. 6. 2009 11:33
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
Cannot send header after HTTP headers have been sent (output started at app/presenters/InstitutionPresenter.php:244).
To je presne na radku, kde mam:
<?php
echo $form['mesto']->getControl();
?>
Editoval dotTwelve (30. 6. 2009 9:20)
Offline
#12 27. 7. 2009 19:32
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
Po delsi pauze se opet ptam, zda-li je nekdo ochoten pomoci…
Editoval dotTwelve (28. 7. 2009 9:45)
Offline
#14 28. 7. 2009 9:38
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
No jenze ja nechapu to upozorneni, jestli mas na mysli JSON data.
Offline
#15 28. 7. 2009 10:23
Re: Nahrávání RadioListu AJAXove podle vyberu
aha :) no problem je v tom, ze kdyz pouzijes ten jquery kod, tak ti Handler vraci vysledky v JSONu, ale s tim navod v tom druhe threadu nepocita, takze to nebude fungovat…
kdyz ho nepouzijes (tzn. nedas do <head> tag <script … /> tak ti to bude vracet HTML a melo by to byt v cajku…
Offline
#16 28. 7. 2009 10:44
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
problem je v tom, ze jelikoz pouzivam i datagrid, tak mam v hlavicce spoustu tagu <script>
<!-- jQuery -->
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.core.js"></script>
<script type="text/javascript" src="http://jqueryui.com/latest/ui/ui.datepicker.js"></script>
<script type="text/javascript" src="/0.1/document_root/js/jquery.livequery.js"></script>
<!-- custom JS -->
<script src="/0.1/document_root/js/jquery.nette.js" type="text/javascript"></script>
<script src="/0.1/document_root/js/datagrid.js" type="text/javascript"></script>
<script src="/0.1/document_root/js/form.js" type="text/javascript"></script>
tak a ted kterej vyhodit?
Offline
#17 28. 7. 2009 10:50
Re: Nahrávání RadioListu AJAXove podle vyberu
dle meho
<script src=„/0.1/document_root/js/jquery.nette.js“ type=„text/javascript“></script>
ale nevim jak ti to ovlivni ten datagrid… pripadne pres {ifCurrent … } ho na te konkretni strance vyhod…
Offline
#18 29. 7. 2009 14:27
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
Tak uz mi to funguje, akorat problem nastava pri vyberu jine, nez prvni polozky v prvnim select boxu. Prvni polozka posila:
Date Wed, 29 Jul 2009 12:23:24 GMT
Server Apache
X-Powered-By Nette Framework
Expires Mon, 23 Jan 1978 10:00:00 GMT
Cache-Control s-maxage=0, max-age=0, must-revalidate
Pragma no-cache
Set-Cookie PHPSESSID=928b10a40fded10dfee37d4921d4b5384b9e735c; path=/; httponly
nette-browser=0.068650825888999; path=/; httponly
Content-Length 222
Keep-Alive timeout=15, max=96
Connection Keep-Alive
Content-Type application/json
zatimco ostatni polozky ze select boxu posilaji hlavicku
Date Wed, 29 Jul 2009 12:25:20 GMT
Server Apache
X-Powered-By Nette Framework
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
Set-Cookie PHPSESSID=928b10a40fded10dfee37d4921d4b5384b9e735c; path=/; httponly
nette-browser=0.068650825888999; path=/; httponly
Vary Accept-Encoding
Content-Encoding gzip
Content-Length 12561
Keep-Alive timeout=15, max=100
Connection Keep-Alive
Content-Type text/html
Vidim zde problem v Content-Type. Mate nejaky napad jak rici vsem polozkam pri vyberu v select boxu aby posilaly content-type: application/json? Respektive to posila znova hlavicku, coz by asi nemelo…
Editoval dotTwelve (29. 7. 2009 16:46)
Offline
#19 30. 7. 2009 11:04
- MartinJanda
- Člen
- Místo: Brno
- Registrovaný: 7. 6. 2008
- Příspěvky: 65
Re: Nahrávání RadioListu AJAXove podle vyberu
Tak Content-Type v hlavičce odezvy handleru změníš takto:
$response = Environment::getHttpResponse();
$response->setHeader('Content-type', 'application/json');
Offline
#20 30. 7. 2009 11:30
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
no takze nechapu proc se mi posila znova hlavicka viz.
Cannot send header after HTTP headers have been sent (output started at /0.1/app/presenters/InstitutionPresenter.php:286).
to je presne tento radek
echo $form['mesto']->getControl();
Offline
#21 30. 7. 2009 11:30
- MartinJanda
- Člen
- Místo: Brno
- Registrovaný: 7. 6. 2008
- Příspěvky: 65
Re: Nahrávání RadioListu AJAXove podle vyberu
Problém má 2 řešení, buď pro danou stránku
vynecháš: <script src=„/0.1/document_root/js/jquery.nette.js“
type=„text/javascript“></script>
nebo tu komunikaci, resp. odpověď z handleru předěláš na json řetězec a potřebně upravíš.
Bohužel tomu rozumím dost málo, abych ti konkrétněji pomohl, ale třeba se někdo najde.
Ten ti vypíše ten HTML kód pro formulář.
Pořadí by mělo být:
- hlavička
- obsah
- v handleru musíš mít
$this->terminate();
Ještě se může stát, že z handleru ti to vrací chybu, tedy celou stránku s Debug výstupem, kde se hlavička už posílá. Nevím jestli používáš Firebug, ale tam by to bylo vidět.
Editoval romansklenar (30. 7. 2009 11:36)
Offline
#22 30. 7. 2009 11:34
- romansklenar
- Moderator

- Místo: Ostrava
- Registrovaný: 20. 7. 2008
- Příspěvky: 769
- Web
Re: Nahrávání RadioListu AJAXove podle vyberu
Pokud máš v InstitutionPresenter.php na řádku 286 echo
$form['mesto']->getControl(); tak čemu se potom divíš? Nemá to tam
co dělat. Ta hlavička se neposílá „znova“, tam kde ti to řve by se
měla hlavička odesílat poprvé, jenže tím echem už jsi poslal něco na
výstup…
EDIT: to už měsíc řešíš takovouto chybu?
Offline
#23 30. 7. 2009 11:45
- dotTwelve
- Člen

- Místo: Praha
- Registrovaný: 19. 6. 2009
- Příspěvky: 146
Re: Nahrávání RadioListu AJAXove podle vyberu
No i kdyz vynecham ten script jquery.nette.js tak to zlobi. Jj mel jsem mezi tim prestavku, pak jsem myslel ze se na to vybodnu ale rikam si, ze mozna uz jsou dobri lide po dovoleny a radi pomohou ;) Tvoje reseni Romane?
Offline
#24 30. 7. 2009 11:56
- romansklenar
- Moderator

- Místo: Ostrava
- Registrovaný: 20. 7. 2008
- Příspěvky: 769
- Web
Re: Nahrávání RadioListu AJAXove podle vyberu
Vykreslovat formulář v šabloně, tam kde patří – echo v presenteru nemá co dělat.
Offline
#25 30. 7. 2009 12:48
- MartinJanda
- Člen
- Místo: Brno
- Registrovaný: 7. 6. 2008
- Příspěvky: 65
Re: Nahrávání RadioListu AJAXove podle vyberu
A v jaké situaci vlastně ty selectBoxy chceš použít? Nebude vhodnější použít jeden selectBox s větší hloubkou? Jako že do addSelect nacpeš:
array(
'test' => 'test',
'test1' => 'test1',
'podtest' => array(
'test2' => 'test2',
'test3' => 'test3'
)
)
Pokud těch položek není stovka, tak to bude fungovat, bude to přístupnější a v konečném důsledku použitelnější, ne?
Offline
- Úvodní stránka
- » Formuláře
- » Nahrávání RadioListu AJAXove podle vyberu


