Výchozí hodnota persistentního parametru načtená z modelu

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

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

Zkus ji nastavit ve startup nebo action fázi.

Editoval Jan Tvrdík (1. 8. 2009 19:25)

pmg
Člen | 372
+
0
-

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.

Blizzy
Člen | 149
+
0
-

Jan Tvrdík napsal(a):

Zkus ji nastavit ve startup nebo action fázi.

Pokud to nastavím ve startup fázi, ztrácí to tu výhodu redirect (index.php?page=0 → index.php).

Jan Tvrdík
Nette guru | 2595
+
0
-

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

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ě.)

pmg
Člen | 372
+
0
-
public static function getPersistentParams()
{
	return array('id') + parent::getPersistentParams();
}

// BasePresenter
public static function getPersistentParams()
{
	return array();
}
DocX
Člen | 154
+
0
-

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)