Jde nějak změnit data v Active Row (když jsou teď read-only)?
- Hafran
- Člen | 121
V Nette 2.0 jsem si vytáhnul data z db ($data = $this->db->table…) a občas jsem je upravil, třeba změnil defaultní hodnoty pro nevyplněná pole, nebo protřídil tagy, něco jako
if (!$data->default){$data->default = "nová defaultní hodnota")
ještě než jsem je poslal do šablony. Měl jsem pak všechny proměnné stále v jednom $data a nemusel jsem upravovat data v šabloně. Prostě jsem tam vypsal $data->default.
V Nette 2.2 je ale ActiveRow read-only a update by mi měnil data v db. Jde to nějak chytře udělat? Nechci mít v šabloně všude něco jako
{if $data->default} {$data->default} {else} {$upravenaDataVPresenteru->default} {/if}
což by navíc vyžadovalo přepsání všech šablon po upgradu Nette, což se mi nechce.
- David Matějka
- Moderator | 6445
Šamanovým řešením zabijes accessed cache, resil bych to nejakym wrapperem
class RowWrapper extends Nette\Object
{
protected $row;
protected $data;
public function __construct(Nette\Database\Table\ActiveRow $row)
{
$this->row = $row;
}
public function &__get($key)
{
if(isset($this->data[$key]) {
$value = $this->data[$key];
}
$value = $this->row->$key;
return $value;
}
public function __set($key, $value)
{
$this->data[$key] = $value;
}
//pripadne jeste related a ref
}
Editoval matej21 (12. 8. 2014 12:55)
- David Matějka
- Moderator | 6445
protoze ref a related na tehle tride RowWrapper nejsou :)
takze proste jen pridej neco jako
public function ref($key, $throughColumn = NULL)
{
return $this->row->ref($key, $throughColumn);
}
a podobne pro related
- Robin Martinez
- Člen | 89
Huh, omlouvám se za lamózní dotaz, ale mohl by mi prosím někdo poradit, jak tuhle třídu používat?
jde o to, že potřebuju modifikovat hodnoty z databáze v tomhle stylu:
$items = $this->model->findAll($options);
foreach($items as $item)
$item->published = (int)$item->published === 1 ? '✓' : '✗';
Předem velice děkuji :X
- Pavel Kravčík
- Člen | 1196
Tohle bych řešil až v Latte.
{if $data->published}ikonka AwesomeIcons{else}ikonka{/if}
- Pavel Kravčík
- Člen | 1196
@RobinMartinez: V kódu mi napadá to řešit třeba kvůli Gridu, ale většina jich má callback a dá se to nastavit jako v šabloně.
Jinak můžeš použít ty řešení nahoře. Ty vypadají pěkně.
Osobně to řeším v malinkém rozšíření nad ORM, kdy pokud existuje pravidlo pro danou entitu, tak to automaticky převede DB data na nějaká použitelnější (datetime, json).
- Robin Martinez
- Člen | 89
@kzk_cz Jde mi o to, že mám všeobecnou šablonu pro listing v administraci a zobrazuje se tam třeba v řádku tabulky title, created_at, published apod… Ale někdy potřebuju třeba upravit title – něco k němu třeba přidat nebo něco jinýho, a to se v jedný uni šabloně dělá blbě.
Editoval Robin Martinez (29. 4. 2015 10:53)
- Pavel Kravčík
- Člen | 1196
@RobinMartinez: To se v jedný šabloně dělá dobře. {if} {n:tagy}. Ale použit ty řešení výše, volil to řešení s wrapperem.