Rozlišení u persistentního parametru true, false, null

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

Jde nějak jednoduše rozlišit mezi true, false a NULL u persistentního parametru?

Pokud nastavím persistentní parametr na false, tak se to převede na 0 a to se převede na NULL (respektive se to vubec nezobrazí v URL a parametr se tím pádem vynuluje). Pokud nastavím true, tak se to převede na 1. Jde mě hlavně o rozlišení NULL a FALSE.

Vím, že bych si mohl do persistentního parametru posílat něco jako „yes“ a „no“ a pak to někde převádět na TRUE a FALSE, ale nejde to nějak jednodušeji?

ali
Člen | 342
+
0
-

No a proc to nebrat tak jak jsi popsal, kdyz je parematr null/false tak false a cokoliv dalsiho jako true?

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

On chce rozlišovat null a false. :) Často se to hodí, protože NULL není chyba a FALSE ano.

Třeba v YetORM myslím, že pokud zapisuješ do DB a nemáš tam žádnou změnu (modified data), tak vrací NULL – jakože nic nezapsal, pokud zprasíš dotaz, tak vrací FALSE jako chybu.

Nejrozumnější řešení bude transformace do toho yes, no.

David Matějka
Moderator | 6445
+
+1
-
  1. problem bude asi tu, konkretne (string) $params[$name] === '' kdy se z false pri pretypovani na string stane prazdny retezec. Mozna by stacilo tam pridat podminku && $params[$name] !== FALSE. EDIT: napada me, ze vlastne jina skalarni hodnota nez false (krom prazdneho retezce samozrejme) se na prazdny retezec nepretypuje. Takze to tam bude asi zamerne…
  2. cely mechanismus toho pretypovani neni dokonaly, takze i kdyby tam ta predchozi podminka byla, tak ta hodnota ve vstupnich parametrech bude retezec „1“, resp „0“, z toho duvodu klidne muzes misto boolu pouzivat ciselne hodnoty i pri vytvareni odkazu, {link this foo => 0}
  3. pokud to chces mit koser a mit spravny typy, muzes to rucne zvalidovat a upravit v loadState, resp saveState, konkretne to muze vypadat takto:
	public function loadState(array $params)
	{
		$params['foo'] = isset($params['foo']) && is_numeric($params['foo']) ? (bool) $params['foo'] : NULL;
		parent::loadState($params);
	}


	public function saveState(array & $params, $reflection = NULL)
	{
		$params += ['foo' => $this->foo];
		$params['foo'] = is_int($params['foo']) || is_bool($params['foo']) ? (int) $params['foo'] : NULL;
		parent::saveState($params, $reflection);
	}
josef.sabl
Člen | 153
+
0
-

Ach jo, to je teda nepříjemná vlastnost, nebál bych se to označit za bugu. Nejde jen o persistentní parametry ale odkazy celkově. NULL není přece to samé jako FALSE. Představte si, že máte výpis produktů s filtrem a chcete vyfiltrovat produkty, které: jsou na skladě (TRUE), nejsou na skladě (FALSE) a nebo všechny, tzn. tento příznak ignorovat (NULL).

@DavidMatějka ad 2) Je jasné, že URL neumí přenést typ, tak musí převádět na stringy. Ale URL umí přenést i další stav a to je právě NULL, parametr tam vůbec není. A můžeš si na to např. navěsit default hodnotu. Představ si akci:

function renderDefault($active = TRUE) {
	//
}

A vedle toho šablonu

<a n:href="default TRUE">všechny aktivní</a>
<a n:href="default FALSE">všechny neaktivní</a>

A tento triviální a na první pohled správný kód nebude fungovat, vždy se budou zobrazovat jen aktivní.

Editoval josef.sabl (27. 4. 2016 11:35)

David Matějka
Moderator | 6445
+
+3
-

U tohohle doslo ke zmene: https://github.com/…30d1f79e92ab … tenhle commit by se asi mel objevit v 2.4

josef.sabl
Člen | 153
+
0
-

@DavidMatějka Ahh, super, díky!