Zend Application con layout problemi inclusione fogli di stile

Salve,

sto usando la Zend Application con un layout generale. Però accade una cosa strana: se richiamo l'URL base, viene visualizzata la pagina corretta, con tanto di stili CSS (fogli esterni). Il controller index con la action index.

Uso un modulo che si chiama main, ed è quello di default.

Ma se nell'url metto esplicitamente /index/index in coda o /main/index/index mi carica il codice HTML del layout ma non carica i fogli di stili.

Ho provato a vedere se tante le volte cambiasse l'APPLICATION PATH, ma rimane sempre lo stesso..

Vi è mai capitata una cosa del genere? Da cosa potrebbe dipendere?

Grazie!

Luca

inviato 6 anni fa
Luca450Mhz
X 0 X
Da cosa potrebbe dipendere?

Puoi farci vedere il codice?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Certamente

In application/layouts/script/main.phtml (solo la parte iniziale, quella dei fogli di stile):

<!-- DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  -->
<?=$this->doctype ()?>

<html xml:lang="it" lang="it" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <?=$this->headMeta();?>
    
   <?=$this->headTitle();?>
   
   <?=$this->headStyle();?>
   
   <?=$this->headLink();?>
   
   <?=$this->headScript();?>

La struttura del modulo è: application/module/main/ con le varie sottocartelle

Il mio file di bootstrap (in application/bootstrap.php)

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function _initLayoutView() {
      $this -> bootstrap ('view');
      $this -> _view = $this -> getResource ('view');
      
      // set encoding and doctype
      // UTF-8
      $this -> _view -> setEncoding('iso-8859-1');
      $this -> _view -> doctype('XHTML1_STRICT');
      // set the content type and language
      $this -> _view -> headMeta() -> appendHttpEquiv('Content-Type', 'text/html; charset=iso-8859-1');
      $this -> _view -> headMeta() -> appendHttpEquiv('Content-Language', 'it_IT');
      // set css links
      $this -> _view->headStyle() -> setStyle('@import "layout_new.css";');
      $this -> _view -> headLink() -> appendStylesheet('style2.css');
      $this -> _view -> headLink() -> appendStylesheet('struttura_admin.css');
      $this -> _view -> headTitle('ArgoCMS');
      $this -> _view -> headTitle() -> setSeparator( ' : ' );

   }
   

Ho provato a fare anche:

  $this -> _view->headStyle() -> setStyle('@import "/layout_new.css";');
  $this -> _view->headStyle() -> setStyle('@import "\layout_new.css";');

Ma niente da fare...

Eventualmente, sto cercando la best-practice per l'uso dei layouts.. magari utilizzo qualche metodo errato, non lo so..

Grazie mille!

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X
Eventualmente, sto cercando la best-practice per l'uso dei layouts.. magari utilizzo qualche metodo errato, non lo so..

Hai già letto la documentazione ufficiale?

http://framework.zend.com/manual/en/zend.layout.html

In particolare il quinkstart di zend_layout dovrebbe rispondere a tutte le tue domande ;)

Inoltre potresti provare a modificare il tuo codice così:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

    protected function _initLayoutView() {
      $this -> bootstrap ('layout');
      $layout -> $this -> getResource ('layout');
                $view = $layout->getView();
      
      // set encoding and doctype
      // UTF-8
      $view->setEncoding('iso-8859-1');
      $view -> doctype('XHTML1_STRICT');
      // set the content type and language
      $view -> headMeta() -> appendHttpEquiv('Content-Type', 'text/html; charset=iso-8859-1');
      $view -> headMeta() -> appendHttpEquiv('Content-Language', 'it_IT');
      // set css links
      $view->headStyle() -> setStyle('@import "layout_new.css";'); // <--- per i fogli di stile usa appendStylesheet.
      $view-> headLink() -> appendStylesheet('style2.css');
      $view -> headLink() -> appendStylesheet('struttura_admin.css');
      $view -> headTitle('ArgoCMS');
      $view -> headTitle() -> setSeparator( ' : ' );

   }
   

Forse ti risulterà più semplice da capire.

Però devi stare attento alle path.

risposto 6 anni fa
Mario Santagiuliana
modificato 6 anni fa
X 0 X

La documentazione del framework l'ho letta e riletta, ma senza trovare la risposta alle mie domande..

Il mio file di configurazione application.ini ha questa parte:

resources.view = ""
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "main"

Ho provato a fare come dici tu, ma mi restituisce un errore, "Undefined variable: layout" nella riga:

$layout -> $this -> getResource ('layout');

grazie ancora!

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Invece di layout come resource usa main.

Ma già l'hai definito nel tuo file di configurazione...

resources.layout.layout = "main"
risposto 6 anni fa
Mario Santagiuliana
X 0 X

Non funziona neanche così... Mi dà il seguente errore:

Fatal error: Call to a member function getView() on a non-object

con questo codice:

39. $layout = $this -> getResource ('main');
40. $view = $layout->getView();

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Puoi far rivedere come hai riscritto il metodo del bootstrap?

risposto 6 anni fa
Mario Santagiuliana
X 0 X
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
   
   protected function _initModuleAutoloader () {
       $al = new Zend_Application_Module_Autoloader(array('namespace' => 'App' , 'basePath' => dirname(__FILE__) . '/modules/main/'));
    }

    protected function _initLayoutView() {
      $this -> bootstrap ('layout');
      $layout = $this -> getResource ('main');
           $view = $layout->getView();
      $view ->setEncoding('iso-8859-1');
      $view -> doctype('XHTML1_STRICT');
      $view -> headMeta() -> appendHttpEquiv('Content-Type', 'text/html; charset=iso-8859-1');
      $view -> headMeta() -> appendHttpEquiv('Content-Language', 'it_IT');
      $view -> headLink() -> appendStylesheet('layout_new.css');
      $view -> headLink() -> appendStylesheet('style2.css');
      $view -> headLink() -> appendStylesheet('struttura_admin.css');
      $view -> headTitle('ArgoCMS');
      $view -> headTitle() -> setSeparator( ' : ' );
}
risposto 6 anni fa
Luca450Mhz
X 0 X

Scusa il file di configurazione me lo fai vedere?

E anche come è organizzata la directory del layout...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Scusami se rispondo in ritardo, ma sono stato impegnato anche in altri progetti.

Allora il file di configurazione è il seguente:

[production]
phpSettings.date.timezone = "Europe/Rome"
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

autoloadernamespaces[] = "Zend_"
autoloadernamespaces[] = "Argo_"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontcontroller.moduledirectory = APPLICATION_PATH"/modules"
resources.frontcontroller.defaultmodule = "main"
resources.frontcontroller.params.prefixDefaultModule = true
resources.frontcontroller.throwerrors = false

resources.view = ""
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "main"

La struttura delle directory è la seguente:

Grazie!

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Ok, manteniamoci come da documentazione:

http://framework.zend.com/manual/en/zend.application.quick-start.html

Elimina completamente initLayoutView().

Verifica che nella configurazione della tua applicazione siano giuste le path:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

resources.layout.layout = "main"

Per me credo tu possa cancellare questa riga: resources.view = "" , non so a cosa ti serva.

Già così il tuo layout dovrebbe funzionare se al suo interno c'è una struttura simile a questa:

      <?php echo $this->doctype() ?>
      <html>
      <head>
          <?php echo $this->headTitle() ?>
          <?php echo $this->headLink() ?>
          <?php echo $this->headStyle() ?>
          <?php echo $this->headScript() ?>
      </head>
      <body>

          <?php echo $this->layout()->content ?>
      </body>
      </html>

Per rendere più personale la vista inserisci nel bootstrap la funzione _initView(), come da guida che ti ho indicato.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ho seguito quello che mi hai detto tu, ho seguito quello che dice la guida, ma niente..  :-\ rimane lo stesso problema..

Le path nella configurazione sono corrette..

