query initialize autorender php templates cakephp

initialize - this fetch cakephp



Vista de CakePHP incluyendo otras vistas (8)

Tengo una aplicación CakePHP que en algún momento mostrará una vista con los medios del producto (fotos o videos) Quiero saber si hay alguna manera de incluir otra vista que amenace el video o amenace las imágenes, dependiendo de una bandera. Quiero usar esas "vistas pequeñas" para otros fines, por lo que debe ser "como" un componente de torta, para su reutilización.

Lo que ustedes sugieren usar para estar en las convenciones de Cake (y no usar un comando raw include('''') )


Con el interés de tener la información aquí en caso de que alguien se tropiece con esto, es importante tener en cuenta que la solución varía según la versión de CakePHP.

Para CakePHP 1.1

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

en su opinión, y luego en /app/views/elements/ puede hacer un archivo llamado display.thtml , donde $flag tendrá el valor de lo que le pase.

Para CakePHP 1.2

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

en su opinión, y luego en /app/views/elements/ puede hacer un archivo llamado display.ctp , donde $flag tendrá el valor de lo que le pase.

En ambas versiones, el elemento tendrá acceso a todos los datos a los que la vista tiene acceso + cualquier valor que le pase. Además, como señaló alguien, requestAction() también es una opción, pero puede tener un alto costo en el rendimiento si se hace sin usar el caché, ya que tiene que pasar por todos los pasos que haría una acción normal.

En su controlador (en este ejemplo, el controlador de mensajes).

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

En su directorio de elementos (app / views / element) cree un archivo llamado posts.ctp.

En posts.ctp:

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

Entonces en tu opinión:

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

Esto se toma principalmente del libro de CakePHP aquí: Creación de elementos reutilizables con requestAction

Creo que el uso de requestAction es bastante caro, por lo que querrá examinar el almacenamiento en caché.


Para CakePHP 2.x

Nuevo para Cake 2.x es la capacidad de extender una vista determinada. Entonces, aunque los elementos son geniales para tener pequeños trozos de código reutilizable, la extensión de una vista le permite reutilizar vistas completas.

Consulte el manual para obtener más / mejor información

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


Simplemente use:

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

en el .ctp tu acción termina en

Por ejemplo, crea una función archivada

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 }

Posiblemente ajuste su acción de índice:

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

Su archivo.ctp será:

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

Reutilización ideal del código de acciones y vistas del controlador.


Quiero usar esas "vistas pequeñas" para otros fines, por lo que debe ser "como" un componente de torta, para su reutilización.

Esto se hace con "Ayudantes", como se describe aquí . Pero no estoy seguro de que eso sea realmente lo que quieres. La sugerencia de " Elementos " parece correcta también. Depende en gran medida de lo que estás tratando de lograr. Mis dos centavos...


Echa un vistazo a este enlace y, más específicamente, a los Elementos, parte de esa página de manual, te dirá todo lo que necesitas saber


Los elementos funcionan si desea que tengan acceso a los mismos datos a los que tiene acceso la vista llamante.

Si desea que su vista incrustada tenga acceso a su propio conjunto de datos, es posible que desee utilizar algo como requestAction() . Esto le permite incrustar una vista completa que de otro modo sería independiente.


En CakePHP 3.x puedes hacer un simple uso:

$this->render(''view'')

Esto representará la vista desde el mismo directorio que la vista principal.