Zobrazení datumu při editaci

prog1
Člen | 45
+
0
-

Ahoj, v tabulce mám zobrazení datumu vyřešeno v šabloně tímto způsobem

...<td>{$article->datum_narozeni|date:'d.m.Y'}</td>...

Při editaci chci mít v editačním formuláři zobrazeno datum také v tomto formátu, nikoli v ‚Y-m-d H:i:s‘. Jak toho mohu prosím nejlépe docílit? Předem díky za tipy.

<?php
namespace App\CoreModule\Presenters;

use App\CoreModule\Model\ItemManager;
use App\Presenters\BasePresenter;
use Nette\Application\AbortException;
use Nette\Application\BadRequestException;
use Nette\Application\UI\Form;
use Nette\Utils\ArrayHash;
use Nette\UnexpectedValueException;
use Nette\Utils\DateTime;
/**
 * Presenter pro akce s položkami.
 * @package App\CoreModule\Presenters
 */
class ItemPresenter extends BasePresenter
{
	private $defaultItemUrl;

	/** @var ItemManager Model pro správu položek. */
	private $itemManager;

	/**
	 * @param ItemManager $itemManager    automaticky injektovaný model pro správu položek
	 */
	public function __construct($defaultItemUrl, ItemManager $itemManager)
	{
		parent::__construct();
		$this->defaultItemUrl = $defaultItemUrl;
		$this->itemManager = $itemManager;
	}

	public function renderDefault($url = null)
	{
		//if (!$url) $url = $this->defaultItemUrl;

		if (!($item = $this->itemManager->getItem($url)))
			$this->error(); // Vyhazuje výjimku BadRequestException.

		$this->template->item = $item; // Předá položku do šablony.
	}

	/** Načte a předá seznam položek do šablony. */
	public function renderList()
	{
		$this->template->items = $this->itemManager->getItems();
	}

	/**
	 * Odstraní položku.
	 * @throws AbortException
	 */
	public function actionRemove($url = null)
	{
		$this->itemManager->removeItem($url);
		$this->flashMessage('Položka byla úspěšně odstraněna.');
		$this->redirect('Item:list');
	}

	public function actionEditor($item_id)
	{
		if ($item_id)
        {
			if (!($item = $this->itemManager->getItem($item_id)))
				$this->flashMessage('Položka nebyla nalezena.'); // Výpis chybové hlášky.
			else
                $this['editorForm']->setDefaults($item);
	    }
    }

	/**
	 * Vytváří a vrací formulář pro editaci položek.
	 * @return Form formulář pro editaci položek
	 */
	protected function createComponentEditorForm()
	{
        // Vytvoření formuláře a definice jeho polí.
		$form = $this->formFactory->create();
		$form->addHidden('item_id');
		$form->addText('jmeno', 'Jméno');
		$form->addText('prijmeni', 'Příjmení');
        $form->addText('datum_narozeni', 'Datum narození');
		$form->addSubmit('save', 'Uložit položku');

		// Funkce se vykonaná při úspěšném odeslání formuláře a zpracuje zadané hodnoty.
		$form->onSuccess[] = function (Form $form, ArrayHash $values)
        {
			try
                {
                            $this->itemManager->saveItem($values);
                            $this->flashMessage('Položka byla úspěšně uložena.');
                            $this->redirect('Item:list');
			    }
            catch (UnexpectedValueException $e)
                {
                            $this->flashMessage('Zadejte prosím existující datum.');
                            $this->redirect('Item:editor');
			    }
		};
		return $form;
	}
}
?>

Mimo Nette jsem dříve používal tuto metodu

public function dateCzech($value)
        {
        if (!empty($value))
            {
            $datum = new DateTime($value);
            return $datum->format('d.m.Y');
            }
        }

a pak pomocí ní v editačním formuláři modifikoval datum

...dateCzech($item['datum_narozeni'])...
n3t
Člen | 37
+
+2
-
$form->addText('datum_narozeni', 'Datum narození')
	->setType('date');

Nebo použít nějakou JS knihovnu, třeba Bootstrap DatePicker, Tempus Dominus, jQuery UI apod…

prog1
Člen | 45
+
0
-

n3t napsal(a):

$form->addText('datum_narozeni', 'Datum narození')
	->setType('date');

Nebo použít nějakou JS knihovnu, třeba Bootstrap DatePicker, Tempus Dominus, jQuery UI apod…