Ecco i miei file ora:

Configurazione:

[production]
phpSettings.date.timezone = "Europe/Rome"
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"

autoloadernamespaces[] = "Zend_"

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontcontroller.moduledirectory = APPLICATION_PATH"/modules"
resources.frontcontroller.defaultmodule = "main"
resources.frontcontroller.params.prefixDefaultModule = true
resources.frontcontroller.throwerrors = false
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.layout = "main"

Boostrap:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
protected function _initView()  {
        $view = new Zend_View();
        $view -> doctype('XHTML1_STRICT');
        $view -> headTitle('My First Zend Framework Application');
        $view -> headLink() -> appendStylesheet('layout_new.css');
        $view -> headLink() -> appendStylesheet('style2.css');
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
            'ViewRenderer'
        );
        $viewRenderer -> setView($view);
        return $view;
    }
}

Main.phtml:

<?=$this->doctype ()?>

<html xml:lang="it" lang="it" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <?=$this->headMeta();?>
   <?=$this->headTitle();?>
   <?=$this->headStyle();?>
   <?=$this->headLink();?>
   <?=$this->headScript();?>
</head>
<body>
...
<?=$this->layout ()->content?>
...
</body>

Index.php:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';  

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV, 
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Il resto del layout però funziona giusto?

Il tuo unico problema sono i fogli di stile...

Allora dove salvi il tuo foglio di stile?

Puoi far vedere l'header del codice html che viene generato?

Controlla se il tuo foglio di stile è raggiungibile.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Si il resto funziona.. il problema in generale sono i file che vanno linkati alla pagina, come i fogli di stile esterni.

Il file css sono nella cartella public, nello stesso livello della index.php.

L'header generato è il seguente:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="it" lang="it" xmlns="http://www.w3.org/1999/xhtml">
<head>
       <title>My First Zend Framework Application</title>      
        <link href="layout_new.css" media="screen" rel="stylesheet" type="text/css" />
<body>

che è lo stesso nel caso punto nell'URL la public o con public/index/index

Con Firebug vedo che, nel caso specifico anche controller/action nell'URL, proprio non viene trovato il file css.

Per questo penso sia un problema di percorsi, che forse si aspetta di trovare i file da qualche altra parte, ma sarebbe assurdo! Anche perchè il controller/action richiamati sono gli stessi, in tutti e due i casi...

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Facendo delle prove, ho appena scoperto una cosa a dir poco stravagante.. il framework interpreta, forse, i file di inclusione, come delle action da eseguire.

Infatti ho provato a creare un file js incluso direttamente nel codice HTML. Con Firebug, andando nel sorgente e cliccando sul nome del file (che non trova) mi restituisce questo messaggio:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Default Application</title>
</head>
<body>
  <h1>An error occurred</h1>
  <h2>Page not found</h2>

  
  <h3>Exception information:</h3>

  <p>
      <b>Message:</b> Action "provaJs" does not exist and was not trapped in __call()  </p>

...

Mi sembra troppo assurdo........

risposto 6 anni fa
Luca450Mhz
X 0 X

Perchè style2.css non viene generato?

Inoltre c'è un evidente errore di sintassi nella tua pagina html (manca il tag di chiusura dell'head).

Poi hai modificato nel tuo bootstrap la route normale di Zend Framework?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Buongiorno!

L'errore di sintassi non c'è, il tag viene chiuso correttamente. Forse è stato un errore mio a copiare male il codice html generato.

Il file style2.css non viene proprio caricato. Sempre da Firebug se cerco di aprirlo ricevo questo messaggio:

<h3>Exception information:</h3>

  <p>
      <b>Message:</b> Action "style2Css" does not exist and was not trapped in __call()  </p>

  <h3>Stack trace:</h3>

No io non ho modificato nessuna route, ho lasciato tutto di default..

risposto 6 anni fa
Luca450Mhz
X 0 X
Forse è stato un errore mio a copiare male il codice html generato.

Allora per favore puoi stare attento a come copi le cose?

