Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] Trying to get property of non-object
Forum PHP.pl > Forum > PHP > Frameworki
egger
Witam, jestem nowicjuszem w kohanie, także proszę o wyrozumiałość wink.gif Zrobiłem sobie prosty moduł logowania Auth.
Kontroler Default:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. class Controller_Default extends Controller_Template {
  4.  
  5. public $template = 'default'; //domyslny widok
  6.  
  7. public function __construct(Request $request, Response $response) {
  8. parent::__construct($request, $response);
  9. } //konstruktor - tutaj nic nie robi, mozna wywalic
  10.  
  11. public function before() {
  12. parent::before();
  13. if ($this->auto_render)
  14. {
  15. // Initialize empty values - ktore wypelnia sie w index i after
  16. //dlaczego tu a nie w index?
  17. //bo tutaj sa ladowane automatycznie przy kazdej metodzie (jak jest auto render)
  18. $this->template->title = '';
  19. $this->template->description = '';
  20. $this->template->content = '';
  21.  
  22. $this->template->styles = array();
  23. $this->template->scripts = array();
  24. $this->template->top_tab = '';
  25. }
  26. }
  27.  
  28. public function after() {
  29. if ($this->auto_render)
  30. {
  31. $styles = array(
  32. 'media/css/templatemo_style.css' => 'screen',
  33. );
  34.  
  35. $scripts = array(
  36. 'media/js/jquery-1.5.1.min.js',
  37. );
  38.  
  39. $this->template->styles = array_merge( $this->template->styles, $styles );
  40. $this->template->scripts = array_merge( $this->template->scripts, $scripts );
  41. $this->template->description='Tu jest opis stronki który powinien mieć długość do 170 znaków.';
  42. //tu wsadza sie zmienne ktore pasuja do kazdej metody tego kontrolera
  43. }
  44. parent::after();
  45. }
  46.  
  47. public function action_index() {
  48. $this->template->title = __('Home'); //taki zapis gdy korzystasz z i18n
  49. $this->template->content='home';
  50. $this->template->top_tab='home';
  51. }
  52. }

