Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] Nie widzi wartości zmiennej w metodach klasy
Forum PHP.pl > Forum > PHP > Frameworki
Max Damage
Cześć, mam dziwny problem, ale najpierw kod:
  1. class Profil_Controller extends Index_Controller {
  2. protected $id;
  3. protected $profil;
  4. public function __construct(){
  5. parent::__construct();
  6. $this->profil=new Profil_Model;
  7. $this->template->menu=new View('profil_menu');
  8. }
  9. public function index($index){
  10. if(!$this->auth->logged_in() || !isset($index))
  11. url::redirect('index.php/index');
  12. $this->id=$index;
  13. $this->template->menu->id=$index;
  14. $wynik=$this->profil->informacje($index);
  15. $this->template->content=new View('informacje');
  16. $this->template->content->informacje=$wynik;
  17. $this->template->render(TRUE);
  18. }
  19. public function informacje(){
  20. echo $this->id;
  21. $id = ($this->id == $this->session->get('id')) ? $this->session->get('id') : $this->id;
  22. $wynik=$this->profil->informacje($id);
  23. $this->template->content=new View('informacje');
  24. $this->template->content->informacje=$wynik;
  25. $this->template->render(TRUE);
  26. }

Przy wejściu do profilu użytkownika odpalam metodę index, i wszystko działa, gdy wybiorę w menu informacje, nie pojawiają się żadne informacje. Problemem jest to że nie wypisuje żadnej wartości $this->id.
W tym kontrolerze mam także inne metody: do zmiany hasła, swoich danych, uploadu avatara oraz ulubione. Nie jestem pewien czy dobrze to podzieliłem, czy nie porozbijać tego jakoś inaczej (dodatkowe kontrolery etc.)?
skowron-line
Odpalasz akcje informacje a wartość $id ustawiasz w ackoj index. Pomyśl chwile nad tym.
Max Damage
Hm, zawsze przy ładowaniu strony tworzony jest nowy obiekt klasy po czym wywoływana jest dla niego odpowiednia metoda z podanymi argumentami?
Jeśli tak, to czy mogę jakoś inaczej przechować taką zmienną w klasie? Pozmieniałem 3 linijki na takie:
  1. protected static $id;
  2. W index:
  3. self::$id=$index;
  4. W informacje:
  5. $idd =(self::$id == $this->session->get('id')) ? $this->session->get('id') : self::$id;

Ale nadal nie działa. Nie wiem jak to napisać.
skowron-line
@Max Damage nie mam bladego pojęcia o czym ty mówisz
nie możesz poprostu przekazać tego ID jako parametr methody informacje questionmark.gif
Max Damage
No pewnie że mogę, równie dobrze mógłbym go przechowywać w sesji, ale nie chce smile.gif Chcę to id przechowywać w klasie jako składową, na pewno jest na to jakiś sposób.
skowron-line
Cytat(Max Damage @ 7.11.2009, 16:16:05 ) *
No pewnie że mogę, równie dobrze mógłbym go przechowywać w sesji, ale nie chce smile.gif Chcę to id przechowywać w klasie jako składową, na pewno jest na to jakiś sposób.

A słyszałeś o zasadzie KISS questionmark.gif
  1. class A
  2. {
  3. protected $id;
  4.  
  5. public function index()
  6. {
  7. $this->id = 10;
  8. }
  9.  
  10. public function informacje()
  11. {
  12. echo $this->id;
  13. }
  14. }


i teraz odpal sobie to na 2 sposoby
1 tak jak ty robisz
  1. $q = new A;
  2. $q->informacje();

i 2 właściwy
  1. $q = new A;
  2. $q->index();
  3. $q->informacje();

Edit:
  1. self::$id=$index;

A tak też możesz sobie pobierać wartość pod warunkiem że ta zmienna ma zadeklarowaną wartość. podstawy OOP się kłaniają.
Max Damage
O żadnej zasadzie kiss nie słyszałem, ale kod który podałeś jest równoważny mojemu z pierwszego postu. Jeśli chodzi o odpalenie tego to muszę napisać wtedy coś takiego: profil/index/3/informacje ,a ja właśnie chciałem uniknąć parametrów i mieć coś takiego: profil/informacje. A poza tym najpierw i tak odpalam index, więc zmienna powinna być przepisana do składowej, jak wywołuje potem informacje to powinienem ją odczytać. Ze static kombinowałem bo założyłem, że za każdym razem jest tworzony przez framework nowy obiekt klasy, ale w sumie też bez sensu bo przecież jest wielu użytkowników. Problem chyba chwilowo nie do przeskoczenia, więc jednak zrobię po prostu metodę informacje (oraz inne) z parametrem. Dzięki za chęć pomocy :)
marcio
Kod
A poza tym najpierw i tak odpalam index, więc zmienna powinna być przepisana do składowej, jak wywołuje potem informacje to powinienem ją odczytać


Problem w tym ze za kazdym refreshem strony tworzy sie nowy obiekt i jego pola tak jakby sie ustawialy na defaultowe wartosci.

skowron-line
Cytat(Max Damage @ 7.11.2009, 19:36:20 ) *
O żadnej zasadzie kiss nie słyszałem,

http://pl.wikipedia.org/wiki/KISS_%28regu%C5%82a%29
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.