Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [CI] użycie własnego helpera do kreacji menu na stronie
john_doe
post 13.08.2011, 16:54:07
Post #1





Grupa: Zarejestrowani
Postów: 870
Pomógł: 25
Dołączył: 24.07.2005

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


Mam jeszcze starą funkcję do tworzenia wielopoziomowego dropdown menu pobieranego z bazy.

  1. function display_children($parent, $level, $dbh) {
  2.  
  3. $sql = "SELECT a.id id, a.label label, a.link link, Deriv1.Count Count FROM `menu` a LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" . $parent;
  4.  
  5. echo "<ul id='nav'>";
  6.  
  7. foreach($dbh->query( $sql ) as $row)
  8. {
  9.  
  10. if ($row['Count'] > 0)
  11. {
  12.  
  13. echo "<li><a href='" . $row['link'] . "'>" . $row['label'] . "</a>";
  14.  
  15. display_children($row['id'], $level + 1, $dbh);
  16.  
  17. echo "</li>";
  18.  
  19. } elseif ($row['Count']==0) {
  20.  
  21. echo "<li><a href='" . $row['link'] . "'>" . $row['label'] . "</a></li>";
  22. //echo "<li class='level".$level."'><a class='level".$level."' href='" . $row['link'] . "'>" . $row['label'] . "</a></li>";
  23.  
  24. } else;
  25. }
  26.  
  27. echo "</ul>";
  28.  
  29. }


podpowiedzcie mi jak to ubrać w CI w helpera.
Funkcja jest rekurencyjna. W helperze nie wychodzi mi db->select(zapytanie).
W helperze uruchamiać metodę z modelu? zagubiłem się ;/


Go to the top of the page
+Quote Post
adbacz
post 13.08.2011, 21:56:10
Post #2





Grupa: Zarejestrowani
Postów: 524
Pomógł: 24
Dołączył: 15.04.2011
Skąd: Kalisz

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


A trzeba to "ubrać" w helpera? Nie można w bibliotekę CI? Może biblioteka byłaby lepszym wyjściem?


Jeśli tak, to polecam zobaczyć to: http://codeigniter.com/user_guide/general/..._libraries.html


--------------------
PHPCenter.pl - Portal Informacyjny

Informacje o PHP, Artykuły, Aktualności, Wydarzenia, Biblioteki
Go to the top of the page
+Quote Post
john_doe
post 15.08.2011, 12:18:23
Post #3





Grupa: Zarejestrowani
Postów: 870
Pomógł: 25
Dołączył: 24.07.2005

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


Witam,
stworzyłem coś takiego ( narazie roboczo -> html pójdzie do widoku )

  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Mymenu {
  4.  
  5. function __construct()
  6. {
  7. parent::__construct();
  8. }
  9.  
  10. public function create_menu($parent, $level)
  11. {
  12.  
  13. $query = $this->db->select("SELECT a.id id, a.label label, a.link link, Deriv1.Count count FROM `menu` a LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" . $parent);
  14.  
  15. $menu .= "<ul id='nav'>";
  16.  
  17.  
  18. foreach($query as $position)
  19. {
  20. if($position->count > 0) {
  21.  
  22. $menu .= "<li><a href='" . $position->link . "'>" . $position->label . "</a>";
  23.  
  24. create_menu($position->id, $level + 1);
  25.  
  26. $menu .= "</li>";
  27.  
  28. }elseif($position->count == 0) {
  29.  
  30. $menu .= "<li><a href='" . $position->link . "'>" . $position->label . "</a></li>";
  31.  
  32. }else;
  33.  
  34. }
  35.  
  36. $menu .= "</ul>";
  37.  
  38. return $menu;
  39. }
  40. }
  41.  
  42. /* End of file Mymenu.php */


następnie $this->load->library('mymenu');

dostaję notice
Message: Undefined property: Mymenu::$db
oraz
Fatal error: Call to a member function select() on a non-object


Gdy spróbowałem użyć super obiektu

Fatal error: Cannot access parent:: when current class scope has no parent

  1. function __construct()
  2. {
  3. parent::__construct();
  4. $CI = get_instance();
  5. }

a potem $this->CI->db->select

Fatal error: Cannot access parent:: when current class scope has no parent

