Jde nějak změnit data v Active Row (když jsou teď read-only)?

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

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.

Šaman
Člen | 2632
+
0
-
$defaults = $row->toArray();
$defaults['foo'] = 'bar';
David Matějka
Moderator | 6445
+
+3
-

Š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)

Hafran
Člen | 121
+
0
-

Paráda, funguje. :)
A proč je potřeba upravit ještě ten ref a related? Ten se bude automaticky brát z původního activeRow nebo ne?

btw: v tom issetu v get chybí závorka a else za if, kdyby to někdo jenom zkopíroval…

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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 | 1180
+
0
-

Tohle bych řešil až v Latte.

{if $data->published}ikonka AwesomeIcons{else}ikonka{/if}
Robin Martinez
Člen | 89
+
0
-

asi to bude lepší, jen mě zajímalo, jak to dělat přímo v ‚kódu‘. Dík

Pavel Kravčík
Člen | 1180
+
0
-

@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
+
0
-

@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 | 1180
+
0
-

@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.