Puoi farci vedere il codice che hai attualmente del tuo layout?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Si farò più attenzione, assicurato.

Il mio layout ora come ora è questo:

<?=$this->doctype ()?>

<html xml:lang="it" lang="it" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <?=$this->headMeta();?>
    <?=$this->headTitle();?>
    <?=$this->headStyle();?>
    <?=$this->headLink();?>
    <?=$this->headScript();?>
    <script language="javascript" src="prova.js"></script>
</head>
<body>

<div id="maincontainer">

   <div id="topsection">  
       <?=$this -> top_section;?>
   </div>
    <div id="barra_menu_sezioni">
       <?=$this -> menu_sezioni; ?>
    </div>    
<div id="main_content">
</div>
</div>

</body>
</html>
risposto 6 anni fa
Luca450Mhz
X 0 X

Mi sembra tutto in ordine...non vedo perchè non debba funzionare...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Quello che mi chiedo anche io... Sto anche utilizzando lo Zend Server.. dovrebbe essere tutto ok, ma proprio non va.... bo...

Altra cosa: vedendo alcuni percorsi mentre facevo un pò di prove, ho visto che alcuni percorsi vengono 'letti' con i caratteri \ fino ad un certo punto, mentre la parte finale con la /. Es.

C:\Programmi\Zend\Apache2\htdocs\ArgoCMS/public/cartella

Però non ricordo bene facendo quali prove ho scoperto questa cosa.. non so, magari il framework è pensato e progettato per Linux, e su Windows bisogna configurare/cambiare qualcosa.. non lo so, dico così per quello che avevo visto..

risposto 6 anni fa
Luca450Mhz
X 0 X

Stai sviluppando su windows?

Zend Server è testato per funzionare ed essere integrato con Zend Framework indipendentemente dalla piattaforma di sviluppo o di servizio.

Attento che magari hai sbagliato te ad inserire delle path...

Proverei a fare il debug dell'applicazione con xdebug comunque.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

XDebug non lo conosco ma mi documento subito.

Però mi sorge una domanda: le impostazioni che crea di default Studio, vanno adattate all'ambiente Windows? Nello specifico il codice della index.php

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

Andrebbe cambiato con:

defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '\..\application'));

Premetto che ho provato anche così ma non funziona, però in linea di massima vorrei sapere se sarebbe più corretto così.

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Non ti so rispondere, non uso windows da anni e lo sviluppo che faccio è solo su sistemi unix.

