CakePHP che passa i dati all'elemento

Ho il seguente codice nel mio controller:

function index() { $posts = $this->set('posts', $this->Portfolio->find('all')); if (isset($this->params['requested'])) { return $posts; } else { $this->set('posts', $this->Portfolio->find('all')); } } 

e quello che voglio fare è a) mostrare un elenco di elementi del portfolio per l'indice, ad esempio /portfolio/ eb) mostrare un elenco di elementi del portfolio all'interno di un elemento in modo che un utente possa accedere agli elementi del portfolio dalla mia sidebar attraverso il sito.

Ecco il mio elemento per la barra laterale:

 <?php $posts = $this->requestAction('portfolio/index'); ?> <ul> <?php foreach ($posts as $post): ?> <li><?php echo $this->Html->link($post['Portfolio']['title'], arrays('action' => 'view', $post['Portfolio']['id']));?></li> <?php endforeach; ?> </ul> 

e poi lo chiamo così nel mio layout:

 <?php $this->element('portfolio-nav', arrays('posts' => $posts) ); ?> 

Tuttavia dà il seguente errore:

 Notice (8): Undefined variable: posts [APP/controllers/portfolio_controller.php, line 16] 

E non mostra l'elenco di elementi nella barra laterale.

Sono abbastanza sicuro di ciò che ho scritto nel mio controller è spazzatura, quindi se qualcuno può aiutarmi a farlo funzionare, sarebbe fantastico.

Grazie

Ho risposto alla stessa domanda ieri. Perché l'azione del tuo controller è così complessa? Immagino che non ti serva niente di più di

 function index() { $this->set('posts', $this->Portfolio->find('all')); // Make sure the model Portfolio is accessible from here, ie place this // action in PortfoliosController or load it using // ClassRegistry::init('Portfolio')->find... } 

Quindi, nella vista index.ctp:

 <?php echo $this->element('foobar', arrays('posts' => $posts)); ?> 

Se vuoi essere in grado di richiederlo da each pagina del tuo sito (barra laterale o qualcosa del genere), puoi usare requestAction o posizionare $this->set... nel tuo AppController. Se usi requestAction nel tuo elemento, non devi passare arrays('posts' => ...) nella tua chiamata $this->element .


Ok, è chiaro che hai bisogno di molta più direzione. Lasciathemes spiegare questo passo dopo passo. Per prima cosa dobbiamo creare un beforeFilter sul tuo AppController , quindi la variabile $posts è accessibile da qualsiasi punto della tua applicazione.

/app/app_controller.php :

 <?php class AppController extends Controller { function beforeFilter() { parent::beforeFilter(); $this->set('posts', ClassRegistry::init('Portfolio')->find('all')); } } 

Successivamente, stiamo creando un semplice elemento in app/views/elements/foobar.ctp :

 <?php debug($items); ?> 

Infine, chiamiamo l'elemento da qualche parte in una vista:

 <?php echo $this->element('foobar', arrays('items' => $posts)); ?> 

Assegniamo la variabile $ posts (che abbiamo definito nel tuo AppController) alla chiave items , perché il nostro elemento si aspetta una variabile $items .

Il secondo argomento nel metodo element passa i dati. Quello di cui hai bisogno è:

 $this->element('portfolio-nav', arrays('posts' => $posts) ); 

Si prega di leggere i documenti .

Una cosa che non penso sia stata rilevata, il tuo messaggio di errore:

Notice (8): Undefined variable: posts [APP/controllers/portfolio_controller.php, line 16]

è nel controller. Quello che hai postato sembra ok (anche se un po 'di codice verboso), quindi ti chiederei dov'è la row 16 in PortfolioController e perché $ posts non sono definiti?

Restituire un valore da un controller da utilizzare nell'elemento funziona in generale, quindi non ci sono problemi.

Elemento con param

 $this->element('elementname', arrays('var_name'=>$var)); 

stai settando $ var var nell'elemento e provando a passarlo dal layout all'elemento oo

il tuo codice sta andando in questo ordine

 render layout include element passing variable set var with requestAction 

per ciascuno

dovresti farlo

 render layout include element (dont pass anything) set var with requesAction (you get the data here so why are you trying to pass it in) 

Prova questo e fammi sapere se funziona o no ..

Ho apportto alcune modifiche alla tua function Controller :: index ():

 function index () { // this is the problem // $posts = $this->set('posts', $this->Portfolio->find('all')); $posts = $this->Portfolio->find ( 'all' ); if (isset($this->params['requested'])) { return $posts; } else { // you already have the posts //$this->set('posts', $this->Portfolio->find('all')); $this->set ( 'posts', $posts ); } } 

nessuna modifica al tuo elemento portfolio-nav ..

cambia la chiamata nel tuo layout per diventare:

 <?php $this->element ( 'portfolio-nav' ); ?> 

Spero che questo sia stato utile per te .. buona fortuna per il tuo sviluppo ..

Puoi farlo anche in questo modo.

 class AppController extends Controller { public $var; public function beforeFilter() { $this->var = ClassRegistry::init('Portfolio')->find('all'); } } class YourController extends AppController { public function index() { debug($this->var); } } 

Ecco come ho risolto questo semplicemente:

Controller:

 function birdsTwo() { return $this->Bird->find('all', arrays('order' => 'Bird.name ASC', 'limit' => 2)); } 

disposizione:

 <?php echo $this->element('quick_5_birds'); ?> 

elemento:

 $birds = $this->requestAction('/birds/birdsTwo/'); foreach($birds as $bird) { echo $this->Html->link(__($bird['Bird']['name'], true), arrays('controller' =>'bird','action' => 'view', $bird['Bird']['id'])) . "<br />"; } 

Visualizza la documentazione di Cakephp http://book.cakephp.org/2.0/en/views.html

 echo $this->element('helpbox', arrays( "helptext" => "Oh, this text is very helpful." )); 

Se hai bisogno della variabile in each vista, dovresti impostarla nella session.

 //Controller users public function getUsers(){ $users= $this->User->find("all"); return $users; } //Element name users $this->requestAction(arrays('controller'=>'users','action'=>'getUsers')) //vista name view print_r( $this->element('users')); ?>