Kontroler User:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. class Controller_User extends Controller_Default { //dziedziczenie z Controller_Template
  4.  
  5. public $template = 'user/main'; //definiowanie zmiennej do obsługi widoków
  6.  
  7. public function action_index(){
  8. $auth = Auth::instance(); //utworzenie instancji obiektu Auth
  9. $auth->get_user(); //pobieranie danych o zalogowanym użytkowniku
  10.  
  11. if ($auth->logged_in('login')){ //sprawdzanie czy użytkownik jest zalogowany
  12. //jeśli jest to dopuszczamy (to sekcja dla zalogowanych)
  13.  
  14. $this->template->wiadomosc = "Witaj $auth->username!<br />Jesteś zalogowany.";
  15. //i cała reszta kodu dla autoryzowanego użytkownika
  16.  
  17. }else{ //jeśli nie jest zalogowany, przekierowujemy do logowania
  18. $this->request->redirect('user/login'); //jeśli nie, przekierowujemy do logowania
  19. }
  20. }
  21.  
  22. public function action_register(){
  23. $this->template = 'user/register'; //załadowanie widoku
  24. $auth = Auth::instance(); //utworzenie instancji obiektu Auth
  25.  
  26. if ($auth->logged_in('login')){ //sprawdzanie czy użytkownik jest zalogowany
  27. $this->request->redirect('user'); //jeśli tak, przekierowujemy do maina
  28. }else{
  29.  
  30. if($_POST){ //sprawdzanie czy dane są przesyłane POSTem
  31. $walidacja = new Validate($_POST); //tworzenie obiektu walidacji
  32. $walidacja->rule('login', 'not_empty')
  33. ->rule('login', 'alpha_dash')
  34. ->rule('email', 'not_empty')
  35. ->rule('haslo', 'not_empty')
  36. ->rule('email', 'email');
  37.  
  38. if($walidacja->check()){
  39. $user = ORM::factory('user'); //tworzenie obiektu ORM z użyciem tabeli users
  40. $user->username = $_POST['login']; //przypisanie pola z formularza do nazwy kolumny w tabeli
  41. $user->email = $_POST['email'];
  42. $user->password = $_POST['haslo'];
  43.  
  44. //instrukcja warunkowa/zapis danych użytkownika/przypisanie roli "login"
  45. if($user->save() && $user->add('roles', ORM::factory('role', array('name' => 'login'))) ){
  46. $this->template->sukces = 'Dziękujemy za rejestrację!'; //przekazanie zmiennej $sukces do widoku
  47. }else{
  48. $this->template->fail = 'Nie udało się dodać użytkownika!'; //przekazanie zmiennej $fail do widoku
  49. }
  50. }else{
  51. $this->template->fail = 'Uzupełnij poprawnie formularz rejestracyjny!';
  52. }
  53. }
  54. }
  55. }
  56.  
  57. public function action_login(){
  58. $this->template ='user/login';
  59. $auth = Auth::instance(); //utworzenie instancji obiektu Auth
  60.  
  61. if ($auth->logged_in('login')){ //sprawdzanie czy użytkownik jest zalogowany
  62. $this->request->redirect('user'); //jeśli jest, przekierowujemy do user
  63. }else{
  64. if($_POST){
  65. $walidacja = new Validate($_POST); //tworzenie obiektu walidacji
  66. $walidacja->rule('login', 'not_empty')
  67. ->rule('login', 'alpha_dash')
  68. ->rule('haslo', 'not_empty');
  69.  
  70. if($walidacja->check()){ //jeśli walidacja OK to zaloguj
  71. $auth->login($_POST['login'], $_POST['haslo'], FALSE); //logowanie użytkownika
  72. $this->request->redirect('user'); //przekierowanie po zalogowaniu do kontrolera user
  73. }else{
  74. $this->template->fail = 'Uzupełnij poprawnie formularz!';
  75. }
  76.  
  77. }
  78.  
  79. }
  80. }
  81.  
  82. public function action_logout(){
  83. $this->template = View::factory('user/login');
  84. $auth = Auth::instance(); //utworzenie instancji obiektu Auth
  85. if ($auth->logged_in('login')){ //sprawdzanie czy użytkownik jest zalogowany
  86. if($auth->logout(TRUE)){ //jeśli jest, to go wylogowujemy
  87. $this->template->sukces = 'Pomyślnie wylogowano!';
  88. }else{
  89. $this->request->redirect('user/login'); //przekierowujemy do logowania
  90. }
  91. }else{ //jeśli nie jest zalogowany przekierowujemy do logowania
  92. $this->request->redirect('user/login');
  93. }
  94. }
  95. }
  96. ?>


W kontrolerze default:
  1. $this->template->styles = array_merge( $this->template->styles, $styles );

Wywala błąd:
Cytat
Trying to get property of non-object

template to obiekt, template->styles to tablica, $styles to tablica.

Wszelkie inne sugestie co do kodu również mile widziane, nie wszystko jeszcze rozumiem do końca wink.gif
matino
Pokaż może jeszcze widok dla kontrolera default.
egger
Widok default: (jako kod php, żeby było wdoczne to co jest istotne)
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  5. <meta http-equiv="Content-Language" content="<?php echo I18n::$lang ?>"/>
  6. <meta name="robots" content="index, follow" />
  7. <meta name="description" content="<?php echo $description ?>" />
  8. <link type="image/x-icon" href="<?php echo URL::base() ?>media/img/favicon.ico" rel="shortcut icon" />
  9. <title><?php echo 'Kohana - '.$title ?></title>
  10. <?php foreach ($styles as $file => $type) echo HTML::style($file, array('media' => $type)), "\n" ?>
  11. <?php foreach ($scripts as $file) echo HTML::script($file), "\n" ?>
  12.  
  13. <script language="javascript" type="text/javascript">
  14. function clearText(field)
  15. {
  16. if (field.defaultValue == field.value) field.value = '';
  17. else if (field.value == '') field.value = field.defaultValue;
  18. }
  19. </script>
  20. </head>
  21. <body>
  22. <div id="templatemo_header_wrapper">
  23. <!-- Free Web Templates by TemplateMo.com -->
  24. <div id="templatemo_header">
  25.  
  26. <div id="site_logo"></div>
  27.  
  28. <div id="templatemo_menu">
  29. <div id="templatemo_menu_left"></div>
  30. <ul>
  31. <li><a href="<?php echo URL::base() ?>" class="current">Home</a></li>
  32. <li><a href="<?php echo URL::base() ?>article">Articles</a></li>
  33. <li><a href="http://www.templatemo.com/page/2">Gallery</a></li>
  34. <li><a href="#">Company</a></li>
  35. <li><a href="#" class="last">Contact</a></li>
  36. </ul>
  37. </div> <!-- end of menu -->
  38.  
  39. </div> <!-- end of header -->
  40. </div> <!-- end of header wrapper -->
  41.  
  42. <div id="templatemo_banner_wrapper">
  43. <div id="templatemo_banner">
  44.  
  45. <div id="templatemo_banner_image">
  46. <div id="templatemo_banner_image_wrapper">
  47. <img src="<?php echo URL::base() ?>media/img/templatemo_image_01.jpg" alt="image 1" />
  48. </div>
  49. </div>
  50.  
  51. <div id="templatemo_banner_content">
  52. <div class="header_01">Lorem ipsum dolor sit amet, consectetur adipiscing elit. </div>
  53. <p>Aliquam dignissim elementum est sit amet iaculis. Integer pretium ultricies risus, condimentum molestie odio euismod vitae. </p>
  54. <div class="button_01"><a href="#">Read more</a></div>
  55. </div>
  56.  
  57. <div class="cleaner"></div>
  58. </div> <!-- end of banner -->
  59. </div> <!-- end of banner wrapper -->
  60.  
  61. <div id="templatemo_content_wrapper">
  62. <div id="templatemo_content">
  63. <?php include Kohana::find_file('views', $content);?>
  64. <div class="cleaner"></div>
  65. </div> <!-- end of content wrapper -->
  66. </div> <!-- end of content wrapper -->
  67.  
  68. <div id="templatemo_footer_wrapper">
  69.  
  70. <div id="templatemo_footer">
  71.  
  72. <div class="section_w180">
  73. <div class="header_05">Services</div>
  74. <div class="section_w180_content">
  75. <ul class="footer_menu_list">
  76. <li><a href="#">Lorem ipsum dolor</a></li>
  77. <li><a href="#">Cum sociis</a></li>
  78. <li><a href="#">Donec quam</a></li>
  79. <li><a href="#">Nulla consequat</a></li>
  80. <li><a href="#">In enim justo</a></li>
  81. </ul>
  82. </div>
  83. </div>
  84.  
  85. <div class="section_w180">
  86. <div class="header_05">About</div>
  87. <div class="section_w180_content">
  88. <ul class="footer_menu_list">
  89. <li><a href="#">Nullam quis</a></li>
  90. <li><a href="#">Sed consequat</a></li>
  91. <li><a href="#">Cras dapibus</a></li>
  92. <li><a href="#">Lorem ipsum dolor</a></li>
  93. <li><a href="#">Cum sociis</a></li>
  94. </ul>
  95. </div>
  96. </div>
  97.  
  98. <div class="section_w180">
  99. <div class="header_05">Cool links</div>
  100. <div class="section_w180_content">
  101. <ul class="footer_menu_list">
  102. <li><a href="#">Aenean vulputate</a></li>
  103. <li><a href="#">Etiam ultricies</a></li>
  104. <li><a href="#">Nullam quis</a></li>
  105. <li><a href="#">Sed consequat</a></li>
  106. <li><a href="#">Cras dapibus</a></li>
  107. </ul>
  108. </div>
  109. </div>
  110.  
  111. <div class="section_w180">
  112. <div class="header_05">Contact</div>
  113.  
  114. <div class="section_w180_content">
  115.  
  116. <ul class="footer_menu_list">
  117. <li><a href="#">Donec quam</a></li>
  118. <li><a href="#">Nulla consequat</a></li>
  119. <li><a href="#">In enim justo</a></li>
  120. <li><a href="#">Aenean vulputate</a></li>
  121. <li><a href="#">Etiam ultricies</a></li>
  122. </ul>
  123. </div>
  124. </div>
  125.  
  126. <div class="section_w180">
  127. <div class="header_05">Partners</div>
  128. <div class="section_w180_content">
  129. <ul class="footer_menu_list">
  130. <li><a href="http://www.templatemo.com" target="_parent">CSS Templates</a></li>
  131. <li><a href="http://www.flashmo.com" target="_parent">Flash Websites</a></li>
  132. <li><a href="http://www.templatemo.com/page/2" target="_parent">Website Templates</a></li>
  133. <li><a href="http://www.webdesignmo.com" target="_parent">Web Design Tips</a></li>
  134. <li><a href="http://www.photovaco.com" target="_blank">Free Stock Photos</a></li>
  135. </ul>
  136. </div>
  137. </div>
  138.  
  139. <div class="margin_bottom_20"></div>
  140. Copyright ? 2048 <a href="#">Your Company Name</a> | <a href="http://www.iwebsitetemplate.com" target="_parent">Website Templates</a> by <a href="http://www.templatemo.com" target="_parent">Free CSS Templates</a>
  141. <div class="cleaner"></div>
  142. </div> <!-- end of footer -->
  143. <!-- Free CSS Templates by TemplateMo.com -->
  144. </div> <!-- end of footer -->
  145. </body>
  146. </html>


Dodam, że /default/ działa bez problemu, błąd wyskakuje przy /login/
matino
W takim razie, w widoku zaszytym pod $template w akcji login, nie masz zmiennej styles().

PS. Tak na marginesie - walidacja powinna być przeprowadzana w modelu a nie kontrolerze smile.gif
egger
Można jaśniej?
Czy to oznacza, że w widoku do każdej akcji muszą być użyte wszystkie zmienne z obiektu $template?

Całość wygląda, jakby kontroler user przekształcał $template w coś, co nie jest obiektem.
mortus
Wrzuć linijkę:
  1. echo '<pre>'; print_r($this); echo '</pre>';
do kontrolera default tuż prze przypisywaniem stylów i zobacz, co Ci wypluje podczas logowania.
egger
  1. Controller_User Object
  2. (
  3. [template] => user\login


czyli tak jak myślałem, template przekształca się z obiektu w string.

W takim razie w jaki sposób w kontrolerze user załadować inny widok?
I w ogóle jak to możliwe, że w kontrolerze default $template jest na początku zapisana jako string z nazwą widoku, a potem działa jako obiekt, natomiast w kontrolerze user takie działanie nie jest możliwe?
mortus
Nie wiem, czy dobrze to rozumiesz. Klasa Controller_Template to klasa do obsługiwania szablonu (template) jako całej otoczki dla zawartości (content). Zawartość (content) natomiast to wyrenderowany widok wraz ze zmiennymi przekazanymi w kontrolerze. Zatem:
Controller_Default:
  1. Controller_Default extends Controller_Template {
  2.  
  3. public $template = 'default';
  4.  
  5. // ...
  6.  
  7. }

default.php (widok domyślny):
  1. <html>
  2. <!-- ... -->
  3. <?php echo $this->content; ?>
  4. <!-- ... -->
  5. </html>

Controller_User:
  1. Controller_User extends Controller_Default {
  2.  
  3. public function action_login() {
  4. $this->template->content = View::factory('user/login');
  5. }
  6.  
  7. }

Chcąc natomiast wykorzystać całkowicie nowy szablon (można by rzec "nadać stronie zupełnie nowy wygląd") musimy skorzystać z innego kontrolera niż Controller_Default i to w tym innym kontrolerze definiujemy jaki szablon (zmienna $template) chcemy wykorzystać.

Wszystko jest dosyć dobrze pokazane w tym tutorialu.
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.