Změna prvku ve formuláři za pomocí signálu (handle)
- zool
- Člen | 144
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
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.
- enumag
- Člen | 2118
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
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
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
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.