So che in windows le path bisogna indicarle con le backslash e non con le slash (l'unico S.O. a fare il diverso a quanto pare...).

Prova per curiosità a sistemare le path in modo che siano compatibili con il pattern di windows.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ho provato ad impostare tutti i path con il carattere \, ma niente da fare..  :tichedoff:

Non so più che pensare.. il framework lo vorrei usare, ma se continua così son costretto a fare diversamente..

Grazie dell'aiuto che mi hai dato!!

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Se agli altri funziona non vedo perchè non debba funzionare sul tuo.

Prendi la quickstart guide di Zend e prova a creare una applicazione base e vedi come si comporta.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Guarda, alla fine ho deciso di fare così.. ho scaricato anche il progetto base della guida quick. Sai cosa ho scoperto? Nel layout (main.phtml) c'è la riga:

<?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>

Ma nella struttura del progetto neanche l'ombra di questo file css!!! Gli unici stili sono scritti direttamente nel file della view!! Ma allora come si spiega questo?!

risposto 6 anni fa
Luca450Mhz
X 0 X
Ma allora come si spiega questo?!

Non ti seguo...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Dalla quickstart guide volevo capire come si dovrebbero gestire questi casi, se ci fossero path da impostare o simili.

Alla fine nel layout c'è la predisposizione per un foglio di stile esterno, ma poi non si capisce come va impostato, dove vada messo nella struttura il file.

Quindi la quickstart guide non mi ha aiutato in questo senso..

risposto 6 anni fa
Luca450Mhz
X 0 X

Il css va posizionato nella cartella "pubblica"...

Forse non ho capito...sono un po' cotto dalla giornata...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Si è vero, però ad esempio volevo capire perchè il path del file css è impostato così:

"/css/stile.css"

Perchè il path inizia con il /?

Dopo mille prove, nessuna andata a buon fine, vorrei capire bene le cose. Però sono anche un pochino stufo.. anche nel forum ufficiale del framework, quello in inglese, non sono stati in grado di darmi una mano.

Comunque ho deciso di mettere su una macchina virtuale Ubuntu e installare l'ambiente Zend li e vedere se cambia qualcosa o meno.

Grazie ancora per l'aiuto!

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

No comment per ubuntu (non è la mia distro preferita...).

Allora il root path di un url, cioè "/" corrisponde alla cartella radice pubblica.

Cioè in un dominio del tipo www.example.com tu puoi accedere a varie cartelle ok?

http://www.example.com/cartella

http://www.example.com/temi

http://www.example.com/qualcosa/altro/cartella

Il "/" corrisponde a "http://www.example.com", il "/css" in una pagina html ospitata dal dominio di esempio corrisponde a "http://www.example.com/css".

Spero di aver chiarito il tuo quesito.

La tua applicazione dovrebbe funzionare secondo le citazioni che ci hai dato, non ne vedo il motivo...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ma è una notazione tipica del mondo Unix? Perchè io ho sempre sviluppato mettendo il  nome della pagina o della script direttamente senza farlo precedere dal /, per indicare una pagina nella root o nello stesso livello della pagina/script attuale.

Lo so che dovrebbe funzionare come ho fatto, e non capisco perchè non funzioni.. tu quale distro mi consiglieresti per sviluppare?

risposto 6 anni fa
Luca450Mhz
X 0 X
Ma è una notazione tipica del mondo Unix?

No.

Se tu metti una pagina html in una sotto-directory, per esempio qui: http://www.example.com/qualcosa/altro/cartella come faccio a richiamare il css che sta nella cartella principale? (http://www.example.com/)

O faccio un link assoluto: http://www.example.com/style.css

O faccio link relativi:

1) ../../ ecc

2) o come sto tentando di spiegarti /style.css

Sbaglio?

Per la distro, non suggerisco nessuna distro, prendi quella che ti va più a genio e ti è più congeniale, io uso fedora ma ad un altro può andare meglio qualcosa d'altro :)

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Hai ragione! Non avevo mai usato percorsi di questo genere, anche perchè quando sviluppo lavoro in sottocartelle del webserver locale, quindi usando / andrei in un livello superiore a quello mio. Però ho imparato una cosa nuova!  :)

Allora ho messo su un ambiente Linux, ho installato Zend Server, e ho eseguito lo stesso progetto, però ripristinando le path in stile Unix.

Risultato? ... lo stesso problema ... bo ... non so più che devo pensare ...

risposto 6 anni fa
Luca450Mhz
X 0 X

E' evidente che c'è qualche cosa che sbagli e che dal forum non riesci ad evidenziare.

Leggi questa guida e riprova:

http://akrabat.com/zend-framework/zend-framework-tutorial-for-zf-1-10/

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ho capito cosa si aspetta il framework! Se sono nella action index, lui si aspetta di trovare il foglio di stile sotto /public/index/stile.css. Se sono nella action azione, si aspetta di trovarlo in /public/azione/stile.css.

Ora potrebbe essere più facile trovare la causa di questo comportamento? Io vorrei un unico foglio di stile sotto un'unica cartella..

Grazie

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Ho risolto! Non ho capito il problema, ma nel main.phtml faccio:

<?php echo $this -> headLink() -> prependStylesheet($this -> baseURL() . '/layout_new.css'); ?>

Così funziona! Dopo tanto tempo..

Grazie cmq a tutti dell'aiuto e supporto!

Luca

risposto 6 anni fa
Luca450Mhz
X 0 X

Ecco cosa mancava ahhaah

Bene così :-)

Ciao ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda