tutorial plantillas para cake aprender php cakephp cakephp-2.0

plantillas - set layout cakephp 3



CakePHP: Cómo usar un elemento de vista dentro de un controlador (6)

Estoy intentando descubrir cómo usar uno de mis elementos de vista dentro de un controlador ...

Lo sé, lo sé: "¡No hagas eso!" (99% de las veces esta es la respuesta correcta)

Pero creo que en realidad tengo una buena razón. La acción está manejando una solicitud AJAX que devuelve el marcado. El marcado devuelto es una lista que se muestra en todas partes utilizando un elemento. Entonces, en un esfuerzo por mantener mi código SECO, creo que es apropiado hacerlo aquí.

es posible?


Fácil:

$view = new View($this, false); $content = $view->element(''my-element'', $params);

También:

¡NO HAGAS ESO MÁS!


$this->view = ''/Elements/myelement'';


Debe usar una plantilla del lado del cliente. Nunca debe devolver el marcado de un servicio web o API, solo datos. Haga que su JavaScript tome los datos y luego formatéelo como lo desee.

Por ejemplo:

function getItems() { $.get(''/some/url'', function(response) { if (response.data.length > 0) { for (var i = 0; i < response.data.length; i++) { var item = response.data[i]; $(''.results'').append(''<li>'' + item.title + ''</li>''); } } }); };

Este es solo un ejemplo que se da por escrito. Obviamente, necesitarás escribir tu propia implementación.


Algunas veces, necesita renderizar un elemento CakePhp desde una vista e inyectar su contenido en la página usando AJAX al mismo tiempo. En este caso, el elemento de representación como una vista regular del controlador es mejor que crear una vista dedicada que solo contenga <?php echo $this->element(''some_element'') ?> , Y se puede hacer de esta manera:

<?php public function ajax_action() { // set data used in the element $this->set(''data'', array(''a''=>123, ''b''=>456, ''d''=>678)); // disable layout template $this->layout = ''ajax''; // render! $this->render(''/Elements/some_element''); }


Sé que esta es una vieja pregunta y otras personas ya han dado básicamente la misma respuesta, pero quiero señalar que este enfoque (proporcionado por Serge S.) ...

<?php public function ajax_action() { // set data used in the element $this->set(''data'', array(''a''=>123, ''b''=>456, ''d''=>678)); // disable layout template $this->layout = ''ajax''; // render! $this->render(''/Elements/some_element''); }

... no es una solución hacky, pero de hecho es el enfoque recomendado de los documentos de CakePHP para este caso de uso común y legítimo:

Si $ view comienza con ''/'', se supone que es una vista o archivo de elemento relativo a la carpeta / app / View. Esto permite la representación directa de elementos, muy útil en llamadas AJAX.

(De nuevo: crédito a Serge S. por el código anterior)


La forma en que hice el manejo de Ajax en Cake fue tener mi propio AjaxController. Cualquier interacción de ajax-kind va allí, que a su vez usa sus propias vistas (y ve los parciales / elementos). De esta forma, puede mantener su código SECO y aislar y propagar todos los casos de uso de ajax allí.

Ejemplo de extracto:

<?php class AjaxController extends AppController { /** * (non-PHPdoc) * Everything going to this controller should be accessed by Ajax. End of story. * @see Controller::beforeFilter() */ public function beforeFilter() { parent::beforeFilter(); $this->autoRender = false; $this->layout = false; if (!$this->request->is(''ajax'')) { $this->redirect(''/''); } } public function preview() { if ($this->request->is(''ajax'')) { $this->set(''data'', $this->data); $this->render(''/Elements/ajaxpreview''); } } ?>

Aquí está la fuente: https://github.com/Sobient/dosspirit/blob/master/app/Controller/AjaxController.php