Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework]Zend Framework $this-> w widoku.
rnest
post 26.08.2014, 23:38:16
Post #1





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 26.04.2014

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
by_ikar
post 27.08.2014, 08:38:37
Post #2





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
freemp3
post 27.08.2014, 09:20:49
Post #3





Grupa: Zarejestrowani
Postów: 467
Pomógł: 77
Dołączył: 6.09.2008
Skąd: Miechów / Kraków

Ostrzeżenie: (0%)
-----


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. }




--------------------
Niemożliwym jest stworzenie czegokolwiek idiotoodpornego, ponieważ idioci są wyjątkowo pomysłowi.

https://www.aroch.pl
https://themeforest.net/user/aroch
https://www.astroblog.aroch.pl
https://www.4geeks.pl
Go to the top of the page
+Quote Post
rnest
post 27.08.2014, 13:27:35
Post #4





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 26.04.2014

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
Turson
post 27.08.2014, 13:43:58
Post #5





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


Tak, wtedy z widoku masz dostęp klasy renderującej.
Go to the top of the page
+Quote Post
rnest
post 28.08.2014, 20:39:08
Post #6





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 26.04.2014

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Turson
post 29.08.2014, 07:35:43
Post #7





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

Ostrzeżenie: (0%)
-----


http://anantgarg.com/2009/03/13/write-your...amework-part-1/
Go to the top of the page
+Quote Post
rnest
post 30.08.2014, 18:07:53
Post #8





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 26.04.2014

Ostrzeżenie: (0%)
-----


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ę.

Ten post edytował rnest 30.08.2014, 18:09:07
Go to the top of the page
+Quote Post
Daimos
post 31.08.2014, 17:35:46
Post #9





Grupa: Zarejestrowani
Postów: 1 319
Pomógł: 118
Dołączył: 26.11.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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ć.


--------------------
scriptun.com. Startup z poradnikami do gier ttp.zone i ttpzone.pl
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 22.09.2024 - 10:07