Jak po odeslání formuláře přidat „časové razítko“, Tools::createDateTime()

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

Zdravím!

V aplikaci mam moznost psat Aktuality. Uzivatel vyplni text a odesle formular. Formular vytvarim pomoci tovarnicky v presenteru a pak v metode formSubmited, ktera vypada takto:

public function newsFormSubmitted(AppForm $form)
{
	if ($form['save']->isSubmittedBy()) {

		$id = (int) $this->getParam('id');

		$news = new News;

		if ($id > 0) {
			$news->update($id, $form->getValues());
			$this->flashMessage('Aktualita byla aktualizována.');
		} else {
			$news->insert($form->getValues()); // zde vkladam aktialitu do DB
			$this->flashMessage('Aktualita byla přidána.');
		}
	}

	$this->redirect('default');
}

Potřeboval bych poradit s následujícím. V miste, kde vkladam aktualitu do DB nebo spise pred timto mistem bych potreboval jeste ulozit infomaci o tom, kdy byla aktualita pridana.

Nasel jsem v API funkci Tools::createDateTime(), ktere bych jako parametr predal time(), takze by mi ta funkce mela vratit aktualni cas DateTime53(date('Y-m-d H:i:s', $time)) (ve chvili kdyz uzivatel stiskl submit).

Jak mam prosim vas zaridit, aby kdyz volam $news->insert($form->getValues());, tak abych v paramtru metody insert mel uz tu informaci o tom, kdy byla aktualita pridana? Ne ale abych metode insert predaval dva parametry, ale jen jeden a to konkretne $form->getValues().

Metoda insert vypada takto:

public function insert(array $data)
{
	return $this->db->insert($this->table, $data)->execute(dibi::IDENTIFIER);
}

Pri debugovani jsem si vsiml, ze data jsou ulozena z formulare jsou ulozena v promenne $form['htmlData']['napr_TextArea_obsah'], ale nevim jestli je to k necemu dobre pro to co potrebuju.

Verim, ze uz jste tohle nekdo resili, tak bych poprosil o nejake pekne reseni.

Dekuji.

22
Člen | 1478
+
0
-

podle mě stačí přidat třeba…

$news['datum'] = new DateTime();

eventuelně si zformátovat, jak potřebuješ http://cz.php.net/…e.format.php

Ola
Člen | 385
+
0
-

uděláš

$values = $form->getValues();
$values['date'] = new DateTime;

a pak jen těm metodám předáš pole $values

Endrju
Člen | 147
+
0
-

to 22: vyhazuje Fatal error: Cannot use object of type News as array

Ola napsal(a):

uděláš

$values = $form->getValues();
$values['date'] = new DateTime;

a pak jen těm metodám předáš pole $values

Diky Ola, tohle funguje :).

Jeste si dovolim malou otazecku: V databazi to mam jako typ datetime, aby mi to generovalo datum i cas. Jak to pak v sablone (predpokladam, ze bych to mel udelat tam, nebo v render akci?) preformatuju? Metoda mi vrati datum a cas YYYY-MM-DD HH:MM:SS zformatovy podle retezce Y-m-d H:i:s v metode public static function createDateTime($time)

Aurielle
Člen | 1281
+
0
-

date('d.m.Y H:i:s', strtotime($data['date']));
Formát si uprav :)

Endrju
Člen | 147
+
0
-

Dik :).

Klasicka PHP uprava, nj :). Jsem prave nevedel, jestli nema Nette nejakou specialutku pro to ve stylu kratsiho zapisu, ale tohle uplne staci :)

Editoval Endrju (7. 3. 2010 15:55)

Ola
Člen | 385
+
0
-

V šabloně by mělo jít něco jako

{$datum|date:'%d.%m.%Y'}
Endrju
Člen | 147
+
0
-

Ola, diky. Nenapadlo me se podivat na Helpery. Nejak mi to ale nefunguje..

Napisu v sablone:

{$newsItem->added|date:'%d.%m.%Y %H:%i:%s'}

ale na strance to nevypise vubec nic, pritom do temp se to prelozi takto:

