Hosting Explorer a persistentní parametry presenteru
- Honza Marek
- Člen | 1664
Bohužel netuším, čím to je, ale na hostingu explorer.cz nefungují persistentní parametry. Jednak nefungují persistentně a druhak se nepřiřadí do proměnné $presenter->parametr jejich hodnota.
Parametry mám uvozené takto:
/** @persistent */
public $path;
// nebo občas takto
/**
* @var string
* @persistent
*/
public $article;
a na localhostu to ničemu nevadí.
Ještě příslušné phpinfo()
- David Grudl
- Nette Core | 8218
To vypadá na selhání reflection. Můžeš prověřit, že to vidí proměnné
$class = new ReflectionClass('AnyClass');
// Print class properties
printf("---> Properties: %s\n", var_export($class->getProperties(), 1));
i jejich detaily:
// Create an instance of the ReflectionProperty class
$prop = new ReflectionProperty('AnyClass', 'AnyProperty');
// Print out basic information
printf(
"===> The%s%s%s%s property '%s' (which was %s)\n" .
" having the modifiers %s\n",
$prop->isPublic() ? ' public' : '',
$prop->isPrivate() ? ' private' : '',
$prop->isProtected() ? ' protected' : '',
$prop->isStatic() ? ' static' : '',
$prop->getName(),
$prop->isDefault() ? 'declared at compile-time' : 'created at run-time',
var_export(Reflection::getModifierNames($prop->getModifiers()), 1)
);
- Honza Marek
- Člen | 1664
Nejdřív jsem zkusil kód nakopírovat do metody actionDefault špatného presenteru. Objevila se mi akorát prázdná stránka a v hlavičce odpovědi chyba 500.
Pak jsem zkusil kód nacpat do šablony jiného presenteru. Funguje to, stejně jako na localhostu. Zhruba takto:
---> Properties: array (
0 =>
ReflectionProperty::__set_state(array(
'name' => 'path',
'class' => 'Admin_FilesPresenter',
)),
1 =>
ReflectionProperty::__set_state(array(
'name' => 'form',
'class' => 'Admin_FilesPresenter',
)),
2 =>
ReflectionProperty::__set_state(array(
'name' => 'fileManipulator',
'class' => 'Admin_FilesPresenter',
)),
3 =>
ReflectionProperty::__set_state(array(
'name' => 'user',
'class' => 'Admin_FilesPresenter',
)),
4 =>
ReflectionProperty::__set_state(array(
'name' => 'error',
'class' => 'Admin_FilesPresenter',
)),
5 =>
ReflectionProperty::__set_state(array(
'name' => 'message',
'class' => 'Admin_FilesPresenter',
)),
6 =>
ReflectionProperty::__set_state(array(
'name' => 'defaultView',
'class' => 'Admin_FilesPresenter',
)),
7 =>
ReflectionProperty::__set_state(array(
'name' => 'invalidLinkMode',
'class' => 'Admin_FilesPresenter',
)),
8 =>
ReflectionProperty::__set_state(array(
'name' => 'autoCanonicalize',
'class' => 'Admin_FilesPresenter',
)),
9 =>
ReflectionProperty::__set_state(array(
'name' => 'outputAllowed',
'class' => 'Admin_FilesPresenter',
)),
10 =>
ReflectionProperty::__set_state(array(
'name' => 'params',
'class' => 'Admin_FilesPresenter',
)),
)
===> The public property 'path' (which was declared at compile-time)
having the modifiers array (
0 => 'public',
)
Poté jsem si troufl zkusit nafixlovat v jiném presenteru
(Admin_HomepagePresenter) stejné podmínky (persistentní proměnná $path) a
dát kód do jeho actionDefaultu. Kód funguje pro třídu
Admin_HomepagePresenter i Admin_FilesPresenter. Ale parametr $path se stejně
nechová persistentně.. Testoval jsem to
výpisem $this->link("default")
- David Grudl
- Nette Core | 8218
Lepší by bylo odhalit problém. Můžeš mi na tom hostingu vytvořit testovací účet?
- Honza Marek
- Člen | 1664
$rc = new ReflectionClass("Admin_FilesPresenter");
$rp = $rc->getProperty("path");
Debug::dump($rp->getDocComment());
Zkoušel jsem tohle…
localhost: string(18) "/** @persistent */"
explorer.cz: bool(FALSE)
- David Grudl
- Nette Core | 8218
Teoreticky bys mohl změnit detekci persistentních parametrů a to úpravou
metody PresenterHelpers::getPersistentParams.
Například persistentní parametry by začínaly určitým prefixem, třeba
$p_page
. Vyžadovalo by to teda ještě úpravu metod saveState a
loadState, aby ten prefix odstranili, aby se nepoužíval v URL.