Jak modifikovat pouze jeden řádek v editační šabloně?
- prog1
- Člen | 45
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
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);
}
}
- Kamil Valenta
- Člen | 815
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
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
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
Voala, takže jsem to z té křišťálové koule trefil.
$item = $this->itemManager->getItem($item_id)->toArray()