Ten post edytował john_doe 15.08.2011, 12:23:53
Go to the top of the page
+Quote Post
vvolv
post 15.08.2011, 14:05:35
Post #4





Grupa: Zarejestrowani
Postów: 15
Pomógł: 5
Dołączył: 31.07.2011

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


Po pierwsze: Dlaczego próbujesz wywołać konstruktor rodzica, skoro nie masz dziedziczenia?
Po drugie: Powinno być:
  1. $CI =& get_instance();

Nawet dokumentacja CI o tym wspomina.

http://codeigniter.com/user_guide/general/..._libraries.html

BTW: Stworzyłeś bibliotekę(no prawie), a nie helper. Polecam czytać dokumentacje. CI ma naprawdę dobrą dokumentację!
Go to the top of the page
+Quote Post
john_doe
post 15.08.2011, 14:30:35
Post #5





Grupa: Zarejestrowani
Postów: 870
Pomógł: 25
Dołączył: 24.07.2005

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


Wiem, ale próbowałem już helpera, po przez model to zrobić i teraz library smile.gif

zmienilem lekko kod

  1. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3. class Mymenu {
  4.  
  5.  
  6. public function create_menu($parent, $level)
  7. {
  8. $CI =& get_instance();
  9.  
  10. $query = $CI->db->query("SELECT a.id, a.label, a.link, Deriv1.Count FROM `menu` a LEFT OUTER JOIN (SELECT parent, COUNT(*) AS Count FROM `menu` GROUP BY parent) Deriv1 ON a.id = Deriv1.parent WHERE a.parent=" . $parent);
  11.  
  12. $menu .= "<ul id='nav'>";
  13.  
  14.  
  15. foreach($query->result() as $position)
  16. {
  17. if($position->Count > 0) {
  18.  
  19. $menu .= "<li><a href='" . $position->link . "'>" . $position->label . "</a>";
  20.  
  21. $this->create_menu($position->id, $level + 1);
  22.  
  23. $menu .= "</li>";
  24.  
  25. }elseif($position->Count == 0) {
  26.  
  27. $menu .= "<li><a href='" . $position->link . "'>" . $position->label . "</a></li>";
  28.  
  29. }else;
  30.  
  31. }
  32.  
  33. $menu .= "</ul>";
  34.  
  35. return $menu;
  36. }
  37. }
  38.  
  39. /* End of file Mymenu.php */


w controlerze daje $data['menu_header'] = $this->mymenu->create_menu(0, 1);

i dosteję mnóstwo
Undefined variable: menu -> to nie problem ale zupełnie nie wiem dlaczego jak dam na początku klasy var $menu = '' też wywala notice a bez var nie. Wszystkie klasy w CI tak deklarują zmienne.
i listę ul na 1szym poziomie, zupełnie tak jakby rekurencja nie działała - funkcja jest na bank dobra.

Ten post edytował john_doe 15.08.2011, 18:18:52
Go to the top of the page
+Quote Post
szok
post 16.08.2011, 10:18:16
Post #6





Grupa: Zarejestrowani
Postów: 165
Pomógł: 20
Dołączył: 2.03.2006

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


Przepraszam za polskie znaki, nie mam polskiej klawki sad.gif
Zobacz to:

  1. $menu = '';
  2. $menu .= "<ul id='nav'>";


Probujesz dodac cos do zmiennej $menu ktorej niema.

var $menu dodajesz tylko jak to jest pole klasy, a u Ciebie $menu jest zmienna lokalna w metodzie.

Ten post edytował szok 16.08.2011, 10:19:16


--------------------
Go to the top of the page
+Quote Post
john_doe
post 16.08.2011, 20:39:03
Post #7





Grupa: Zarejestrowani
Postów: 870
Pomógł: 25
Dołączył: 24.07.2005

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


dzięki szok, natchnąłeś mnie smile.gif

co do zmiennej $menu masz rację,

co do reszty zobacz jaki błąd trzasnąłem

wywołałem rekurencyjnie tak
  1. $this->create_menu($position->id, $level + 1);


zamiast

  1. $menu .= $this->create_menu($position->id, $level + 1);


pozdro
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: 24.01.2020 - 07:14