Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zend framework - dziedzicznie
Forum PHP.pl > Forum > Przedszkole
kielich
Witam,
Mam pewien problem napisałem sobie logowanie tworzyłem nowy kontroler i akcja dzieje sie w auth/login
czyli w widoku login.phtml moge sobie wyswietlic dane
Ale potrzebuje te dane wyswietlic jeszcze w głównym kontrolerze IndexController wiec musze jakość dziedziczyć dane jak mogę tego dokonać? Próbowałem na wiele sposobów ale jakoś mi to nie wychodzi

mam
  1. class IndexController extends Zend_Controller_Action
  2. {
  3. ...
  4. }
  5.  


no i

  1. class AuthController extends Zend_Controller_Action
  2. {
  3. ...
  4. }
  5.  

i właśnie jakoś w IndexController muszę mieć zasięg do danych z AuthController
Wiem że to banał. No ale jakoś nie mam pomysłu

będę wdzięczny za wszystkie odpowiedzi
mortus
Użyj Zend_Registry::set('nazwa_parametru', $wartosc_parametru), żeby zapisać dane i Zend_Registry::get('nazwa_parametru'), żeby odczytać. Wszystko dzieje się w pliku kontrolera, a nie w pliku widoku.
kielich
mortus znowu ty super smile.gif exclamation.gif

OK wiec tak, potrzebuje wyświetlić w widoku informacje no ale ok.


chce to użyć w taki sposób
AuthController
  1. Zend_Registry::set('auth', $this->view->auth= $auth);


no i w IndexController
  1. Zend_Registry::get('auth');


ale nie wiem czy tak można czy jest to dobre rozwiązanie
mortus
Załóżmy, że w bazie danych mamy tabelę users, a w niej pola: id, username, password. Plik kontrolera autoryzacji wygląda tak:
  1. <?php
  2. // application/controllers/AuthController.php
  3. class AuthController extends Zend_Controller_Action {
  4. public function loginAction() {
  5. $this->view->title = 'Login';
  6. if(Zend_Auth::getInstance()->hasIdentity()) { // jeśli jesteśmy zalogowani, to następuje przekierowanie do kontrolera index i akcji index
  7. $this->_redirect('index/index');
  8. }
  9. $form = new Form_LoginForm(); // tworzymy nowy formularz
  10. $request = $this->getRequest();
  11. if($request->isPost()) { // jeśli wysłaliśmy formularz to:
  12. if($form->isValid($request->getPost())) { //sprawdzamy, czy został on prawidłowy wypełniony
  13. $authAdapter = $this->getAuthAdapter(); //ustawiamy silnik autoryzacji
  14. $username = $form->getValue('username'); // pobieramy dane z formularza
  15. $password = $form->getValue('password');
  16. $authAdapter->setIdentity($username)
  17. ->setCredential($password); //przepisujemy dane do adaptera
  18. $auth = Zend_Auth::getInstance(); //pobieramy instancję Zend_Auth
  19. $result = $auth->authenticate($authAdapter); //i uwierzytelniamy
  20. if($result->isValid()) { // jeśli uwierzytelnianie się powiedzie to:
  21. $identity = $authAdapter->getResultRowObject(); //do $identity zapisujemy dane użytkownika
  22. $this->view->identity = $identity; //które możemy przepisać do pliku widoku
  23. $authStorage = $auth->getStorage();
  24. $authStorage->write($identity); //dane zapisujemy w pamięci Zend_Auth
  25. $this->_redirect('index/index'); // w tym przypadku następuje przekierowanie do kontrolera index i akcji index
  26. } else {
  27. $this->view->errorMessage = 'Username or password is wrong!';
  28. }
  29. }
  30. }
  31. $this->view->form = $form;
  32. }
  33. public function logoutAction() {
  34. Zend_Auth::getInstance()->clearIdentity();
  35. $this->_redirect('index/index');
  36. }
  37. private function getAuthAdapter() {
  38. $authAdapter = new Zend_Auth_Adapter_DbTable(Zend_Db_Table::getDefaultAdapter());
  39. $authAdapter->setTableName('users')
  40. ->setIdentityColumn('username')
  41. ->setCredentialColumn('password');
  42. return $authAdapter;
  43. }
  44. }
W Bootstraperze tworzymy nową metodę _init:
  1. <?php
  2. // application/Bootstrap.php
  3. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
  4. ...
  5. protected function _initIdentity() {
  6. if(Zend_Auth::getInstance()->hasIdentity()) {
  7. Zend_Registry::set('username', Zend_Auth::getInstance()->getStorage()->read()->username);
  8. } else {
  9. Zend_Registry::set('username', 'guest');
  10. }
  11.  
  12. }
  13. ...
  14. }
