conoscere il nome del controller e dell'azione richiamata

Se eseguo un link del tipo

http://sito.it/NomeController/Azione

Nel momento in cui mi carica il layout di default  e prima che venga richiamato il controller corrispondente, vorrei conoscere a priori il nome del controller e dell'azione che è stata richiesta.

Come dovrei fare?

inviato 7 anni fa
Toto007
modificato 7 anni fa
X 0 X

Questa documentazione può esserti utile?

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

Per cosa ti serve fare questa cosa esattamente? Così messa la richiesta non saprei come aiutarti...

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Nel layout html devo verificare qualè il nome del controller in modo da evidenziare la voce del menu con un determinato colore...

Cmq avrei trovato la funzione che mi serve, ma riesco a chiamarla in uno dei controller...invece vorrei richiamarla nel layout o meglio ancora nell'index.php

Incollo qui il codice

class CatalogoController extends Zend_Controller_Action
{

    public function init()
    {
        
    }

    public function indexAction()
    {
        
    
    $request =  $this->getRequest();
    $this->view->ControllerName=strtolower($request->getControllerName());
          
            
    }


}

Nel layout html (o nel index.php) dovrei fare lo stesso ragionamento però all'istruzione $this->getRequest();

devo sostituire $this con la classe relativa (che non ho capito qual'è)

risposto 7 anni fa
Toto007
X 0 X

Puoi crearti un view helper, procedi così:

1) crei il tuo helper: "application/views/helpers/GetController.php" (puoi nominarlo come preferisci ma con il primo carattere maiuscolo

2) l'helper potrebbe essere così scritto:

<?php
class Zend_View_Helper_GetController
{
    function getController()
    {
        $fc = Zend_Controller_Front::getInstance();
        return strtolower($fc->getRequest()->getControllerName());
    }
}

3) Nel tuo layout.phtml o nelle pagine phtml delle tue azioni puoi richiamarlo in questo modo per ottenere l'echo del controller, per es.:

<?php echo $this->getController(); ?>

La proprietà "ControllerName" che hai creato può essere utilizzata nell'index.phtml del tuo controller richiamandola con $this->ControllerName comunque, altrimenti se usi l'helper fai come ti ho spiegato prima.

Ciao

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Putroppo non funziona mi dice:

 Call to a member function getControllerName() on a non-object in <b>D:\zend\ZendServer\share\ZendFramework\library\Zend\View\Helper\GetController.php</b> on line <b>9</b>

a quanto pare non mi prende  instanzia del front controller in maniera corretta

risposto 7 anni fa
Toto007
X 0 X

Sono sicuro che funziona perchè prima di passartelo l'ho provato in locale...e l'ho ritestato pure ora...

Tu hai messo il file GetController.php dentro la directory: "\library\Zend\View\Helper\" perchè?

Devi metterla dentro alla cartella "application/views/helpers" (in windows usa le backslash).

Poi io ho inserito 9 righe di codice, come mai a te l'errore lo da esattamente alla riga 9? Hai aggiunto qualcosa?

Puoi far vedere in questo caso il tuo file?

Vedrai che poi funziona.

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Si scusami, avevo sbagliato a collocare l'helper. Ora nel layout.phtml funziona. Grazie  O0

Volevo capire se c'era la possibilita anche di farlo funzionare nel bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

 protected function _initView()
    {
        // Initialize view
        $view = new Zend_View();
     
        $view->doctype('XHTML1_STRICT');
        
        $view->headLink()->appendStylesheet(URL.'/styled/style-template.css');
        $view->headTitle('Questa è la mia prima applicazione in zend');
      
        // Add it to the ViewRenderer
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
            'ViewRenderer'
        );
        $viewRenderer->setView($view);
      /*  $p= new Zend_Controller_Request_Http(http://localhost/arstoto/catalogo);
        $view->ControllerName=$p->getControllerName();
        echo $view->ControllerName;
        exit();*/
        // Return it, so that it can be stored by the bootstrap
        echo $view->getController();
        exit();
        return $view;
    }
}

