Změna prvku ve formuláři za pomocí signálu (handle)

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

Ahoj chtěl jsem se zeptat mám kod nějak takto

$form = new Form( $this, $name );
        $form->getElementPrototype()->class = "ajax";
        $casy = $form->addContainer( "casy" );
        foreach( $this->dny as $den )
        {
            $dny = $casy->addContainer( $den );
            foreach( $this->casy as $cas )
            {
                $rezer = $this->model->getEntitCasy()->where(array("casy_id"=>$cas->id,"datum"=>date("Y-m-d",$den)));
                if($rezer->count('*'))
                {
                    $dny->addCheckbox( $cas->id, "Rezervovano" )->setDisabled()->setDefaultValue(true);
                }
                else
                $dny->addCheckbox( $cas->id, "Objednat" );
            }
        }

no a pak v handleru mám toto

$form = $this->getComponent("rezervaceForm");
        //$casy = $form->addContainer( "casy" );
        unset($form["casy"]);
        $casy = $form->addContainer( "casy" );
        foreach( $this->dny as $den )
        {
            $dny = $casy->addContainer( $den );
            foreach( $this->casy as $cas )
            {
                $rezer = $this->model->getEntitCasy()->where(array("casy_id"=>$cas->id,"datum"=>date("Y-m-d",$den)));
                if($rezer->count('*'))
                {
                    $dny->addCheckbox( $cas->id, "Rezervovano" )->setDisabled()->setDefaultValue(true);
                }
                else
                    $dny->addCheckbox( $cas->id, "Objednat" );
            }
        }

To vše v pořádku projde, ale když chci formulář odeslat po zavolání handleru, napíše mi to, že nemám zakliklý ani jeden chackbox i když ho mám zakliklý, nevíte co s tím???

Děkuji

enumag
Člen | 2118
+
0
-

Proč proboha v tom handleru ten formulář vytváříš znova?! Raději si nejdříve přečti něco o formulářích a továrničkách.

zool
Člen | 144
+
0
-

Ty jo, tak takovou arogantní odpověd jsem nečekal. Můžeš mi říct, kde v handleru vytvářím formulář znovu? Já si jej jen pomocí odkazu na něj upravuju. Takže když nevím tak nedpovídám.

enumag
Člen | 2118
+
0
-

Nepřipadá ti trochu zvláštní, že ten kód opakuješ? Až na první dva řádky je úplně stejný. ;-)

Za aroganci se omlouvám, jen mi to připadá jako příliš začátečnická chyba. Při chybách tohoto typu většinou nemá smysl řešit samotný dotaz, protože ve chvíli kdy si dotyčný ty chyby opraví na řešení často přijde sám.

EDIT: A kdyžtak ukaž celé metody a ne jen jejich těla, takhle si nejsem moc jistý co je to za funkce.

Editoval enumag (23. 10. 2012 21:29)

zool
Člen | 144
+
0
-

Ok, ale ty chekboxy obsahují uplně jiné data, zasílám celé kody
Komponenta

protected function createComponentRezervaceForm( $name )
    {
        $form = new Form( $this, $name );
        $form->getElementPrototype()->class = "ajax";
        $casy = $form->addContainer( "casy" );
        foreach( $this->dny as $den )
        {
            $dny = $casy->addContainer( $den );
            foreach( $this->casy as $cas )
            {
                $rezer = $this->model->getEntitCasy()->where(array("casy_id"=>$cas->id,"datum"=>date("Y-m-d",$den)));
                if($rezer->count('*'))
                {
                    $dny->addCheckbox( $cas->id, "Rezervovano" )->setDisabled()->setDefaultValue(true);
                }
                else
                    $dny->addCheckbox( $cas->id, "Objednat" );
            }
        }

        $form->addText("jmeno","Jméno:")->setRequired("Jméno je povinné");
        $form->addText("prijmeni","Přijmení:")->setRequired("Příjmení je povinné");
        $form->addText("telefon","Telefon:")->setRequired("Telefon je povinný");
        $form->addText("email","Email:")
            ->setRequired("Email je povinný")
            ->addRule(Form::EMAIL, "Email není ve správném tvaru.");
        $form->addSelect("typ_id","Typ rezervace",$this->model->getTyp()->fetchPairs("id","nazev"))
        ->setPrompt("--Vyberte--")
        ->setRequired("Typ rezervace se povinny.");
        $form->addTextArea("poznamka","Poznámka:",43,5);
        $form->addSubmit("ok","Odeslat rezervaci");
        $form->onSuccess[] = callback($this, "rezervaceFormSubmitted");
    }

Handler

public function handleDalsi( )
    {
        $this->tyden += 1;
        $this->dny = array();
        if( isset( $this->tyden ) )
            $datum = strtotime( $this->tyden." week" );
        else
        {
            $datum = time( );
            $this->tyden = 0;
        }
        $datum = mktime(0,0,0,date("m",$datum),date("d",$datum),date("Y",$datum));
        $den = date( "N", $datum ) - 1;
        for( $i = 0; $i < 6; $i++ )
        {
            $this->dny[] = strtotime("-".($den - $i)." day", $datum);
        }
        $form = $this["rezervaceForm"];

        $casy = $form->addContainer( "casy" );

        foreach( $this->dny as $den )
        {
            $dny = $casy->addContainer( $den );
            foreach( $this->casy as $cas )
            {
                $rezer = $this->model->getEntitCasy()->where(array("casy_id"=>$cas->id,"datum"=>date("Y-m-d",$den)));
                if($rezer->count('*'))
                {
                    $dny->addCheckbox( $cas->id, "Rezervovano" )->setDisabled()->setDefaultValue(true);
                }
                else
                    $dny->addCheckbox( $cas->id, "Objednat" );
            }
        }

        if($this->isAjax())
        {

            $this->invalidateControl("rozvrh");
            $this->invalidateControl("flash");
        }
        else
        {
            $this->redirect('this');
        }
    }
enumag
Člen | 2118
+
0
-

Huh. Jestli se snažíš za běhu ajaxem měnit formulář tak to mi nepřipadá jako moc dobrý nápad.

Kromě toho když už se zavolá ten ajaxový požadavek:

$form = $this["rezervaceForm"]; //zavolá se createComponentRezervaceForm
//továrnička v něm vytvoří i ten kontejner "casy"

$casy = $form->addContainer( "casy" ); //a tady ten konteiner hned vytváříš ještě jednou? proč?

foreach( $this->dny as $den )
{
//...

Myslím, že hledáš replikátory. ;-)

Editoval enumag (23. 10. 2012 23:10)

zool
Člen | 144
+
0
-

Tak už mi to funguje, právě že ano, jinak to vyřešit nejde, aplikace běží v modálním okně a vše beží přes ajax, ten tozvrh se musí měnit v závislosti jaký je týden, a v tom se mění checkboxi. Ale vím kolik jich tam bude, tak proto nepouživám replikátor, bo ten je jen proto, když nevím kolik prvků tam bude(kolik si jich uživatel navolí)
Problém jsem měl v persistentní proměnné, která se zapsala do akce formuláře a já jsem překresloval jen část formuláře, tak jsem to vyřešil pomocí session a už to jede.

mildabre
Člen | 62
+
0
-

Já zase úplně nechápu jak se spustí ten handler handleDalsi() – pokud mé znalosti stačí je to obsluha signálu z odkazu <a…>, to tam v tom formuláři máš asi v šabloně někde odkaz se signálem Dalsi že ?

Glottis
Člen | 129
+
0
-

jj, musi za to tahat z sablony nejspis. ale a href to byt asi nemusi. staci treba jquery a onclick