Newsgroup: it.comp.www.php
Titolo: ZendFramework: redirect, baseUrl, link e compagnia

Ciao a tutti,
ZendFramework mi sta facendo impazzire. Ho diversi problemi di base con 
l'applicazione che sto facendo. Io ho creato un applicazione che si 
trova in localhost/pozzi
se accedo a localhost/pozzi tutto funziona (pare), ma se accedo a 
localhost/pozzi/index.php mi sballa i link al foglio di stile e tutti i 
link della pagina.
Ad esempio il link al foglio di stile diventa 
(/pozzi/index.php/css/site.css) che ovviamente non esiste.
Ho provato a togliere il redirect di htaccess su index, ad aggiungere al 
front controller setBaseUrl('/pozzi') ma non riesco a farlo andare, o 
funziona accedendo a /pozzi oppure funziona accedendo a 
/pozzi/index.php, io vorrei che l'applicativo funzionasse in entrambi i 
casi, chiedo troppo??
Ho provato anche a scaricare il QuickStart, quello del guestbook e mi fa 
uno scherzo simile. Se lo scompatto e lo eseguo cosi' senza alcuna 
modifica l'applicativo non vede il foglio di stile perche' nel sorgente 
c'e' il riferimento a /css mentre dovrebbe essere riferito a 
/ZendQuickStart/public/css, ma anche aggiungendogli il baseUrl e 
modificando la rewrite rule di htaccess perche' punti a 
/ZendQuickStart/public/index.php anziche' a index.php non funziona.
Qualcuno mi sa spiegare cosa sbaglio?
grazie mille, ciao
Mauro

 casi, chiedo troppo??
Non forzare tu il baseUrl, se lo calcola da solo.
Io mi sono fatto un'estensione di Zend_Controller_Action piu` o meno cosi`:
class Base_Controller_Action extends Zend_Controller_Action
{
 public function init()
 {
   ...
   $req = $this->getRequest();
   $this->view->baseUrl = $req->getBaseUrl();
   $this->view->fullUrl = Bootstrap::$hostname . $this->view->baseUrl;
   ...
 }
}
In pratica inizializzo qui diverse cose che servono in tutte le action e 
in tutte le view o quasi (l'utente loggato, la baseUrl, il messenger, 
ecc.).
Tutti i miei controller ereditano da qui, e non direttamente da Zend:
class IndexController extends Base_Controller_Action
{
 public function indexAction()
 {
   ...
 }
}
(Devi solo ricordarti che se "sovrascrivi" init() in un tuo 
ActionController devi richiamare parent::init() come prima cosa)
A questo punto, nella view (precisamente nel layout), ho
<?php echo $this->headLink()->prependStylesheet($this->baseUrl.'/css/
stile.css'); ?>
E cosi` per tutti gli URL:
<img src="<?php echo $this->baseUrl; ?>/img/pippo.jpg" />
Ho visto in giro alcuni che si sono creati un ViewHelper per fare la 
stessa cosa, ma IMO e` inutile e appesantisce tutto.
E` una operazione che potresti dover fare anche qualche centinaio di volte 
in una pagina, e l'accesso a una variabile e` molto piu` veloce del 
richiamo di una funzione statica in una classe, tra l'altro passando 
attraverso alcuni passi di indirezione, come accade per i viewHelper.
E non ci sono elaborazioni da fare. La variabile e` sempre quella, non e` 
che cambi durante l'elaborazione.
Bye.

 che cambi durante l'elaborazione.
Verissimo, ottima idea.
Pero' tutto questo ti funziona anche se accedi a 
/nome_applicazione/index.php oppure funziona solo con /nome_applicazione/ ??
Te lo chiedo perche' io tra le varie prove che ho fatto ero riuscito ad 
ottenere quasi il tuo stesso risultato usando un viewHelper, ma funziona 
solo accedendo a /nome_applicazione, non se accedo a 
/nome_applicazione/index.php, in questo caso i link mi vengono riscritti 
nella forma:
/nome_applicazione/index.php/css/global.css
che ovviamente non va bene.
E' possibile far funzionare ENTRAMBI i link
/nome_applicazione/index.php
e anche
/nome_applicazione/
???
ciao e grazie ancora per i tuoi ottimi consigli.
Mauro

 }
Ancora una domanda, per favore.
Dove salvi questa classe perche' te la trovi con l'autoloader?
Se possibile non vorrei metterla assieme a quelle di Zend, ma vorrei 
lasciarla nella root del progetto che la usa.
grazie ancora, ciao
Mauro

 /nome_applicazione/
Potresti, nel codice che ti ho passato, aggiungere un pezzo per verificare 
se baseUrl contiene "index.php" e rimuoverlo. :)
Bye.

 lasciarla nella root del progetto che la usa.
Mi sono creato una gerarchia in /app/classes (questa classe e` in /app/
classes/Base/Controller/Action.php, per esempio), e l'ho aggiunta da 
bootstrap all'include path. A quel punto lo Zend_Loader la trova da solo.
Per la cronaca, ho anche una /app/models aggiunta all'include path, cosi` 
mi trova da solo anche i model quando faccio un new Model();
Bye.

 se baseUrl contiene "index.php" e rimuoverlo. :)
Si, infatti, è quello che ho fatto, solo che mi pareva una pezza 
evitabile, mi pareva quasi impossibile che il tutto non funzioni se 
aggiungi index.php, ma visto anche quello che mi hai scritto sopra 
evidentemente non e' cosi'.
ciao e grazie ancora!
Mauro