#1 16. 5. 2009 16:05

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

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

 

#2 17. 5. 2009 1:00

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

Re: Nahrávání RadioListu AJAXove podle vyberu

co, nenajde se nikdo kdo by me posoupnul trosku dal???

Offline

 

#3 17. 5. 2009 11:39

nAS
Nette guru
Místo: Praha
Registrovaný: 18. 12. 2008
Příspěvky: 210
Web

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.


$application->run(); // Run Forrest, run!

@MartinMajor

Offline

 

#4 17. 5. 2009 11:42

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

Re: Nahrávání RadioListu AJAXove podle vyberu

konecne se nekdo ozval :) kouknu, diky moc…

Offline

 

#5 17. 5. 2009 13:15

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

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

nAS
Nette guru
Místo: Praha
Registrovaný: 18. 12. 2008
Příspěvky: 210
Web

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);

$application->run(); // Run Forrest, run!

@MartinMajor

Offline

 

#7 18. 5. 2009 14:40

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

Re: Nahrávání RadioListu AJAXove podle vyberu

Diiiiiiky moc :) facha to…

Offline

 

#8 21. 5. 2009 8:50

phx
Moderator
Místo: HK
Registrovaný: 17. 4. 2008
Příspěvky: 778
Web

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

 

#13 27. 7. 2009 22:23

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

Re: Nahrávání RadioListu AJAXove podle vyberu

a opravdu ti nefunguje ten postup, ktery je popsany v Spojeni formulare s AJAXem??? I pres upozorneni, ktere tu hodil PHX??? Protoze mi prijde, ze resi presne tvuj problem…

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

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

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

cuga
Člen
Místo: Opava
Registrovaný: 22. 10. 2008
Příspěvky: 163
Web

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:

  1. hlavička
  2. obsah
  3. 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

 

Zápatí