Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Kohana] Problem z przekazywaniem danych z/do kontrolera
phpion
post 23.07.2008, 09:16:18
Post #1





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Witam,
mam pewien problem. Na stronie chciałbym mieć menu, które będzie pobierane z bazy danych. Chciałbym aby to menu było automatycznie generowane i wstawiane do szablonu. Nie mogę sobie poradzić z pełną automatyzacją tego zadania.
MY_Controller.php
  1. <?php
  2. class Controller extends Controller_Core {
  3. public function __construct() {
  4. parent::__construct();
  5.  
  6. $this->template = Config::item('shop.views').'/template';
  7.  
  8. // zbedny kod
  9.  
  10. $this->getMenu();
  11. }
  12.  
  13. protected function getMenu() {
  14. $this->menu = new View('_global/menu');
  15. $this->menu = $this->menu->render();
  16. }
  17. }
  18. ?>

oraz przykładowy plik kontrolera:
  1. <?php
  2. class Registration_Controller extends Template_Controller {
  3. public function index() {
  4. // zbedny kod
  5.  
  6. $this->template->content = $form->html('_global/registration/form', true);
  7. $this->template->menu = $this->menu;
  8. }
  9. }
  10. ?>

W template.php wyświetlam menu poprzez:
  1. <?= $menu ?>

W takiej formie wszystko działa poprawnie. Chciałbym jednak pozbyć się przypisania $this->template->menu w każdym kontrolerze. Próbowałem na różne sposoby, m.in.:
  1. <?php
  2. class Controller extends Controller_Core {
  3. public function __construct() {
  4. parent::__construct();
  5.  
  6. $this->template = new View(Config::item('shop.views').'/template');
  7.  
  8. // zbedny kod
  9.  
  10. $this->getMenu();
  11. }
  12.  
  13. protected function getMenu() {
  14. $this->menu = new View('_global/menu');
  15. $this->template->menu = $this->menu->render();
  16. }
  17. }
  18. ?>

ale za każdym razem otrzymuję nieznaną zmienną $menu (odpowiedni wpis z samego kontrolera oczywiście usunąłem). Jak rozwiązać ten problem?

Reasumując: w głównym szablonie chciałbym wczytać menu, które będzie generowanie dynamicznie na podstawie bazy danych (coś a'la komponent w Symfony).

Pozdrawiam,
pion
Go to the top of the page
+Quote Post
Siner
post 23.07.2008, 10:20:21
Post #2





Grupa: Zarejestrowani
Postów: 159
Pomógł: 6
Dołączył: 2.01.2004

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


Tworzysz kontroler główny np Main_Controller(ja to nazywam to u siebie) dziedziczący po Template_Controller
przykład:
  1. <?php
  2. class Main_Controller extends Template_Controller {
  3.  
  4. function __construct()
  5. {
  6. parent::__construct();
  7. $this->profiler = new Profiler;
  8. $news = new News_Model;
  9. $this->template->news = $news->orderby('newsId','desc')->limit(3)->find()->newsEntry;
  10. //Np przekazujesz zmienne do widoku lub ładujesz strony
  11. }
  12. }
  13. ?>

Później w każdym kontrolerze dziedziczysz po Main np "class News_Controller extends Main_Controller".
I masz przekazaną wartość do widoku w każdym kontrolerze.


--------------------
Go to the top of the page
+Quote Post
phpion
post 23.07.2008, 13:11:17
Post #3





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




No właśnie nie bardzo, ponieważ $this->template nie jest obiektem tylko zwykłym stringiem. Próbowałem również zrobić coś takiego (w MY_Controller):
  1. <?php
  2. $this->template = new View(Config::item('shop.views').'/template');
  3. $this->template->menu = 'edek';
  4. ?>

ale wtedy tracą się wszystkie zmienne, które są przypisywane do szablonu (w skrócie: nie działa tongue.gif).
Go to the top of the page
+Quote Post
Siner
post 23.07.2008, 13:42:52
Post #4





Grupa: Zarejestrowani
Postów: 159
Pomógł: 6
Dołączył: 2.01.2004

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


Jeszcze raz, bo u siebie to wykorzystuje i nie ma najmniejszego problemu.
Main Controller
  1. <?php
  2. class Main_Controller extends Template_Controller {
  3.  
  4. function __construct()
  5. {
  6. parent::__construct();
  7. //$this->profiler = new Profiler;
  8.  
  9. $menu = new Menu_Model;
  10. $items = $menu->getMenu();
  11. $this->template->menu = new View('menu');
  12. $this->template->menu->items = $items;
  13. }
  14. }
  15. ?>


Kawałek Kontroler Nowości:
  1. <?php
  2. class News_Controller extends Main_Controller
  3. {
  4. function __construct()
  5. {
  6. parent::__construct();
  7. }
  8. function index($page = 1)
  9. {
  10. $news = new News_Model;
  11. $count = $news->getNewsCount()->count();
  12. $this->template->content = new View('news/list_tpl');
  13. $this->template->content->news = $news->getNewsForPage($page);
  14. }
  15. ?>


i widoku główny ustawiony wyświetlam 2 zmienne - $menu i $content, i tyle winksmiley.jpg
W tym przepadku mamy news i menu na jednej stronie. W kontrolerach już nie nadpisuje $this->template.


--------------------
Go to the top of the page
+Quote Post
phpion
post 23.07.2008, 14:54:00
Post #5





Grupa: Moderatorzy
Postów: 6 070
Pomógł: 860
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Bingo! Działa! Jest jeszcze jeden problem. Całość zrobiłem tak:
  1. <?php
  2. class Main_Controller_Core extends Template_Controller {
  3. public function __construct() {
  4. parent::__construct();
  5.  
  6. $this->template = new View(Config::item('shop.views').'/template');
  7.  
  8. $this->getMenu();
  9. }
  10.  
  11. protected function getMenu() {
  12. $categoryModel = new Category_Model();
  13. $this->template->menu = $categoryModel->getMenu();
  14. }
  15. }
  16. ?>

no a dalej to już nic magicznego. Jednak zawsze najpierw następuje próba wczytania szablonu template.php z katalogu views (wywołanie w Template_Controller). Niby to żaden problem: po prostu utworzyłem pusty plik views/template.php i jest on wczytywany, a później ładowany jest właściwy szablon (Config::item('shop.views').'/template'). Nie mam za bardzo koncepcji jak to elegancko zrobić... W sumie mógłbym przekopiować kod z Template_Controller i wrzucić go do Main_Controller_Core dziedzicząc równocześnie po samym Controller. Ale czy byłoby jakieś inne (lepsze) rozwiązanie?
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: 23.04.2024 - 15:20