Výchozí hodnota persistentního parametru načtená z modelu
- Blizzy
- Člen | 149
V dokumentaci je následující:
/** @persistent int */ public $page = 0;
Pokud aplikace přijme request, kde je tato výchozí hodnota zadána, provádí se redirect (index.php?page=0 → index.php) z důvodu SEO optimalizace.
Co když chci výchozí hodnotu parametru $page
načíst
z modelu (kde je například uložen identifikátor výchozí stránky) a
nechci ho zadávat natvrdo v presenteru?
- Jan Tvrdík
- Nette guru | 2595
Zkus ji nastavit ve startup nebo action fázi.
Editoval Jan Tvrdík (1. 8. 2009 19:25)
- pmg
- Člen | 372
Svého času nějak zapadl request na čtení výchozího typu proměnné primárně z anotace. V současné době se hodnota přetypuje na typ výchozí hodnoty, což nemusí být ono.
Možná to ale nikomu dalšímu neschází? Jde o případ, kdy má být
v parametru číselné id, nebo hodnota NULL
. Musí se na to
používat např. nějaké záporné hodnoty, aby to šlo odlišit.
- Jan Tvrdík
- Nette guru | 2595
Ještě to můžeš nastavit v konstruktoru (to bude fungovat určitě), ale nevím, na kolik je to čisté řešení. Teoreticky ti nic nebrání ale ten redirect dělat manuálně.
- LM
- Člen | 206
Jan Tvrdík napsal(a):
Ještě to můžeš nastavit v konstruktoru (to bude fungovat určitě), ale nevím, na kolik je to čisté řešení.
Tohle taky nebude fungovat, protože výchozí hodnoty se získávají fcí
get_class_vars
. (V
PresenterHelpers::getPersistentParams
je nějakej náznak toho, že
by šlo výchozí hodnoty vrátit přepsáním getPersistentParams
v komponentě.)
- DocX
- Člen | 154
Já tohle vyřešil úpravou metody
PresenterHelpers::getPersistentParams()
:
<?php
--- a/Nette/Application/PresenterHelpers.php
+++ b/Nette/Application/PresenterHelpers.php
@@ -65,11 +64,14 @@
$params = & self::$ppCache[$class];
if ($params !== NULL) return $params;
$params = array();
if (is_subclass_of($class, 'PresenterComponent')) {
// $class::getPersistentParams() in PHP 5.3
$defaults = get_class_vars($class);
foreach (call_user_func(array($class, 'getPersistentParams'), $class) as $name => $meta) {
- if (is_string($meta)) $name = $meta;
+ // pokud je klíč string, bude hodnota prvku považována za výchozí hodnotu parametru
+ if (is_string($name)) $defaults[$name] = $meta;
+ // pokud je klíč něco jiného, veme se název parametru z hodnoty prvku
+ // a použije standartní výchozí hodnotu získanou z třídy
+ else if (is_string($meta)) $name = $meta;
$params[$name] = array(
'def' => $defaults[$name],
'since' => $class,
?>
a pak se dá jednoduše použít například:
<?php
class MyClass extends Presenter
{
public $lang;
public static function getPersistentParams()
{
return array('lang' => Environment::getConfig('defaults.lang'));
}
}
?>
Editoval DocX (18. 8. 2009 13:52)