Datum a vše o dnech, měsících a rokách
- tomhad78
- Člen | 3
Všechny zdravím … 2 dny už sedím nad Nette a zatím z něj mám smíšné pocity. Vše mi zatím nějak funguje a pořádně nevím proč, ale funguje, jak potřebuji kromě DATUMŮ.
V db mám formát date, který je ve formátu yyyy-mm-dd. Do tabulky potřebuji načíst ve formátu d.m.yyyy a tam kde ještě není nastaveno, tak nechat prázdnou buňku. Záznam do tabulky přidávám pouze id a popis a datumy se předvyplní 0000–00–00. Následně dám editovat záznam a do formuláře chci načíst výchozí hodnoty a to už mám problém a následně když změním hodnotu data, tak se to do databáze uloží nesmyslně. Používám v modelu funkci:
public function editZak($hodnoty, $id)
{
return $this->getTable()->where('ID',$id)->update((array)$hodnoty);
}
v které se mi moc líbí předání všech hodnot v poli. Ani nevím, co potřebuji :-) … Kde začít ???
Editoval tomhad78 (20. 11. 2012 21:54)
- enumag
- Člen | 2118
Potřebuješ místo 0000–00–00 používat NULL. ;-)
Pokud jde o předání hodnot tak by se tvé syntaxi dalo vytknout pár drobností, ale principiálně mi připadá ok. Druhá varianta je tohle (v presenteru nebo facade):
$zakaznik = $model->get($id);
//...
$zakaznik->update($hodnoty);
Což má oproti tvému přístupu drobnou nevýhodu, že nejdříve volá SELECT a pak UPDATE. Tvůj kód volá pouze UPDATE.
Pokud jde o výpis datumu v html tabulce, tak na to se používá helper, kterému předáš objekt DateTime a formát, ve kterém chceš datum vypsat.
{$datum|date:"j.n.Y"}
EDIT: Anebo jde ještě tohle.
$zakaznik = $model->get($id);
$zakaznik->jmeno = $hodnoty->jmeno;
//...
$zakaznik->update();
Editoval enumag (20. 11. 2012 22:37)
- tomhad78
- Člen | 3
tj. pravda … téma chce větší podrobnosti … vše co jsem zatím napsal
tedy opsal je podle dokumentace – píšeme první aplikaci.
Když změním v db u datumů na nulový a výchozí hodnotu NULL, tak mi to
začne házet chybu když chci načíst výchozí hodnoty do formuláře.
Popíšu celý proces, jak to mám.
- do tabulky zak vložím nový záznam – zadávám pouze popis a subjekt → vznikne nový záznam, kde všechny datumy jsou v tuto chvíli NULL
- v tabulce, která představuje seznam zak v modelu udělám dotaz findAll a přes presenter to pošlu do šablony a tam pomocí helperu
<td>{$hodnota->datum_FA_3D|date:'j.n.Y'}</td>
si hravě zobrazím datum tak jak potřebuji
- v tabulce potřebuji, aby nevyplněné datum vypadalo jako prázdná buňka
- při editaci záznamu zavolám – teď nevím jestli to píšu dobře – presenter zak se šablonou upravit
<td><a n:href="Zak:upravit id=>$hodnota->ID">{$hodnota->ID}</a></td>
kde, mám v presenteru actionUpravit pro získání řádku z db s příslušným ID
public function actionUpravit($id)
{
$this->hodnoty=$this->zakazkyRep->vyberID($id);
$this->zakID=$id;
}
a následně vytvořím formulář
protected function createComponentZakeditForm()
{
//načtu řádek do pole
$pole=$this->hodnoty->fetch();
$form = new Form();
$form->addText('datum_FA_3D', 'datum fakturace 3D')
->setdefaultvalue(date_format($pole['datum_FA_3D'],"j.m.Y"));
$form->onSuccess[] = $this->ZakeditFormSubmitted;
return $form;
}
tohle fungovalo do té doby než jsem změnil v db na NULL, ale zobrazoval se tam nesmysl mínus rok nebo rok 2030, když smažu funkci date_format, tak mi načte prázdné hodnoty, ale datum vidím ve formátu yyyy-mm-dd, což se mi nelíbí.
- a když zpracuji formulář – což dělám ve stejném presenteru funkcí ZakeditFormSubmitted
public function ZakeditFormSubmitted(Form $form)
{
$this->zakazkyRep->editZak($form->values,$this->zakID);
$this->flashMessage('Zakázka Upravena.', 'success');
$this->redirect('Homepage:');
}
a v modelu funkcí editZak
public function editZak($hodnoty, $id)
{
return $this->getTable()->where('ID',$id)->update((array)$hodnoty);
}
a ta zase zapíše u hodnot NULL nesmyslné datum – mínusový rok a tak … takže jsem pochopil, že musím vstoupit do pole, projít ho a u všech hodnot datum nastavit NULL nebo správné pořadí rok.měsíc.den
a současně vyřešit načítání výchozích hodnot nějakým lepším způsobem … doufám, že nejsem jediný, kdo toto potřebuje, protože jinak končím s programováním dřív než s ním začnu :-)
- jiri.pudil
- Nette Blogger | 1032
Ano, datum musíš do databáze posílat ve správném formátu, tj. YYYY-MM-DD. Nette\Database si poradí i s instancí Nette\DateTime. Prázdné hodnoty změníš na null. Ve zpracování (ZakeditFormSubmitted) tedy na začátek metody přidej:
$form->values['datum_FA_3D'] = !empty($form->values['datum_FA_3D']) ? \Nette\DateTime::from($form->values['datum_FA_3D']) : NULL;
Co se týče načítání výchozí hodnoty, stačí přidat podmínku na NULL:
...
->setDefaultValue($pole['datum_FA_3D'] !== NULL ? date_format($pole['datum_FA_3D'],"j.m.Y") : '');