Jak modifikovat pouze jeden řádek v editační šabloně?

prog1
Člen | 45
+
0
-

Ahoj, v ItemPresenteru mám tento kód:

<?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;
	}
}

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'. Je možné v editor.latte v {control editorForm} naformátovat jen jeden řádek v tabulce? Do šablony předávám celý formulář v {control editorForm} a chtěl bych změnit jen jeden input, pokud to v latte jde. Nechci použít input date.

Do 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.) vypisuju tabulku:

{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/>
			...
			...
       	</tr>
	  </tbody>

</table>

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'])...

Předem díky.

Kamil Valenta
Člen | 815
+
0
-

Takže to chceš přeformátovat v tom inputu formuláře? Pak to udělej v setDefaults:

if ($item_id)
        {
			if (!($item = $this->itemManager->getItem($item_id)))
				$this->flashMessage('Položka nebyla nalezena.'); // Výpis chybové hlášky.
			else {
				if (!empty($item['datum_narozeni'])) $item['datum_narozeni'] = $item['datum_narozeni']->format('d.m.Y');

                $this['editorForm']->setDefaults($item);
			}
	    }
prog1
Člen | 45
+
0
-

To mi hází chybu serveru 500.

Kamil Valenta
Člen | 815
+
0
-

A její znění obsahuje intimní osobní informace, proto jsi to sem nedal?
Můžeme jen hádat, co za chybu tě to vrací. Můžeme jen hádat, co vrací metoda getItem itemManageru. Možná vrací ActiveRecord a vzdoruje to při „updatu“. Nebo v „datum_narozeni“ není Date. Nebo, nebo, nebo…

Kamil Valenta
Člen | 815
+
0
-

Eh, ne, myslel jsem znění té 500 chyby. Pokud ji nevidíš v Tracy, tak bude zalogovaná. Takže mrkni do logu.

prog1
Člen | 45
+
0
-

Tracy mi tuto chybu nevypisuje – ostatní však ano, v bootstrapu mám aktivní

$configurator->setDebugMode(TRUE);

Našel jsem pouze ve složce log v souboru exception tuto chybu:
Nette\DeprecatedException: ActiveRow is read-only; use update() method instead. in C:\xampp\htdocs\Records\vendor\nette\database\src\Database\Table\ActiveRow.php:276 @ http://localhost/Records/editor?item_id=5 @@ exception--2020-01-23--21-56--65c7f7821e.html

Kamil Valenta
Člen | 815
+
+1
-

Voala, takže jsem to z té křišťálové koule trefil.

$item = $this->itemManager->getItem($item_id)->toArray()
prog1
Člen | 45
+
0
-

kamil_v: Díky moc, funguje.