Teraz w IndexController.php mamy dostęp do nazwy użytkownika poprzez Zend_Registry::get('username'). Oczywiście w metodzie _initIdentity() w Bootstraperze możemy zapisać w rejestrze również inne dane pochodzące z tabeli users.
kielich
Mój AuthController wyglada tak
  1. <?php
  2.  
  3. class AuthController extends Zend_Controller_Action
  4. {
  5. function init()
  6. {
  7. $this->initView();
  8. $this->view->baseUrl = $this->_request->getBaseUrl();
  9. }
  10.  
  11.  
  12. function indexAction()
  13. {
  14. $this->_redirect('/');
  15. }
  16.  
  17. function loginAction()
  18. {
  19. $auth = Zend_Auth::getInstance();
  20. $view->auth = $auth;
  21. $information = '';
  22. if ($this->_request->isPost()) {
  23.  
  24. Zend_Loader::loadClass('Zend_Filter_StripTags');
  25. $filter = new Zend_Filter_StripTags();
  26. $username = $filter->filter($this->_request->getPost('username'));
  27. $password = $filter->filter($this->_request->getPost('password'));
  28.  
  29. if (empty($username)) {
  30. $this->view->message = 'Please provide a username.';
  31. } else {
  32.  
  33. Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
  34. $db = Zend_Registry::get('db');
  35. $authAdapter = new Zend_Auth_Adapter_DbTable($db);
  36. $authAdapter->setTableName('user');
  37. $authAdapter->setIdentityColumn('username');
  38. $authAdapter->setCredentialColumn('password');
  39.  
  40. $authAdapter->setIdentity($username);
  41. $authAdapter->setCredential($password);
  42.  
  43.  
  44. $result = $auth->authenticate($authAdapter);
  45. if ($result->isValid()) {
  46.  
  47.  
  48. $data = $authAdapter->getResultRowObject(null, 'password');
  49.  
  50. $information= 'Jesteś zalogowany jako <strong>' . $auth->getIdentity() . '</strong>.';
  51.  
  52.  
  53. } else {
  54. // failure: clear database row from session
  55. $information= 'asdsad';
  56. }
  57.  
  58. }
  59. }
  60.  
  61. $this->view->title = "Log in";
  62. $this->view->information = $information;
  63. $this->view->auth= $auth;
  64. Zend_Registry::set('auth', $this->view->auth= $auth);
  65. }
  66.  
  67. function logoutAction()
  68. {
  69. Zend_Auth::getInstance()->clearIdentity();
  70. $this->_redirect('/');
  71. }
  72. }


no i po dodaniu do Bootstrapa dostaje taki błąd
Kod
Notice: Trying to get property of non-object in C:\wamp\www\zf-tutorial\application\Bootstrap.php on line 31
Message: No entry is registered for key 'auth'
mortus
Zamień linię 64
  1. Zend_Registry::set('auth', $this->view->auth= $auth);
na
  1. Zend_Registry::set('auth', $auth);

i poinformuj o wynikach.
EDIT:
Przyjrzę się bliżej rano, bo dzisiaj już nie myślę.
kielich
0 rezultatów nawet jak linijkę 64 usunę . sad.gif
mortus
Zatem sprawdziłem Twój sposób i okazuje się, że w AuthController.php nie działa
  1. Zend_Registry::set('auth', $auth);
Na razie nie wiem, dlaczego tak jest, ale zaproponuję pewne rozwiązanie. W Bootstrap.php zrób nową metodę _init, jak poniżej.
  1. ...
  2. protected function _initIdentity() {
  3. if(Zend_Auth::getInstance()->hasIdentity()) {
  4. Zend_Registry::set('auth', Zend_Auth::getInstance());
  5. }
  6. }
  7. ...
Teraz wszystko powinno działać.
Pozdrawiam
kielich
zrobiłem tak jak pisałeś no i kiedy w index.phtml daje

  1. <?php
  2. if ($this->auth->hasIdentity()) {
  3. echo 'Użytkownik zalogowany jako:'.$this->auth->getIdentity();
  4. echo '<a href='.$this->baseUrl.'/auth/logoute>Wyloguj sidę </oa>';
  5. } else {[
  6. echo 'asdsadoiasjdoiad';
  7. }
  8. ?>

dostaje
Kod
Fatal error: Call to a member function hasIdentity() on a non-object in ....

mortus
IndexController.php
  1. public function indexAction() {
  2. $auth = Zend_Registry::get('auth');
  3. if($auth->hasIdentity()) {
  4. $identity = $auth->getIdentity();
  5. }
  6. $this->view->identity = $identity;
  7. }
index.phtml
  1. echo $this->identity;
Z założenia wzorca MVC wszystkie operacje powinny być wykonywane w kontrolerze, natomiast plik widoku służy tylko do wyświetlenia odpowiednich danych w odpowiedni sposób.
kielich
dalej nie działa cały czas dostaje

Kod
Message: No entry is registered for key 'auth'
mortus
Pokaż jeszcze raz wszystkie pliki: Bootstrap.php, AuthController.php, IndexController.php i index.phtml. Znajdziemy rozwiązanie!
kielich
Boostrap
  1. <?php
  2.  
  3. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  4.  
  5. {
  6.  
  7. protected function _initPlaceholders()
  8.  
  9. {
  10.  
  11. $this->bootstrap('View');
  12. $view = $this->getResource('View');
  13.  
  14. //Typ pliku
  15. $view->doctype('XHTML1_STRICT');
  16. //ustawiam meta tagi
  17. $view->headMeta()->appendName('keywords', 'slowa kluczowe ');
  18. $view->headMeta()->appendHttpEquiv('Content-Type','text/html; charset=UTF-8');
  19. $view->headMeta()->appendHttpEquiv('Content-Language', 'pl-PL');
  20. //nazwa
  21. $view->headTitle('nazwa strony')->setSeparator(' :: ');
  22.  
  23.  
  24.  
  25. }
  26. }

IndexController
  1. <?php
  2.  
  3. class IndexController extends Zend_Controller_Action
  4. {
  5.  
  6. public function init()
  7. {
  8. $Ocena = new Application_Model_DbTable_Ocena();
  9. $this->view->Ocena = $Ocena->getLosowaOcena();
  10.  
  11. $loginForm = new Application_Form_Logowanie();
  12. $this->view->loginForm = $loginForm->setView();
  13.  
  14. }
  15. function indexAction()
  16. {
  17. $this->view->title = "Informacje";
  18. $this->view->headTitle($this->view->title);
  19.  
  20. $kupic = new Application_Model_DbTable_Rs();
  21. $this->view->kupic = $kupic->fetchRow()->kupic;
  22.  
  23. $gw = new Application_Model_DbTable_Rs();
  24. $this->view->gw= $gw->fetchRow()->gwarancja;
  25.  
  26. $platnosci = new Application_Model_DbTable_Rs();
  27. $this->view->platnosci = $platnosci->fetchRow()->platnosc;
  28.  
  29. $blokada = new Application_Model_DbTable_Rs();
  30. $this->view->blokada = $blokada->fetchRow()->blokada;
  31.  
  32. $auth = Zend_Registry::get('auth');
  33. if($auth->hasIdentity()) {
  34. $identity = $auth->getIdentity();
  35. }
  36. $this->view->identity = $identity;
  37.  
  38.  
  39.  
  40. }
  41.  
  42.  
  43. }

no i widok index to sobie wyswietlam
  1. <?php echo $this->identity; ?>
mortus
Cytat(mortus @ 25.02.2010, 09:33:34 ) *
  1. ...
  2. protected function _initIdentity() {
  3. if(Zend_Auth::getInstance()->hasIdentity()) {
  4. Zend_Registry::set('auth', Zend_Auth::getInstance());
  5. }
  6. }
  7. ...
A gdzie to masz w Bootstrap.php?!
Oczywiście bez trzech kropek!
kielich
No mam mam to napisałem podstawową moją wersje bez twojego kodu no ale nadal nie dział sad.gif dodam jeszcze mój AuthController

  1. <?php
  2.  
  3. class AuthController extends Zend_Controller_Action
  4. {
  5. function init()
  6. {
  7. $this->initView();
  8. $this->view->baseUrl = $this->_request->getBaseUrl();
  9. }
  10.  
  11.  
  12. function indexAction()
  13. {
  14. $this->_redirect('/');
  15. }
  16.  
  17. function loginAction()
  18. {
  19. $auth = Zend_Auth::getInstance();
  20. $view->auth = $auth;
  21. $information = '';
  22. if ($this->_request->isPost()) {
  23.  
  24. Zend_Loader::loadClass('Zend_Filter_StripTags');
  25. $filter = new Zend_Filter_StripTags();
  26. $username = $filter->filter($this->_request->getPost('username'));
  27. $password = $filter->filter($this->_request->getPost('password'));
  28.  
  29. if (empty($username)) {
  30. $this->view->message = 'Please provide a username.';
  31. } else {
  32.  
  33. Zend_Loader::loadClass('Zend_Auth_Adapter_DbTable');
  34. $db = Zend_Registry::get('db');
  35. $authAdapter = new Zend_Auth_Adapter_DbTable($db);
  36. $authAdapter->setTableName('user');
  37. $authAdapter->setIdentityColumn('username');
  38. $authAdapter->setCredentialColumn('password');
  39.  
  40.  
  41. $authAdapter->setIdentity($username);
  42. $authAdapter->setCredential($password);
  43.  
  44.  
  45.  
  46. $result = $auth->authenticate($authAdapter);
  47. if ($result->isValid()) {
  48.  
  49. $data = $authAdapter->getResultRowObject(null, 'password');
  50.  
  51. $information= 'Jesteś zalogowany jako <strong>' . $auth->getIdentity() . '</strong>.';
  52.  
  53.  
  54. } else {
  55.  
  56. $information= 'asdsad';
  57. }
  58.  
  59. }
  60. }
  61.  
  62. $this->view->title = "Log in";
  63. $this->view->information = $information;
  64.  
  65.  
  66. }
  67.  
  68. function logoutAction()
  69. {
  70. Zend_Auth::getInstance()->clearIdentity();
  71. $this->_redirect('/');
  72. }
  73. }
mortus
Zmień funkcję:
  1. protected function _initIdentity() {
  2. if(Zend_Auth::getInstance()->hasIdentity()) {
  3. Zend_Registry::set('auth', Zend_Auth::getInstance());
  4. }
  5. }
na
  1. protected function _initIdentity() {
  2. Zend_Registry::set('auth', Zend_Auth::getInstance());
  3. }
Banał. Chodziło o to, że instancję obiektu Zend_Auth zapisywaliśmy w rejestrze, tylko wtedy, gdy użytkownik był zalogowany. A co się dzieje, kiedy użytkownik nie jest zalogowany?
kielich
Kurcze po raz kolejny mi pomogłeś ( tak szczerze ) smile.gif Wielkie dzięki
Mam jeszcze pytanie teoretyczne mianowicie czy możesz mi wytłumaczyć dokładnie co to jest i jak działa ta cześć kodu :
  1. $auth = Zend_Registry::get('auth');
  2. if($auth->hasIdentity()) {
  3. ...
  4. }

  1. protected function _initIdentity() {
  2. Zend_Registry::set('auth', Zend_Auth::getInstance());
  3. }


Tzn wiem jak działa ale tak po naszemu. A co dokładnie oznaczają funkcje chodzi mi o wyjaśnienie bardziej zaawansowane
mortus
Zend_Registry to nic innego jak rejestr aplikacji opartej o Zend Framework. Można powiedzieć, że jest to specyficzny rodzaj pamięci, w której możemy zapisywać dane, i z której te dane możemy pobierać. Cechą Zend_Registry jest fakt, że każda aplikacja Zend Framework może posiadać tylko jeden taki rejestr (klasa Zend_Registry jest singletonem). Do zapisywania w pamięci służy metoda set('nazwa_klucza', $wartosc_klucza), a do pobierania służy metoda get('nazwa_klucza'). Zend_Registry przypomina nieco sesję, ale nie jest to dokładnie to samo. Dla przykładu:
  1. $_SESSION['nazwa_klucza'] = $wartosc_klucza;
  2. Zend_Registry::set('nazwa_klucza', $wartosc_klucza);
oba polecenia zapiszą nam $wartosc_klucza z tym, że pierwsze zapisze wartość klucza w tablicy $_SESSION pod indeksem nazwa_klucza, a drugie zapisze wartość klucza w specjalnym kontenerze (rejestrze) również pod indeksem nazwa_klucza. W obu przypadkach dane możemy pobrać:
  1. $zmienna = $_SESSION['nazwa_klucza'];
  2. $zmienna = Zend_Registry::get('nazwa_klucza');
i powtórnie wykorzystać.
kielich
OK czyli już np. do innej zmiennej nie mogę użyć Zend_Registry??
mortus
Możesz. Zend_Registry jest "jak tablica", w której pod różnymi indeksami mogą znajdować się różne wartości. Możemy np. przechowywać w rejestrze kilka różnych informacji, jak niżej.
  1. Zend_Registry::set('lang', $lang);
  2. Zend_Registry::set('username', $username);
Informację te w żaden sposób nie wchodzą ze sobą w konflikt ani też nie są ze sobą powiązane, a łączy je tylko przynależność do jednego, konkretnego rejestru.
kielich
Ok wielkie dzięki za wszystko teraz już rozumiem
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.