Come Eseguire Una Action Di Un Controller Da Un'altro Controller?

Avrei la strana necessità che un controller chiami una action di un’altro controller (che da in output una stinga frutto di un renderPartial).

Come si fa?

In qualsiasi modo lo faccio, ottengo una pagina bianca, senza uno straccio di errore… non capisco

Mostraci il codice.

Io ho un modulo che gestisce le anagrafiche, quando da un altra parte dell’applicazione lavoro con le anagrafiche mi richiamo il controller AnagraficaController, dove ho una funzione statica (nel mio caso caricaesalva) che si occupa di tutto quanto deve fare il controller. il controller è caricato di default negli import del main.php, perché mi farà comodo in qualsiasi parte dell’applicazione.

Ma non so quanto ti possa fare comodo questa soluzione…

forse la tua soluzione potrebbe essere simile a quella di Model::model()->

ovvero una funzione statica che ti permette di creare la classe del controller…

io non ho codice da mostrare, sto chiedendo proprio come si fa ad usare una action di un controller dentro un’altra.

Praticamente quello che devo fare è unire in un pdf il risultato di più stampe diverse.

Queste sono tutte, tranne una, frutto di varie action di un controller unico.

Però gli devo accodare l’output di un action di un diverso controller, non vorrei riscrivere del codice… mumble.

Ti presento la funzione


 $this->forward(route,exit[true/false]);

che fa di bello? esegue il controller chiamato.

Exit ferma tutto dopo la chiamata, come un redirect ma senza cambiare indirizzo

Se invece di true (default) metti false includi il risultato dell’action

L’unica cosa è che devi modificare la tua action originale per fare in modo che al passaggio di una data variabile faccia un renderPartial anzichè un render, altrimenti ti trovi 2 header, 2 menu…

qui la documentazione

edit: non riesco a passargli variabili direttamente, forse bisognerebbe usufruire di session o simile… o forse sono solo io:)

Io credo tu stia facendo un po’ confusione con la terminologia. Intuisco che tu debba unire più view, e non più action. Per fare questo, ti suggerisco di fare una view che dentro di se richiami diversi renderPartial(); In questo modo avrai un assemblato di tutte quelle view.

si, effettivamente l’effetto finale è di unire il render di due view di due controller diversi.

Ora che ci penso questo so già farlo,

Controllerò se poi la forward fa al caso mio.

Grazie intanto, se trovo un blocco specifico, aggiorno il thread e posto del codice

Aggiornamento.

Purtroppo non la forward non va bene, restituisce ‘void’.

Vediamo se riesco a spiegare la situazione, perchè ancora non ho trovato soluzione, se non la duplicazione del codice, cosa che non voglio fare.

[b]

Riassunto: devo poter chiamare una action di un controller da dentro un secondo controller, il quale dovrà usare la stringa ritornata dall’action del primo

[/b]

segue la versione lunga:

Ho uno UsersController che raccoglie diversi dati usando User::model() e li ‘incrocia’ live per creare una specie di tabella pivot. Il motivo per cui non uso una vista, è che questa estrazione è configurabile da parte dell’utente, che quindi puo girare e rigirare i dati in svariati modi.

Finita la preparazione dei dati in memoria, viene invocato il render di un container che a sua volta usa il renderPartial per una lista parecchia customizzata e quindi fatta ‘a manina’ via html, che a sua volta esegue il renderPartial delle varie righe.

Ho poi un ActivityController che a fine mese di permette di stampare in pdf un ventina di pagine di dati presi tutti dalla tabella / modello Activity.

Mi è stato chiesto di accodare al pdf anche una particolare configurazione del report fatto dallo UserController, che sarà fisso.

Quindi necessito da ActivityController di poter eseguire il renderPartial di una delle viste di Activity, e questo so farlo, ma prima gli devo passare ed alaborare tutti i dati presi dal modello User.

Invece di duplicare il codice di User->actionPrintAnaliticalReport(… parametri …) vorrei inserire un ulteriore parametro, opzionale, alla chiamata. Così se è presente ed è true, invece di usare mpdf per stampare il pdf, fa semplicemente


return $this->renderPartial(... , true); 

Io ho bisogno dentro ad ActivityController di poter fare qualcosa del tipo




 $string .= UserController->actionPrintAnaliticalReport ( ... parametri ..., 'true')

 ....



A seguire mPdf trasforma la stringa in Pdf.