Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana] Tworzenie odnośników
Forum PHP.pl > Forum > PHP > Frameworki
PawelC
Wszystko ładnie pięknie idzie mi w kohana php, tylko teraz mam problem jak tworzyć odnośniki. Może wstawię model, widok i kontroler.

Model:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. class Test_Model extends Model {
  4.  
  5.    public function __construct()
  6.    {
  7.        // load database library into $this->db (can be omitted if not required)
  8.        parent::__construct();
  9.    }
  10.    
  11.    public function kategorie()
  12.    {
  13.    $db=new Database();
  14.    $result=$db->query('select * from slowa limit 5');
  15.    foreach ($result as $row)
  16. {
  17.    echo '<a href="test/slowo/id/'.$row->id.'">'.$row->slowo.'<br />'; // to zapewne jest źle
  18.  
  19. }
  20. }
  21.  
  22. }
  23. ?>

Widok:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. $user = new Test_Model;
  4. $name = $user->kategorie();
  5. ?>

Oraz kontroler:
  1. <?php defined('SYSPATH') OR die('No direct access allowed.');
  2.  
  3. class Test_Controller extends Controller
  4. {
  5.    public function index()
  6.    {
  7.        $view = new View('test');
  8.        $view->render(TRUE);
  9.  
  10.     }
  11.  
  12.        
  13.    }
  14. }
  15. ?>

I skrypt działa w taki sposób, że pobiera dane z bazy, nazwy programów i teraz chciałbym aby po kliknięciu w odnośnik(jak powinien on wyglądać?) wyświetliło wszystko z bazy o klikniętym programie.
Zdaję sobie sprawę że będę musiał utworzyć jeszcze jeden model, który będzie odpowiedzialny za pobranie danego programu.
kbsucha
Hmm coś pomieszałeś. Czemu zamiast w kontrolerze pobierać dane z modelu i je przekazywać do widoku, uruchamiasz model w widoku?
Przekaż sobie tablice zawierająca id i słowo do widoku (to powinno być w kontrolerze). I tam poprzez jakąś pętle wyświetlaj sobie linki, albo ręcznie przez html, albo poprzez helper url::anchor.
phpion
Poza tym nie musisz pobierać instacji połączenia z bazą za każdym razem:
  1. <?php
  2. $db=new Database();
  3. $result=$db->query('select * from slowa limit 5');
  4. ?>

możesz z powodzeniem zastąpić:
  1. <?php
  2. $result=$this->db->query('select * from slowa limit 5');
  3. ?>

Ponadto osobiście polecałbym Ci korzystanie z query buildera - ma kilka błędów i ograniczeń ale ogólnie staje się bardzo przydatny szczególnie w sytuacji dynamicznego generowania zapytań. W Twoim przypadku nie jest to konieczne ale wg mnie dobrze jest korzystać ze wszystkich dobrodziejstw, jakie daje nam Kohana.
PawelC
Już sobie poradziłem, wystarczyło stworzyć w modelu kolejną funkcje, czyli w moim wypadku:
  1. <?php
  2. public function show($id){
  3.        
  4.        $db=new Database();
  5.    $result=$db->query('select * from slowa where id="'.$id.'"');
  6.    foreach ($result as $row)
  7. {
  8.    echo 'id: '.$row->id.'<br />';
  9.    echo 'Słowo: '.$row->slowo;
  10.  
  11. }
  12. }
  13. ?>

A w modelu kategorie, zmienić forme linku na
  1. <?php
  2. echo '<a href="test/show/'.$row->id.'">'.$row->slowo.'<br />';
  3. ?>

A później to już wiadomo co i jak.

Cytat
Poza tym nie musisz pobierać instacji połączenia z bazą za każdym razem:

Tego to nie wiedziałem smile.gif
Cytat
Hmm coś pomieszałeś. Czemu zamiast w kontrolerze pobierać dane z modelu i je przekazywać do widoku, uruchamiasz model w widoku?

Dokładnie, pomieszałem trochę ale dałem rade smile.gif
AxZx
łooooo
dlaczego tak to rozumujesz? poczytaj więcej o MVC.

html wyświetlaj w widoku
dane pobieraj w modelu
w kontrolerze pobieraj dane z modelu, wstawiaj je do widoku.

w modelu możesz mieć takie metody jak: get_all, get_one - czyli pobieranie wszystkich elementów i pobieranie tylko jednego elementu.
w kontrolerze w zależności od tego co masz w URL pobieraj albo tylko jeden element, albo wszystkie elementy. również w zależności od tego co masz w URL wyświetlaj odpowiedni widok - albo ze wszystkimi wpisami, albo tylko z jednym.

pozdrawiam
PawelC
Mam taki kontroler:
  1. <?php defined('SYSPATH') OR die('No direct access allowed.');
  2.  
  3. class Test_Controller extends Controller
  4. {
  5.    public function index()
  6.    {
  7.        $view = new View('test');
  8.        $view->render(True);
  9.    }
  10.    public function show($nazwa){
  11.      
  12.       $db=new Database();
  13.   $result=$db->query('select * from gd_pliki where nazwa="'.$nazwa.'"');
  14.   foreach ($result as $row)
  15. {
  16.   echo 'id: '.$row->id.'<br />';
  17.   echo 'Słowo: '.$row->nazwa;
  18.  
  19. }
  20. }
  21. }
  22. ?>

