Upgrade alla versione 1.5

Ciao a tutti.

Apro questo topic perchè spero che qualche buona anima mi possa aiutare...

Io dovrei aggiornare una applicazione che ho sviluppato con una versione "old" del framework, con la versione 1.5 dello Zend. Ora, io ho letto un articolo in proposito in cui si spiegava che per fare ciò, basta semplicemente sostituire la library precedente con quella nuova; si accennava però anche al fatto che l'aggiornamento prevede anche la modifica delle view action.. e non ho capito come devo modificarle...

Qualcuno saprebbe darmi delucidazioni, please??

Grazie anticipatamente e comunque  :bye:

inviato 8 anni fa
gibson
X 0 X

E' vero, è stato modificato il meccanismo di traduzione degli URL in Action delle View:

http://framework.zend.com/manual/en/zend.controller.migration.html

Se un URL è scritto nella forma /index/azione-di-test allora verrà invocato il metodo IndexController::azioneDiTestAction

Se invece un URL è nella forma /index/azioneDiTest allora verrà invocato il metodo IndexController::azioneditest (senza l' "Action" finale)

Inoltre il ViewRenderer (action helper) funzionerà solo impiegando la prima convenzione per gli URL.

In poche parole quindi ti conviene usare URL nella forma /index/azione-di-test

Comunque per prima cosa aggiorna i file del Framework e poi se hai problemi nell'accedere a qualche particolare Action di un Controller verifica se il problema è causato proprio dagli URL

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Grazie Gianni per il tuo tempestivo intervento!

Allora, io ho aggiornato la libreria, come mi hai suggerito, e prima di andare a metter mano al codice ho provato a far girare l'applicazione per vederne il comportamento. Le chiamate ai metodi viewAction di ogni controller funzionano correttamente (e vengono invocata naturalemente nel seguente modo, per esempio: /prodotti/view/) mentre le chiamate agli altri metodi non funzionano ma ritornano l'errore di pagina non trovata.

Allora, questi altri metodi hanno un nome semplice, ovvero non composto da più parole, come ad esempio newAction, editAction, deleteAction,etc... e vengono invocate nello stesso identico modo descritto prima. Ora, da quanto ho capito , la modifica che mi hai descritto nel tuo post riguarda solo le chiamate ai metodi action che presentano come nome la composizione di più parole. Questo però non è il mio caso, perchè come detto si tratta di parole "semplice"..

Ho provato a fare un pò di test, a cambiare comunque il nome del metodo, ma il risultato non cambia: pagina non trovata.

Qualcuno ha qualche idea sul perchè di sta cosa?

Ah, con la versione precedente della library tutto fungeva bene.

Grazie anticipatamente!

risposto 8 anni fa
gibson
X 0 X

Dovresti cercare di scoprire quale Action di quale Controller viene cercata ma non trovata, ad esempio con

$frontController = Zend_Controller_Front::getInstance();

...

$frontController->throwExceptions(true);

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

mmmhh... e come dovrei usare i metodi che mi hai suggerito? Devo metterli all'interno della funzione newAction per esempio?

Ps: che celerità di risposta, grazie  O0!!

risposto 8 anni fa
gibson
X 0 X

no, quei metodi vanno messi nel file di bootstrap (index.php)

In realà dovresti già avere qualcosa del tipo:

$frontController = Zend_Controller_Front::getInstance();

magari con la variabile $frontController che si chiama in un altro modo.

Ciò che importa è questa istruzione:

$frontController->throwExceptions(true);

che serve ad attivare il lancio delle eccezioni, quindi e questa istruzione che dovresti mettere nel file index.php

Se hai problemi riporta il file index.php

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Io ce le ho messe le istruzioni nel file, ma non è cambiato nulla, cioè non è stata lanciata alcuna eccezione (all'interno dei metodi action è presente il blocco try/catch che permette di catturare e gestire le eccezioni)....

Riporto il file index.php

<?php
           set_include_path(get_include_path().PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./models');

           require_once('Zend/Loader.php');
           require_once('Zend/Pdf.php');

           Zend_Loader::registerAutoload();

           date_default_timezone_set('Europe/Rome');

           try {
              $db = Zend_Db::factory('Pdo_Mysql', array(
                                    'host'     => 'localhost',
                                    'username' => 'root',
                                    'password' => 'root',
                                    'dbname'   => 'ZF-tutorial'
                             ));
           
                      $db->getConnection();
           } catch (Zend_Db_Adapter_Exception $e) {
                      die("Zend_Db_Adapter_Exception: ".$e->getMessage());
           } catch (Zend_Exception $e) {
                      die("Zend_Exception".$e->getMessage());
           }

           Zend_Registry::set('db', $db);

           define('BASE_URL', str_replace('index.php','',$_SERVER['PHP_SELF']));
           Zend_Controller_Front::run('controllers');

           Zend_Loader::loadClass('Zend_Controller_Front');
           $frontController = Zend_Controller_Front::getInstance();
           $frontController->setControllerDirectory('./controllers');
           $frontController->throwExceptions(true);
?>
risposto 8 anni fa
gibson
X 0 X

Sbaglio o manca l'istruzione per avviare il dispatch del front controller?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ups... ha ragione, ho saltato l'ultima riga copiando il codice dell'index. Ecco, è così in definitiva

<?php
    
     .......

     $frontController = Zend_Controller_Front::getInstance();
     $frontController->setControllerDirectory('./controllers');
     $frontController->throwExceptions(true);
     $frontController->dispatch();
?>
risposto 8 anni fa
gibson
X 0 X

Ok, quindi se il $frontController non trova il Controller o la Action dovrebbe mostrarti un messaggio di errore. O no?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Eh, invece no purtroppo, non mi viene visualizzato alcun messaggio: semplicemente viene rivisualizzato il solito messaggio di "pagina non trovata".... Non ho proprio idea del perchè.. all'interno della struttura dell'applicazione è presente il blocco per la gestion delle eccezioni, quindi se ne viene lanciata una, questa dovrebbe essere catturata (l'applicazione l'ho sviluppata partendo dagli esempi presenti sugil articoli dedicati allo Zend, credo da te realizzati, davvero ottimi articoli)

risposto 8 anni fa
gibson
X 0 X

Il messaggio di "pagina non trovata" è generato da un ErrorController oppure si tratta del classico errore 404 del server Apache?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni!  :)

Si, l'errore è generato da un errorController

risposto 8 anni fa
gibson
X 0 X

Strano, l'ErrorController non viene lanciato dal FrontConroller se è stato impostato il throwExceptions() a true!!!

Come si spiega?

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Eh, proprio non saprei...  :-\

Tra l'altro ho notato che da quando ho inserito il pezzo di codice riguardante il font-controller, succede una cosa strana, ovvero, l'homepage dell'applicazione (e anche le pagine in cui vengono mostrati a video tabelle dove sono elencati i prodotti o i materiali) viene ripetuta tre volte, nel senso che la lunghezza della pagina viene triplicata e il contenuto ripetuto tre volte... robe strane davvero...  :o

risposto 8 anni fa
gibson
X 0 X

Comunque prova a rimuovere l'error controller

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ho provato a rimuovere l'error controller... niente.. o meglio, non mi visualizza più la pagina con scritto "pagina non trovata", semplicemente mostra una pagina bianca... ma nessun messaggio di eccezione...

Boh.. mi viene da pensare di tornare alla versione precedente della libreria... solo che mi servirebbe l'update che hanno fatto alla sezione pdf...

risposto 8 anni fa
gibson
X 0 X

Prova a realizzare un semplice file di bootstrap, configurando solo il front controller in modo che lanci le eccezzioni e poi, senza aggiungere alcun Controller, prova ad eseguirlo, dovrebbe mostrarti i messaggi di errore.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Intendi in questo modo?

<?php
    set_include_path(get_include_path().PATH_SEPARATOR.'./library'.PATH_SEPARATOR.'./models');

    require_once('Zend/Loader.php');

    Zend_Loader::registerAutoload();

    date_default_timezone_set('Europe/Rome');

    try {
       $db = Zend_Db::factory('Pdo_Mysql', array(
           'host'     => 'localhost',
            'username' => 'root',
           'password' => 'root',
           'dbname'   => 'ZF-tutorial'
        ));
   
        $db->getConnection();
    } catch (Zend_Db_Adapter_Exception $e) {
   die("Zend_Db_Adapter_Exception: ".$e->getMessage());
    } catch (Zend_Exception $e) {
   die("Zend_Exception".$e->getMessage());
    }

    Zend_Registry::set('db', $db);

    define('BASE_URL', str_replace('index.php','',$_SERVER['PHP_SELF']));

    Zend_Loader::loadClass('Zend_Controller_Front');
    $frontController = Zend_Controller_Front::getInstance();
    $frontController->setControllerDirectory('./controllers');
    $frontController->throwExceptions(true);
    $frontController->dispatch();

?>
risposto 8 anni fa
gibson
X 0 X

Si, puoi anche togliere la connessione al DB  :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

 :wallbash: :wallbash: :wallbash: :wallbash:

niente, nessun messaggio.. solo pagine completamente bianche... C'è qualche settaggio che potrei non aver considerato nei file di configurazione di php, secondo te? ... mi sto deprimendo...  :'(

risposto 8 anni fa
gibson
X 0 X

prova a mettere un error_reporting(E_ALL); in testa allo script

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda