Formuláře setDefaults() místo 2012–09–08 vrací 2012–09–08 00:00:00

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

Zdravím,

s Nette teprve začínám, tak vůbec netuším jestli je to chyba nebo vlastnost …
Verze Nette: 2.0.5, verze PHP: 5.3.4

Dostal jsem se k formulářům a editaci dat z databáze a mám následující problém.
Pokud si vytvořím formulář:

<?php
    protected function createComponentAlbumForm() {
        $genrePairs = $this->genres->findAll()->fetchPairs('id', 'title');

        $form = new Form();
        $form->addText('title', 'Název alba:', 3, 40)
                ->addRule(Form::FILLED, 'Je nutné vyplnit název alba');
        $form->addText('publish', 'Datum vydání:')
                ->setType('date')
                ->addRule(Form::FILLED, 'Vyplňte datum vydání alba.');
        $form->addSelect('genre_id', 'Žánr', $genrePairs)
                ->setPrompt('Vyberte žánr')
                ->addRule(Form::FILLED, 'Vyplntě žánr')
        ;
        $form->addSubmit('create', 'Přidat album');
        $form->onSuccess[] = callback($this, 'taskFormSubmitted');
        return $form;
    }
 ?>
a předám mu data,
<?php
    public function actionEdit($id) {
        $this->album = $this->albums->find($id);
        $this["albumForm"]->setDefaults($this->album);
    }
?>

vše se vyplní správně až na $form->addText(‚publish‘… Datum se do formuláře předa ve formátu value=„2012–09–08 00:00:00“ místo value=„2012–09–08“. Databáze na dotaz vrací datum jako 2012–09–08 (publish má nastavený DATE). IE a FF type:date neumí tak vypíšou klasický „text“ 2012–09–08 00:00:00 a Chrome s Operou 2012–09–08 00:00:00 nepochopí, ale vyhodí kalendář s prázdným datumem. No a o co mi jde? Proč mi místo 2012–09–08 setdefaults rve do formulářů 2012–09–08 00:00:00

h4kuna
Backer | 740
+
0
-

Pravděpodobně publish z db je převeden na objekt \DateTime a ten má i hodinovou část. Pokud to nechceš dostávat jako \DateTime zkus požadovaný sloupec obalit CONCAT(publish) AS publish.

newbie
Člen | 31
+
0
-

Díky moc funguje. Ale nechápu, jaký to má důvod, převádět Date na DateTime…

MW
Člen | 626
+
0
-

Je to tak, prevadi to na objekt DateTime. Dela to i u samotneho vypisu mimo formular, tam to ale lze formatovat pres helper.

Jinak si na form muzes navazat nejaky DatePicker a ten to zformatuje taky.

Ascaria
Člen | 187
+
+1
-

newbie napsal(a):

Díky moc funguje. Ale nechápu, jaký to má důvod, převádět Date na DateTime…

Protože DateTime je preciznější a je jednodušší mít jeden datumovej objekt. Select query nezjišťuje typ sloupku.

Můžeš volit formát ručně:

if($this->album->publish instanceof \Nette\DateTime) {
    $this->album->publish = $this->album->publish->format('Y-m-d');
}

defaultní __toString() má totiž return $this->format(‚Y-m-d H:i:s‘);