ma mi da errore

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'GetController' was not found in the registry; used paths: Zend_View_Helper_: Zend/View/Helper/' in D:\zend\ZendServer\share\ZendFramework\library\Zend\Loader\PluginLoader.php:400 Stack trace: #0 D:\zend\ZendServer\share\ZendFramework\library\Zend\View\Abstract.php(1117): Zend_Loader_PluginLoader->load('GetController') #1 D:\zend\ZendServer\share\ZendFramework\library\Zend\View\Abstract.php(568): Zend_View_Abstract->_getPlugin('helper', 'getController') #2 D:\zend\ZendServer\share\ZendFramework\library\Zend\View\Abstract.php(335): Zend_View_Abstract->getHelper('getController') #3 [internal function]: Zend_View_Abstract->__call('getController', Array) #4 D:\zend\Apache2\htdocs\arstoto\application\Bootstrap.php(26): Zend_View->getController() #5 D:\zend\ZendServer\share\ZendFramework\library\Zend\Application\Bootstrap\BootstrapAbstract.php(636): Bootstrap->_initView() #6 D:\zend\ZendServer\share\ZendFramework\library\Zend\Appli in D:\zend\ZendServer\share\ZendFramework\library\Zend\Loader\PluginLoader.php on line 400

risposto 7 anni fa
Toto007
X 0 X

L'errore da quello che ho capito succede perchè il settaggio del path da dove ricavare gli helper viene fatto dopo il bootstrap. inoltre anche l'istanziazione del front controller viene fatto dopo il bootstrap... quindi... come si potrebbe rimediare?

risposto 7 anni fa
Toto007
modificato 7 anni fa
X 0 X

spulciando la classe dello Front Controller ho trovato le istruzioni che mi servivano e le ho scritte all'interno bootstrap.php e funziona anche così:

       $request= new Zend_Controller_Request_Http();

        $r = new Zend_Controller_Router_Rewrite();

        $r->route($request);

        echo $request->getControllerName();

        exit();

Mi chiedo però se è corretto comportarmi in questa maniera...

risposto 7 anni fa
Toto007
modificato 7 anni fa
X 0 X

Non capisco a cosa ti serve inserire questa cosa nel Bootstrap.

Io avrei lasciato stare il bootstrap, mi sarei limitato a costruire l'helper come ti ho indicato e poi utilizzarlo nelle varie view dato che è li che ti serve per fare i controlli giusto?

risposto 7 anni fa
Mario Santagiuliana
X 0 X

Si alla fine farò sicuramente come mi hai consigliato tu.

Ma in realtà il mio obiettivo è anche quello di capire il comportamendo di Zend e di poterlo modificare liberamente.

Cmq io lo volevo metterlo nel Bootstrap anche perchè è proprio li che inserisco le variabili globali della View  come i fogli di stile, alcuni  meta tag, etc.

Quindi per una questione di ordine , insieme a questa variabili, volevo inserire il nome del controller richiamato.

risposto 7 anni fa
Toto007
modificato 7 anni fa
X 0 X

Le variabili che hai inserito te nel bootstrap sono comunque variabili "statiche" giusto? Che vengono utilizzate, come appunto hai detto te, variabili globali, sfruttate per lo più all'interno dei layaout.

In questo caso si tratta di recuperare un nome che varia a seconda del controller utilizzato all'interno delle varie view, si può anche definire nel bootstrap ma a me sembra più logico e sensato creare un helper per le view che mi fornisca il nome del controller, dato che si lavora solo sulle view.

Per capire meglio il funzionamento dello zend puoi guardare nel link che ti avevo suggerito qualche messaggio fa, c'è uno schema sul funzionamento di una applicazione costruita con Zend Framework.

Ciao

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