První možnost jsem zkoušel hned na začátku, ale já potřebuju, abych při editaci (úpravě) již vložené položky měl v editačním formuláři např. 20.11.2018. Při vkládání nové položky je editační formulář úplně prázdný, dávám svobodu při vkládání datumu – je možné vložit datum v jakémkoli tvaru včetně slovního v češtině nebo v angličtině.

Šaman
Člen | 2633
+
0
-

Tak si to zformátuj před setValue. Z databáze to načteš jako objekt DateTime, nebo jako timestamp, zformátuješ to na český tvar (který je ideální mít definovaný někde jako konstantu, aby se ten tvar dal změnit plošně) a to teprve předvyplníš v editačním formuláři.

Editoval Šaman (21. 11. 2019 7:15)

MajklNajt
Člen | 471
+
0
-

za mňa je práve input type="date" najefektívnejšia voľba, či už z pohľadu používateľa (ten nemusí tápať, v akom formáte dátum zadať, navyše sa mu vo väčšine prehliadačov /oceníš najmä na mobile/ zobrazí hneď kalendár), tak z pohľadu vývojára (nemusíš riešiť 10+ rôznych druhov vstupov, vždy z formulára dostaneš YYYY-MM-DD)

EDIT: v Nette 3 je to ->setHtmlType("date")

Editoval MajklNajt (21. 11. 2019 8:07)

Šaman
Člen | 2633
+
0
-

Zkusil jsem si ten odkaz na W3Schools a nefunguje mi to na PC moc dobře. Musím zadat 01, pokud chci prvního. Když dám jedna – tečka – jedna, tak se mi tečka ignoruje a míto 1.1. mi to vyplní jedenáctého.
Kromě toho ty šipky mi nepřijdou estetické.
Jediná výhoda by mohla být, že to asi ctí formát data nastaveného v systému. Nevýhoda je, že nad tím inputem nemám kontrolu a že každý prohlížeč to může zobrazit jinak.

Ovšem datepicker je jiná otázka, než se prog1 ptal. Datepicker je fajn (i jdyž používám JS řešení, nikoliv typ inputu v prohlížeči), ale k předvyplnění textového inputu v nějakém formátu se prostě zformátuje string a pak teprve předvyplní. Všechno další je až nadstavba.

Editoval Šaman (21. 11. 2019 9:14)

prog1
Člen | 45
+
0
-

Prosím ještě o radu k tomuto problému (viz výše). Pro editaci mám tuto šablonu editor.latte

{block title}Editor{/block}
{block description}Editor položek.{/block}
{block content}
    {* Formulář pro editaci. *}
    {control editorForm}
{/block}

{block scripts}
    {include parent}
    <script type="text/javascript" src="//cdn.tinymce.com/4/tinymce.min.js"></script>
    <script type="text/javascript">
        tinymce.init({
            selector: 'textarea[name=content]',
            plugins: [
                'advlist autolink lists link image charmap print preview anchor',
                'searchreplace visualblocks code fullscreen',
                'insertdatetime media table contextmenu paste'
            ],
            toolbar: 'insertfile undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image',
            entities: '160,nbsp',
            entity_encoding: 'raw'
        });
    </script>
{/block}

a chtěl bych jen v této šabloně v řádku kde je 'datum_narozeni' nastavit formát 'd.m.Y.'
Dá se v latte v {control editorForm} naformátovat jen tento jeden řádek?
V BasePresenteru jsem přidal filtr

public function beforeRender()
        {
        $this->template->addFilter('dateCzech', function ($datum_narozeni)
            {
            $date = new \DateTime();
            return $datum_narozeni->format('d.m.Y');
            }
								  );
        }

a v list.latte (tam to je O.K.)

{block title}Výpis položek{/block}
{block description}Výpis všech položek.{/block}
{block content}
<table>
     <thead>
        <tr><th>Jméno</th><th>Příjmení</th><th>Datum narození</th><th>...</th>{if $user->isInRole('admin')}<th colspan="2">Administrace</th>
        </tr>{/if}
     </thead>

     <tbody n:foreach="$items as $item">
        <tr>
            <h2><a n:href="Item: $item->item_id"></a></h2>

            <td>{$item->jmeno}</td><td>{$item->prijmeni}</td><td>{$item->datum_narozeni|dateCzech}</td><td>...</td>
            <br/>

            {if $user->isInRole('admin')}
                <td><a n:href="editor $item->item_id">Editovat</a></td>
                <td><a n:href="remove $item->item_id">Odstranit</a></td>
            {/if}
       	</tr>
	  </tbody>

</table>

Díky za tipy.

Editoval prog1 (29. 12. 2019 4:00)