Datum a vše o dnech, měsících a rokách

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

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
+
0
-

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)

Nox
Člen | 378
+
0
-

Schéma sloupce musí umožnit NULL a do NDB předat NULL (zkontroluj ten array co tam posíláš), ještě se mi nestalo, že by to udělalo něco nepředloženého v tomhle smyslu…
Mj. ten nadpis zní značně obsáhleji než dotaz ;)

Editoval Nox (20. 11. 2012 23:39)

tomhad78
Člen | 3
+
0
-

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.

  1. 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
  2. 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

  1. v tabulce potřebuji, aby nevyplněné datum vypadalo jako prázdná buňka
  2. 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í.

  1. 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
+
0
-

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") : '');
tomhad78
Člen | 3
+
0
-

Moc hezké konstrukce … děkuju … celé jsem to dal do procházení pole s klíčem, který začíná datum a všechny datumy vyhodnotím …
Neexistuje něco takového jako addtext pro formuláře s tím, aby to bylo přímo na datum ???

jiri.pudil
Nette Blogger | 1032
+
0
-