2013-04-18 13 views
9

próbuję dowiedzieć się, jak korzystać z jednego z moich widoków elementów wewnątrz kontrolera ...CakePHP: Jak używać elementu widok wewnątrz kontrolera

Wiem, wiem: " Nie rób tego! " (99% czasu jest poprawną odpowiedzią)

Ale myślę, że mam naprawdę dobry powód. Akcja obsługuje żądanie AJAX, które zwraca znaczniki. Zwrócony znacznik to lista, którą wyświetlam wszędzie za pomocą elementu. Tak więc, starając się zachować mój kod DRY, myślę, że należy to zrobić tutaj.

Czy to możliwe?

Odpowiedz

20

proste:

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

również:

nie rób tego więcej !!!

+2

lol yes sir !!!! –

+1

NIGDY NIE ZROBIĆ! Czy możesz wyjaśnić, dlaczego nie używać? –

+0

Przerywa przepływ danych w wzorcu MVC, którego używa program cakephp. tj. kontroler nie powinien mieć dostępu do widoku, ponieważ model nie powinien mieć dostępu do kontrolera, a widok nie powinien mieć dostępu do modelu. To zapewnia, że ​​wszystko idzie "ładnie" przepływa –

2

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

1

Należy użyć szablonu po stronie klienta. Powinieneś nigdy zwrócić mark-up z usługi internetowej lub API, tylko dane. Poproś JavaScript o pobranie danych, a następnie sformatuj je według własnego uznania.

Na przykład:

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

Jest to tylko przykład odpisane mankiet. Oczywiście musisz napisać własną implementację.

+0

Niekoniecznie się z tobą nie zgadzam, ale dlaczego powinienem/powinnam * nigdy nie zwracać marży od usługi internetowej/interfejsu API? Problem z wysłaniem danych w tej sytuacji polega na tym, że żadna magia tortu nie jest dostępna, jeśli buduję znaczniki w javascript (prawdopodobnie w callbacku 'success()'). Będę przepisywać cały ten sam kod i utrzymywać go w dwóch różnych miejscach. To też nie wydaje się idealne. – emersonthis

+0

Rozdzielanie wątpliwości. Jeśli używasz tego samego interfejsu API w wielu miejscach, umieść szablon w funkcji i zamiast tego wywołaj tę funkcję. Co się stanie, jeśli chcesz zmienić marżę wygenerowaną w jednej części aplikacji, a nie drugą? Co się stanie, jeśli chcesz, aby dane wypłynęły jako JSON za pośrednictwem interfejsu API? Co jeśli ktoś inny chce użyć twojego API? Wypluj HTML nigdy nie jest dobrym pomysłem. –

+0

Uwielbiam rozdzielać obawy, ale czy używanie elementów NIE pozwala na ich zachowanie osobno? Nadal nie mam pojęcia, jak to zrobić, bez A) odesłania z powrotem znaczników lub B) utrzymywania dwóch zduplikowanych bloków tego samego znacznika (jeden jako javascript, a drugi jako PHP używany gdzie indziej). Czy czegoś brakuje? – emersonthis

0

Sposób, w jaki robiłam obsługę ajaxów w Cakeu, polegał na posiadaniu własnego kontrolera AjaxController. Każda interakcja typu ajaxowego idzie tam, która z kolei używa własnych widoków (i wyświetla cząstki/elementy). W ten sposób możesz trzymać swój kod w stanie DRY i izolować i propagować wszystkie przypadki użycia ajaxa.

Przykład fragment:

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

Oto źródło: https://github.com/Sobient/dosspirit/blob/master/app/Controller/AjaxController.php

5

Czasami trzeba uczynić element CakePHP z widokiem i wstrzyknąć jej zawartości do strony za pomocą Ajax ten sam czas. W tym przypadku renderowania elementu jako zwykły widok z kontrolerem jest lepsze niż tworzenie dedykowanego pogląd, że tylko zawiera <?php echo $this->element('some_element') ?>, i mogą być wykonane w ten sposób:

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

wiem, że to jest stary pytanie oraz inne osoby zostały już podane zasadniczo taka sama odpowiedź, ale chcę podkreślić, że to podejście (dostarczone przez 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'); 
} 

... nie jest to hacky obejście, ale w rzeczywistości jest zalecane podejście z CakePHP docs w tym powszechnym i uzasadnionym przypadku użycia:

Jeśli $ view zaczyna się od "/", przyjmuje się, że jest to plik widoku lub elementu w odniesieniu do folderu/app/View. Umożliwia to bezpośrednie renderowanie elementów bardzo przydatnych w wywołaniach AJAX.

(znowu: Credit Serge S. kodu powyżej)

Powiązane problemy