Widok:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2. $test = new Test_Model;
  3. $test->test();
  4. ?>

Model:
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  
  3. class Test_Model extends Model {
  4.  
  5.    public function __construct()
  6.    {
  7.        // load database library into $this->db (can be omitted if not required)
  8.        parent::__construct();
  9.    }
  10.    public function test()
  11.    {
  12.    $db=new Database();
  13.    $result=$db->query("select * from gd_pliki limit 10");
  14.    foreach($result as $rows)
  15.    {
  16.    echo '<a href="test/show/'.$rows->nazwa.'">'.$rows->nazwa.'</a><br />';
  17.    }
  18.    }
  19.    
  20. }
  21. ?>

I chodzi mi o to, aby ktoś życzliwy pokazał mi jak to powinno wyglądać zgodnie z architekturą MVC, bo podejrzewam że mój kod nie jest z MVC zgodny.
Villentre
Witaj.
Podstawa: żadnych ech w modelach i kontrolerach (no, chyba, że jedynie w kontrolerze jedno echo za wyświetlenie zrenderowanego widoku odpowiedzialne (echo $view -> render(FALSE);)).

Przepisałem Twój kod po swojemu, mam nadzieję, że nic nie zgubiłem i nigdzie się nie pomyliłem. Wyszły mi 4 plik, wszystkie opisane poniżej:
  1. <?php defined('SYSPATH') OR die('No direct access allowed.');
  2. //controllers/test.php
  3. //Kontroler;
  4.    class Test_Controller extends Controller
  5.    {
  6.        public function __construct()
  7.        {
  8.            $this -> test = new Test_Model;
  9.        }
  10.        //Wyświetlanie 10 wpisów z bazy;
  11.        public function index()
  12.        {
  13.            $view = new View('test10');
  14.            $view -> date = $this -> test -> getTen();
  15.            $view -> render(TRUE);
  16.        }
  17.  
  18.        //Wyświetlanie 1 wpisu;
  19.        public function show($name)
  20.        {
  21.            $view = new View('test1');
  22.            $view -> date = $this -> test -> getOne($name);
  23.            $view -> render(TRUE);
  24.        }
  25.    }
  26.  
  27.  
  28. <?php defined('SYSPATH') or die('No direct script access.');
  29. //models/test.php
  30. //Model
  31.    class Test_Model extends Model
  32.    {
  33.        public function __construct()
  34.        {
  35.            parent::__construct(); //m.in. przypisanie new Database pod $this -> db;
  36.        }
  37.  
  38.        //Pobranie 1 wpisu z bazy
  39.        public function getOne($name)
  40.        {
  41.            $name = $this -> db -> escape($name); //"czyszczenie";
  42.            return $this -> db -> query('select * from gd_pliki where nazwa='.$name.'');
  43.        }
  44.  
  45.        //Pobranie 10 wpisów z bazy
  46.        public function getTen()
  47.        {
  48.            return $this -> db -> query("select * from gd_pliki limit 10");
  49.        }
  50.    }
  51.  
  52.  
  53. <?php defined('SYSPATH') or die('No direct script access.');
  54. //views/test10.php
  55. //Widok wyświetlający listę 10 wpisów;
  56.    if($date -> count())
  57.    {
  58.        echo '<ul>';
  59.        foreach($date as $dat)
  60.        {
  61.            echo '<li>'.html::anchor('test/show/'.$dat -> nazwa, $dat -> nazwa).'</li>';
  62.        }
  63.        echo '</ul>';
  64.    }
  65.    else
  66.    {
  67.        echo 'Brak danych';
  68.    }
  69.  
  70.  
  71. <?php defined('SYSPATH') or die('No direct script access.');
  72. //views/test1.php
  73. //Widok wyświetlający 1 wpis;
  74.    if($date -> count())
  75.    {
  76.        echo '<b>ID<b>: '.$date[0] -> id;
  77.        echo '<b>Nazwa</b>: '.$date[0] -> nazwa;
  78.    }
  79.    else
  80.    {
  81.        echo 'Brak danych';
  82.    }
  83. ?>

Edit:
@down: Rzeczywiście, mój błąd (tak to jest jak coś się kopiuje tongue.gif). Już poprawiłem.

Edit:
Wkurzające forum, zamienia html na bbc ;/
AxZx
to chyba tak powinno być:
  1. <?php
  2. $this->test = new Test_Model;
  3. ?>
PawelC
Dzięki, teraz już wiem o co chodzi smile.gif
phpion
Ja ze swojej strony miałbym jeszcze uwagi odnośnie widoków. Tworzenie ich w "czystym" PHP jest moim zdaniem nieeleganckie. Zdecydowanie lepiej użyć do tego "szablonów" czyli przejść z HTML do PHP i na odwót tak, jak to zostało pokazane w dokumentacji.
PawelC
Wstawiłem ten kod co Villentre podał i wywala mi błąd:
Kod
Fatal error:  Call to a member function _kohana_load_view() on a non-object in C:\wamp\www\kohana\system\libraries\View.php on line 272


Już sobie poradziłem, brakowało parent::contruct();

Teraz już wiem, jak projektować aplikacje zgodne z MVC smile.gif
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.