Domanda

Ho un'applicazione CakePHP che ad un certo punto mostrerà una vista con i media del prodotto (immagini o video). Voglio sapere se c'è un modo per includere un'altra vista che minaccia il video o minaccia le immagini, a seconda di un flag.Voglio utilizzare quelle "piccole visualizzazioni" per molti altri scopi, quindi dovrebbe essere "come" un componente di una torta, per il riutilizzo.

Quello che suggerite di usare per partecipare alle Cake Convention (e non usare un file raw include('') comando)

È stato utile?

Soluzione

Controlla questo collegamento e più specificatamente il Elementi-parte di quella pagina di manuale, dovrebbe dirti tutto ciò che devi sapere

Altri suggerimenti

Nell'interesse di avere qui le informazioni nel caso qualcuno si imbattesse in questo, è importante notare che la soluzione varia a seconda della versione di CakePHP.

Per CakePHP 1.1

$this->renderElement('display', array('flag' => 'value'));

secondo te, e poi dentro /app/views/elements/ puoi creare un file chiamato display.thtml, Dove $flag avrà il valore di qualunque cosa gli passi.

Per CakePHP 1.2

$this->element('display', array('flag' => 'value'));

secondo te, e poi dentro /app/views/elements/ puoi creare un file chiamato display.ctp, Dove $flag avrà il valore di qualunque cosa gli passi.


In entrambe le versioni l'elemento avrà accesso a tutti i dati a cui ha accesso la vista + tutti i valori che gli passi.Inoltre, come qualcuno ha sottolineato, requestAction() è anche un'opzione, ma può incidere pesantemente sulle prestazioni se eseguita senza utilizzare la cache, poiché deve eseguire tutti i passaggi di un'azione normale.

Nel tuo controller (in questo esempio il controller dei post).

function something() {
    return $this->Post->find('all');
}

Nella directory degli elementi (app/views/element) crea un file chiamato posts.ctp.

In posts.ctp:

$posts = $this->requestAction('posts/something'); 
foreach($posts as $post): 
    echo $post['Post']['title']; 
endforeach; 

Quindi secondo te:

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

Questo è in gran parte tratto dal libro CakePHP qui:Creazione di elementi riutilizzabili con requestAction

Credo che l'utilizzo di requestAction sia piuttosto costoso, quindi ti consigliamo di esaminare la memorizzazione nella cache.

Usa semplicemente:

<?php include('/<other_view>.ctp'); ?>

nel .ctp in cui finisce la tua azione.

Ad esempio, crea una funzione archiviata

function archived() {
  // do some stuff
  // you can even hook the index() function
  $myscope = array("archived = 1");
  $this->index($myscope);
  // coming back, so the archived view will be launched
  $this->set("is_archived", true); // e.g. use this in your index.ctp for customization
}

Eventualmente modifica l'azione dell'indice:

function index($scope = array()) {
  // ...
  $this->set(items, $this->paginate($scope));
}

Il tuo archive.ctp sarà:

<?php include('/index.ctp'); ?>

Riutilizzo ideale del codice delle azioni e delle visualizzazioni del controller.

Per CakePHP 2.x

Una novità di Cake 2.x è la possibilità di estendere una determinata vista.Pertanto, mentre gli elementi sono ottimi per avere piccole porzioni di codice riutilizzabili, l'estensione di una vista consente di riutilizzare intere viste.

Consultare il manuale per ulteriori/migliori informazioni

http://book.cakephp.org/2.0/en/views.html#extending-views

Gli elementi funzionano se desideri che abbiano accesso agli stessi dati a cui ha accesso la vista chiamante.

Se desideri che la tua vista incorporata abbia accesso al proprio set di dati, potresti voler utilizzare qualcosa di simile requestAction().Ciò consente di incorporare una vista completa che altrimenti sarebbe autonoma.

Voglio usare quelle "piccole viste" a molti altri scopi, quindi dovrebbe essere "come" un componente di torta, per la reutilizzazione.

Questo viene fatto con "Aiutanti", come descritto qui.Ma non sono sicuro che sia davvero quello che vuoi.IL "Elementi" Anche il suggerimento sembra corretto.Dipende molto da cosa stai cercando di realizzare.I miei due centesimi...

In CakePHP 3.x puoi usare semplicemente:

$this->render('view')

Ciò renderà la vista dalla stessa directory della vista principale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top