Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Zend Framework $this-> w widoku.
Forum PHP.pl > Forum > PHP > Frameworki
rnest
Pytanie do bardziej doświadczonych. Jak zaimplementować w widoku widoczność zmiennych z kontrolera. Nie chodzi mi o to jak przekazać wartość zmiennej z kontrolera do widoku, np. w Zendzie, ale jaki mechanizm to wykonuje i jak.
Interesuje mnie sam sposób w jaki jest to uzyskane. Interesuję się nieco szkieletami PHP od strony technicznej i nie bardzo wiem, jak jest ta wspaniała właściwość osiągalna.
Pewne elementy niezbędne do napisania własnego MVC już opanowałem, ale powyższa sztuka, jest dla mnie niewiadomą...
Proszę o wsparcie. Pozdrawiam.
by_ikar
Nie wiem dokładnie jak to ma miejsce w przypadku zenda i zend_view, ale mniej więcej jest to podobnie zrobione we wszystkich modułach/komponentach tego typu. Tutaj masz na przykładzie templatingu z symfony: https://github.com/symfony/Templating/blob/...Engine.php#L144 po prostu przy pomocy extract z tablicy parametrów które przekazujesz, są one ekstraktowane tuż przed includowanym plikiem, dzięki czemu możesz ich użyć w szablonie.
freemp3
Ogólnie zasada jest bardzo prosta. Tworzysz sobie klasę, w której implementujesz metody magiczne takie jak: __set, __get, __isset oraz __unset. Dodatkowo dodajesz metodę odpowiadającą za wyświetlanie, w której dołączasz plik z widokiem. Dzięki temu będziesz się mógł w nim odwoływać do zmiennych przy pomocy $this.

Cała sztuszka polega właśnie na odpowiednim zaimplementowaniu wcześniej wymienionych metod. To gdzie będziesz przetrzymywał zmienne, już zależy tylko od Ciebie. Zend na przykład zapisuje je bezpośrednio w obiekcie, z tym że nazwa zmiennej nie może mieć podkreślenia na początku (zabezpieczenie przed nadpisaniem pól obiektu):
  1. public function __set($key, $val)
  2. {
  3. if ('_' != substr($key, 0, 1)) {
  4. $this->$key = $val;
  5. return;
  6. }
  7.  
  8. require_once 'Zend/View/Exception.php';
  9. $e = new Zend_View_Exception('Setting private or protected class members is not allowed');
  10. $e->setView($this);
  11. throw $e;
  12. }


rnest
Serdeczne dzięki. Spróbuję odtworzyć na małą skalę. Dziękuję i pozdrawiam.

Czyli tak. Jeżeli inkluduję w metodzie klasy plik z widokiem, to jest on niejako wewnątrz metody i siłą rzeczy pola klasy i metody mogą być w tym widoku użyte... Czyli np. tak:
Plik z kontrolerem:
  1. abstract class Lib_Controller {
  2. protected $name = '';
  3.  
  4. public function __construct() {
  5. $this->setName();
  6. }
  7.  
  8.  
  9. public function getName(){
  10. return $this->name;
  11. }
  12.  
  13. private function setName(){
  14. $ref = new ReflectionClass(get_called_class());
  15. $this->name = $ref->getName();
  16. }
  17.  
  18. public function render(){
  19. $GLOBALS['text'] = 'Jestem ' . $this->name;
  20. include_once 'views/index.php';
  21. }
  22.  
  23.  
  24. }


Plik z widokiem:

  1. <!DOCTYPE html>
  2. <!--
  3. To change this license header, choose License Headers in Project Properties.
  4. To change this template file, choose Tools | Templates
  5. and open the template in the editor.
  6. -->
  7. <html>
  8. <head>
  9. <meta charset="UTF-8">
  10. <title></title>
  11. </head>
  12. <body style="background: orange;">
  13. <?php
  14.  
  15. echo $this->getName();
  16.  
  17. ?>
  18. </body>
  19. </html>
  20.  
Turson
Tak, wtedy z widoku masz dostęp klasy renderującej.
rnest
A jak zgodnie z MVC do kontrolera Lib_Controller podpiąć model? Czy ustanowić odrebną klasę modelu(to chyba konieczne) i wywołać ją w kontrolerze?
rnest
Dzięki, Turson. Jeszcze tylko techniczne pytanie. Jak można skłonić np. NetBeans'a, aby podpowiadał w inkludowanym (w metodzie) widoku zadeklarowane pola i metody. Rozumiem, że przy implementacji metod magicznych, powiedzmy gettery i settery bądą niewidoczne, bo mogą być fizycznie nie zaimplementowane. Ale przecież pewne metody będą i pola również. Chodzi o to, aby w kodzie widoku $this-> dawała podpowiedzi. Po prostu z wygody, aby nie wędrować np. do skryptu z klasą jak się zapomni jakąś nazwę.
Daimos
Z tego co wiem, to w widokach nie ma takiej możliwości. Netbeans nie jest w stanie określić, jaka klasa korzysta z danego widoku i chyba ciężko byłoby mu dojść do tego, czym jest $this wink.gif
Ale nic straconego, jeśli bardzo Ci na tym zależy, dodaj sobie w pliku widoku, na samej górze deklaracje $this i problem obejdziesz:
  1. /* @var $this Zend_View */

Problem w tym, że jest to i tak mało użyteczne, bo wszystkie zmienne i helpery są tworzone przez magiczne metody, więc nie wiem do czego Ci się to może przydać.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.