CakePHP: How to use a view element inside of a controller

后端 未结 6 1128
情深已故
情深已故 2020-12-17 20:52

I\'m trying to figure out how to use one of my view elements inside of a controller...

I know, I know: \"Don\'t do that!\" (99% of the time this is

相关标签:
6条回答
  • 2020-12-17 21:20

    You should use a client-side template. You should never return mark-up from a web service or API, just data. Have your JavaScript take the data, and then format it how you wish.

    For example:

    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>');
                }
            }
        });
    };
    

    This is just an example written off the cuff. Obviously you’ll need to write your own implementation.

    0 讨论(0)
  • 2020-12-17 21:21

    I know this is an old question and other people have already given basically the same answer, but I want to point out that this approach (provided by 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');
    }
    

    ...is not a hacky workaround, but is in fact the recommended approach from the CakePHP docs for this common and legitimate use case:

    If $view starts with ‘/’, it is assumed to be a view or element file relative to the /app/View folder. This allows direct rendering of elements, very useful in AJAX calls.

    (Again: Credit to Serge S. for the code above)

    0 讨论(0)
  • $this->view = '/Elements/myelement';

    0 讨论(0)
  • 2020-12-17 21:27

    The way I did any ajax handling in Cake was to have my own AjaxController. Any interaction of ajax-kind goes there, which in-turn uses their own views (and view partials / elements). That way you can keep your code DRY and isolate and propagate all ajax use-cases there.

    Example excerpt:

    <?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');
            }
        } 
    ?>
    

    Here's the source: https://github.com/Sobient/dosspirit/blob/master/app/Controller/AjaxController.php

    0 讨论(0)
  • 2020-12-17 21:29

    Sometimes, you need to render a CakePhp element from a view and inject its content into the page using AJAX the same time. In this case rendering element as a regular view from controller is better than creating a dedicated view that just contains <?php echo $this->element('some_element') ?>, and may be done this way:

    <?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');
    }
    
    0 讨论(0)
  • 2020-12-17 21:36

    Easy:

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

    Also:

    DON'T DO THAT ANYMORE!!!

    0 讨论(0)
提交回复
热议问题