Editace datumu ve formuláři

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

Zdravím,
mám formulář, ve kterém potřebuji editovat dříve zadané datum (v MySQL databázi uložené jako datový typ DATE).

$form->addText('od_data', 'Spotreba od')->setDefaultValue($this->data['od_data']->format('d.m.Y'));

Pokud uložím editované datum takto naformátované, tak se mi do databáze uloží nějaký nesmysl. Prosím o radu, jak zachovat v editačním formuláři lidský formát data (d.m.Y), ale aby zároveň došlo ke správnému uložení do databáze, které vyžaduje zřejmě obecný Y-m-d.
Díky za rady.

ali
Člen | 342
+
0
-

Zkus to takhle:

$date = new DateTime($values["od_data"]);
Šaman
Člen | 2666
+
0
-

Z dat ve formuláři si vytvoř objekt DateTime a ten si pak zformátuj jak potřebuješ pro db (případně použij db vrstvu, která umí ukládat DateTime.)
Převedení na DateTime má výhodu, že ti akceptuje různé formáty a většinou dobře (d.m.Y, Y-m-d, d/m/Y, …).

Dark0ne
Člen | 47
+
0
-

Super, už mi to funguje. Předal jsem to parametrem metodě v Modelu a tam to uložil přímo do databáze bez formátování.

Presenter:

public function editFormSucceeded(Form $form, $values) {
      $date = new \Nette\Utils\DateTime($values["od_data"]);
      $this->getModel()->editSpotreba($values, $date);
      $this->flashMessage('Záznam byl upraven');
      $this->redirect('Spotreba:');
  }
enumag
Člen | 2118
+
0
-

Osobně to dělám tak že inputu dám atribut type="date", což je ideální pro mobily. Pro desktopy pak ten input skryju javascriptem a přidám nový textový input s datepickerem a lokalizovaným formátem. Hodnotu synchronizuju do skrytého inputu pomocí JS událostí a přitom měním formát pomocí knihovny Moment.js.

Možná to zní složitě, ale není. Používám Bootstrap Datepicker + jsem si napsal tuhle funkci:

		replaceDateTime: function (field, visibleFormat, hiddenFormat) {
			var replacement = $('<input>');
			replacement.attr('class', field.attr('class'));
			replacement.val(moment(field.val()).format(visibleFormat));
			replacement.insertAfter(field);
			replacement.datetimepicker({
				locale: 'cs',
				format: visibleFormat,
				sideBySide: true,
				useCurrent: false,
			});
			replacement.on('dp.change', function (e) {
				field.val(e.date ? moment(e.date).format(hiddenFormat) : '');
			});
			field.hide();
		},

Editoval enumag (13. 2. 2016 14:05)