Rozlišení u persistentního parametru true, false, null
- Oli
- Člen | 1215
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?
- Pavel Kravčík
- Člen | 1196
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
- problem bude asi tu,
konkretne
(string) $params[$name] === ''
kdy se zfalse
pri pretypovani na string stane prazdny retezec. Mozna by stacilo tam pridat podminku&& $params[$name] !== FALSE
. EDIT: napada me, ze vlastne jina skalarni hodnota nezfalse
(krom prazdneho retezce samozrejme) se na prazdny retezec nepretypuje. Takze to tam bude asi zamerne… - 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}
- 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
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
U tohohle doslo ke zmene: https://github.com/…30d1f79e92ab … tenhle commit by se asi mel objevit v 2.4