<?php echo TemplateHelpers::escapeHtml($template->date($newsItem->added, '%d.%m.%Y %H:%i:%s')) ?>

Nemuze tam byt chyba?

Puvodne jsem to mel takto a fungovalo:

{=date('d.m.Y H:i:s', strtotime($newsItem->added))}

Editoval Endrju (7. 3. 2010 19:18)

Endrju
Člen | 147
+
0
-

Jeste me napadlo, jestli neni nutne nacist?

$this->template->registerHelper('date');

Ale kdyz je to zapisem

{$today|date:'%d.%m.%Y'}

tak si s tim poradi Latte filter, nebo ne?

redhead
Člen | 1313
+
0
-

Pokud nevytváříš vlastní šablonu, tak ta defaultní to má vše již registrované.

Endrju
Člen | 147
+
0
-

Vlastni sablonu? Jak to poznam? Pravdepodobne asi vlastni nevytvarim..

porad ale nevim proc se mi v kodu nevypise vubec nic, kdyz zavolam

<div id="left">{$newsItem->added|date:'%d.%m.%Y %H:%i:%s'}</div>

Kdyz si necham zobrazit v prohlizeci zdrojovy kod, tak tam nic neni:

<div id="left"></div>

V adresari temp je tento vygenerovany kod:

<div id="left"><?php echo TemplateHelpers::escapeHtml($template->date($newsItem->added, '%d.%m.%Y %H:%i:%s')) ?></div>

Neni tam neco spatne? Proc se to nezobrazuje?

redhead
Člen | 1313
+
0
-

vlastní šablona – $this->template = new Template;

ale tipuju, že máš tu defaultní presenterovskou. Určitě máš v té proměnné validní datum/čas?

Endrju
Člen | 147
+
0
-

Ne, tak vlastni sablonu nepouzivam. Diky za objasneni.

Promenna $newsItem->added drzi napriklad takove datum 2010-03-07 19:37:26, ktere nacitam z DB. Nevim jak az moc sikovny je ten helper, zda si s tim poradi. Jen jsem to udelal tak, jak mi poradili.

Etch
Člen | 403
+
0
-

No nefunguje ti to protože ten zápis máš špatně

{$newsItem->added|date:'%d.%m.%Y %H:%i:%s'}

uprav na

{$newsItem->added|date:'d.m.Y H:i:s'}

znak % tam nemá vůbec co dělat.

redhead
Člen | 1313
+
0
-

tím si nejsem tak jistej:

https://doc.nette.org/…late-helpers#…

Etch
Člen | 403
+
0
-

Tak to pardon. % tam může být nic méně to sním nefunguje.

redhead
Člen | 1313
+
0
-

Tak možná bug. Ono podle kódu by měli obě varianty fungovat (https://api.nette.org/…ers.php.html#202)

Endrju
Člen | 147
+
0
-

Aha, ty jo.. to me prave zarazilo… Zkusil jsem to bez tech znaku % a funguje, ale vubec by me to nenapadlo prave proto, ze v dokumentaci https://doc.nette.org/…late-helpers#… to je se znakem % pouzito a jiny alternativa tam neni.

Asi to bude tedy bugged, nahlasite to nekdo? (pak by bylo dobre sem napsat jak to dopadlo, aby to bylo pohromade…)

Kazdopadne diky, nenapadlo by me to.

Editoval Endrju (7. 3. 2010 21:26)

Ola
Člen | 385
+
0
-

Imho je problém v tom, že funkce strftime nemá modifikátory %i a %s, ale %M a %S. Viz její dokumentace: http://php.net/strftime

Editoval Ola (7. 3. 2010 21:33)

Endrju
Člen | 147
+
0
-

Mas pravdu Ola, zkusil jsem to zapsat takto:

<div id="left">{$newsItem->added|date:'%d.%m.%Y %H:%M:%S'}</div>

a v pohode se to zobrazi. Takze zadny bug, ale chyba mezi klavesnici a zidli.. :). Mohlo by to hodit ale nejake upozorneni O:)