Hosting Explorer a persistentní parametry presenteru

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

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

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

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

Problém bude asi někde jinde, ale nevím jak pomoci

Honza Marek
Člen | 1664
+
0
-

Nejde alespoň nastavit parametr na persistentní nějak „ručně“?

David Grudl
Nette Core | 8218
+
0
-

Lepší by bylo odhalit problém. Můžeš mi na tom hostingu vytvořit testovací účet?

Honza Marek
Člen | 1664
+
0
-
$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)

LM
Člen | 206
+
0
-

Nemůže za to ten eAccelerator? http://eaccelerator.net/ticket/229

Honza Marek
Člen | 1664
+
0
-

Jo, to bude ono.

David Grudl
Nette Core | 8218
+
0
-

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.