Závislý select uvnitř replikátoru

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

Ahoj, Měl bych takový dotaz, už si s tím chvilku hraju, ale pořád to nejde. Potřeboval bych udělat závislý select uvnitř addDynamic(). Rozchodil jsem replikátor i závislý select, ale dohromady mě to nejde. Závislý select jsem prvně dělal podle kuchařky a pak jsem si všiml, že je na to přímo doplněk. Už mě to nehází chyby, ale nefunguje to. Během toho, co jsem psal tenhle příspěvek mě začal fungovat ajax. Nicméně hází 500 internal error. Předpokládám, že to bude v té invalidaci. Asi se neumím dobře odkázat na prvek, který chci invalidovat. kod mám následující:

presenter

protected function createComponentEditTrip($name)
{
    $form = new Form($this, $name);

    $presenter = $this;
    $invalidateCallback = function () use ($presenter) {
            /** @var \Nette\Application\UI\Presenter $presenter */
            $presenter->invalidateControl('jsonFormSnippet');
    };
    $replicator = $form->addDynamic('trips', function (Container $container) use ($invalidateCallback, $presenter) {
        $container->addSelect("attribute", "Přívlastek", $presenter->dynamic->getDynamic()->fetchPairs('id', 'dynamic_name'))
            ->setPrompt('--Vyberte--')
            ->setAttribute("class", "zmena");
        $container->addJSelect('dynamic', 'Dynamic', $container['attribute'], function($form) {
            dump($form['trips-attribute']->getValues()->attribute);
//                    exit();
                switch ($form['trips-attribute']->getValues()->attribute) {
                    case 3:
                        $return = $this->staticPagesModel->getStaticPages()->fetchPairs('id', 'title');
                        break;
                    case 7:
                        $return = $this->gallery->getGallery()->fetchPairs('id', 'type');
                        break;
                    default:
                        $return = array("Vyberte sekci");
                        break;
                }
                return $return;
        });
        $container->addSubmit('remove', 'Smazat')
                ->addRemoveOnClick($invalidateCallback);
    }, 1);

    /** @var \Kdyby\Extension\Forms\Replicator\Replicator $replicator */
    $replicator->addSubmit('add', 'Přidat dalšího')
            ->addCreateOnClick($invalidateCallback);

    $form->addSubmit('send', 'Zpracovat')
            ->onClick[] = callback($this, 'editTripSubmitted');

    //dump($form['trips-dynamic']->components);

    if($this->isAjax()) {
            $form['trips-dynamic']->addOnSubmitCallback(function() use($presenter) {
                    $presenter->invalidateControl('jsonFormSnippet');
            });
    }
    return $form;
}

a pohled

{snippet jsonFormSnippet}
    {form editTrip}
        {foreach $form['trips']->containers as $id => $user}
            <div class="pair" id="attribute">
                {label trips-$id-attribute /}{input trips-$id-attribute}
                {input trips-$id-attribute_submit}
            </div>
            <div class="pair" id="attribute">
                {label trips-$id-dynamic /}{input trips-$id-dynamic}
            </div>
            <div class="pair">
                {input trips-$id-remove class=>"btn btn-primary"}
            </div>
        {/foreach}

        {input send}
    {/form}
{/snippet}

Nette 2.0.6, PHP 5.3.x
Předem díky, za jakoukoli radu.

Editoval Oli (14. 11. 2012 15:13)

Foowie
Člen | 269
+
0
-

Přesuň tu invalidaci blíže jselectu:

$jselect = $container->addJSelect ...;
if($presenter->isAjax()) {
	$jselect->addOnSubmitCallback(function() use($presenter) {
		$presenter->invalidateControl('jsonFormSnippet');
	});
}
Oli
Člen | 1215
+
0
-

Díky moc! To pomohlo a už se odesílá odpověď dobře. To mě vůbec nenapadlo.

Teď mám další problém. Když mám jednu položku, tak to funguje tak jak má a když přidám druhou položku tak to funguje jen na ty první položce. Když si nastavím nějakej foreach přes položky, tak to proběhne celý a provede se to jen na tý druhý (poslední) položce a předchozí výsledky se ignorujou. Jde nějak zjistit která položka byla odeslaná a tu potom vrátit k překreslení? Díky

Foowie
Člen | 269
+
0
-

A bez javascriptu to funguje? (vypni v prohlížeči JS :)

Oli
Člen | 1215
+
0
-

Nefunguje, porad to same. Problem je tady:

switch ($form["trips-nezname"]->getValues()->attribute)
{
    case 3:
        $return = $this->staticPagesModel->getStaticPages()->fetchPairs('id', 'title');
        break;
    case 5:
        $return = $this->gallery->getGallery()->fetchPairs('id', 'type');
        break;
    default:
        $return = array("Vyberte sekci");
    break;
}

nezname je cislo, ktere, kdyz nastavim na 0 tak funguje prvni polozka, kdyz na 1 tak druha polozka, atd. Nevim ale jak si predat to $id ty polozky, ktera byla odeslana. Nebo at se klidne prekresli vsechny polozky, ale kazda tak, jak ma…

Foowie
Člen | 269
+
0
-

Aha :)

$attribute = $container->addSelect("attribute" ...;
...
$container->addJSelect('dynamic', 'Dynamic', $container['attribute'], function($form) use($attribute) {
	switch ($attribute->getValue()) {
		...
	}
}

Jinak mrkni se v prohlížeči na HTML kód, jaké má ten selectbox attribute HTML ID. Z toho odvodíš, že $form['trips-attribute'] je nějak špatně.

Oli
Člen | 1215
+
0
-

Díky, zase jsem se posunul dál. Teď mě funguje vždycky dobře pro první položku, ale pro všechny další mě to neposílá jako JSON. Parametry se pošlou dobře, takový jak mají, ale odpověď je místo:

{"type":"JsonDependentSelectBoxResponse","items":{"frmeditTrip-trips-0-dynamic":{"selected":1,"items":{"1":"Kontakty","3":"Pokus"}}}}

HTML kod celý stránky, před odesláním ajaxu. Tzn. že se nepošlou ani nová data. Už mě to jednou dělalo a ani nevím jak jsem to vyřešil, ale nějak jsem to vyřešil. Teď to posílá zase a i když jsem si s tím hodnou chvilku hrál tak nevím jak to vyřešit :-/

Foowie
Člen | 269
+
0
-

Zkus nepoužívat JsonDependentSelectBox ale jenom DependentSelectBox a vyzkoušej to bez javascriptu jestli to funguje ;)

Oli
Člen | 1215
+
0
-

Bez javascriptu to nefunguje, protoze, kdyz pridam dalsi položku a něco změním a odešlu, tak ta přidaná položka zmizí. Při použití javascriptu a DependentSelectBoxu po přidání další položky opět odesílá jako odpověď celou stránku včetně doctype a hlavičky. Pokud něco změním a odešlu, tak druhá položka zmizí.

Další zajímavá věc je, že nejde přidat víc než jedna položka. Když chci přidat třetí položku, tak zmizí druhá a zůstane jen jedna. Vubec to chování nechápu. :-/