Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Kohana]Problem z kilkupoziomowym menu
Forum PHP.pl > Forum > PHP > Frameworki
henio
Witam, od niedawna używam Kohany i mam taki problem. Stworzylem 3 tabele w bazie danych (menu-adm-1, menu-adm-2 i menu-adm-3) chce pobrać dane z pierwszej tabeli i wyświetlić potrafię. Chciałbym jednak osiągnąć taki cel: po pobraniu danych z tabeli menu-adm-1 i ich wyświetleniu zostały pobrane dane z tabeli menu-adm-2 ale tylko dla konkretnego pobranego wcześniej rekordu z tabeli menu-adm-1.

Model Admin_Menu
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  class Admin_Menu_Model extends Model {
  3.    public function __construct()
  4.    {
  5.    parent::__construct();
  6.    }
  7.    
  8.    public function menu_adm1()
  9.    {
  10.    return $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  11.            ->from('menu-adm-1')
  12.            ->orderby(array('kolejnosc' => 'ASC'))
  13.            ->get();
  14.    }
  15.  }
  16. ?>


Widok (fragment)
  1. <ul id="nav">
  2.        <?php foreach($menu as $m): ?>
  3.            <li><a href="<?php echo url::base().$m->url;?>"><?php echo $m->tekst;?></a></li>
  4.        <?php endforeach; ?>
  5.        </ul>


Kontroler
  1. <?php defined('SYSPATH') OR die('No direct access allowed.');
  2. class Glowna_Controller extends Controller {
  3.  
  4.        public function index()
  5.        {
  6.        $view = new View('layout/adm');
  7.        $menu = new Admin_Menu_Model;
  8.        $view->menu = $menu->menu_adm1();
  9.        $view->content = new View('adm/glowna');
  10.        $view->render(true);
  11.        }
  12. }
  13. ?>
Cypherq
Przejedź foreach po rekordach z menu1 wyjmując rekordy z menu 2?

  1. <?php
  2. $menu_db = $menu->menu_adm1();
  3. foreach($menu_db as $m)
  4. {
  5. $this->db->from('menu-adm-2');
  6. $this->db->where('id', $m->id);
  7. $wynik =  $this->db->get();
  8. echo $wynik;
  9. }
  10. ?>


Oczywiście warunek dałem jakikolwiek bo nie znam struktury tabeli.
henio
Ale to mam umieścić w kontrolerze?
skowron-line
W modelu zrób sobie zapytanie o główne menu i w pętli pobieraj podkategorie menu i stwórz sobie tablice wielowymiarową.
@Cypherq Słowo klucz MVC
henio
Cytat(skowron-line @ 16.06.2009, 10:34:02 ) *
W modelu zrób sobie zapytanie o główne menu i w pętli pobieraj podkategorie menu i stwórz sobie tablice wielowymiarową.
@Cypherq Słowo klucz MVC


Mógłbyś mi tak mniej więcej napisać jak należy to zrobić, gdyż szczerzę mówiąc to nie wiem. I nie chodzi mi tu bynajmniej o samo tworzenie tablic wielowymiarowych.
skowron-line
W modelu tworzysz metodę powiedzmy getMenu
i w niej sobie wyciągniesz dane do menu.
W kontrolerze
  1. <?php
  2. $menu = $model->getMenu();
  3. $view->render( TRUE );
  4. ?>

A w widoku
  1. <?php
  2. foreach( $menu as $M )
  3. {
  4. // i tu latasz sobie warunkami i innymi żeby odczytać to co sobie stworzyłeś w modelu.
  5. }
  6. ?>



http://artykuly.zyxist.com/czytaj.php/drzewa_w_php_i_mysql + do zapoznania się.
Cypherq
Cytat(skowron-line @ 15.06.2009, 23:34:02 ) *
W modelu zrób sobie zapytanie o główne menu i w pętli pobieraj podkategorie menu i stwórz sobie tablice wielowymiarową.
@Cypherq Słowo klucz MVC


Tak, słowo klucz zwłaszcza gdy sam korzystam z Kohany. Napisałem mu jak to ma działać, a jeśli korzysta z Kohany to zaimplementować w MVC sam będzie potrafił. Z takiego wychodzę założenia.
henio
Z Kohany korzystam dopiero od kilku dni i nie potrafię jeszcze stworzyć tego o czym pisałem na podstawie waszych podpowiedzi, może ma ktoś jakiś gotowy przykład to sobie zerknąłbym i coś napisał
Cypherq
Nie obraź się, ale Skowron podał Ci wszystko na tacy, jeśli nadal nie umiesz tego ogarnąć to wróć do podstaw i zajmij się Kohaną jak będziesz coś wiedział o niej.
skowron-line
Cytat(henio @ 17.06.2009, 14:15:14 ) *
Z Kohany korzystam dopiero od kilku dni i nie potrafię jeszcze stworzyć tego o czym pisałem na podstawie waszych podpowiedzi, może ma ktoś jakiś gotowy przykład to sobie zerknąłbym i coś napisał

Nie pękaj i na to jest lekarstwo
http://blog.bexlab.pl/moja-pierwsza-strona-w-kohana/218/

( ja zacząłem naukę kohany ale jakoś nie mogę skończyć )
henio
Wróciłem niedawno z wakacyjnego wyjazdu i wypoczęty powróciłem do tego problemu. Przeczytałem link, który został tu podrzucony, ale jakoś nie znalazłem w nim tego czego szukam.
Rozszerzyłem model o dwie dodatkowe funkcje i chciałbym coś z nimi zrobić w kontrolerze, żeby pobierane były odpowiednie rekordy.
model
  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  class Admin_Menu_Model extends Model {
  3.    public function __construct()
  4.    {
  5.    parent::__construct();
  6.    }
  7.    
  8.    public function menu_adm1()
  9.    {
  10.    return $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  11.            ->from('menu-adm-1')
  12.            ->orderby(array('kolejnosc' => 'ASC'))
  13.            ->get();
  14.    }
  15.  
  16.    public function menu_adm2($id_menu_1)
  17.    {
  18.    return $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  19.            ->from('menu-adm-2')
  20.            ->where(array('id_menu_1' => $id_menu_1))
  21.            ->orderby(array('kolejnosc' => 'ASC'))
  22.            ->get();
  23.    }
  24.  
  25.    public function menu_adm3($id_menu_2)
  26.    {
  27.    return $this->db->select('id', 'tekst', 'url')
  28.            ->from('menu-adm-3')
  29.            ->where(array('id_menu_2' => $id_menu_2))
  30.            ->orderby(array('kolejnosc' => 'ASC'))
  31.            ->get();
  32.    }
  33.  }
  34. ?>

widok - fragment
  1. <ul id="nav">
  2.        <?php foreach($menu1 as $m1): ?>
  3.            <li>
  4.                <a href="<?php echo url::base().$m1->url;?>"><?php echo $m1->tekst;?></a>
  5.                <?php if($m1->kolejny_poziom == "TAK") : ?>
  6.                <ul>
  7.                <?php foreach($menu2 as $m2): ?>
  8.                    <li>
  9.                        <a href="<?php echo url::base().$m2->url;?>"><?php echo $m2->tekst;?></a>
  10.                        <?php if($m2->kolejny_poziom == "TAK") : ?>
  11.                        <ul>
  12.                        <?php foreach($menu3 as $m3): ?>
  13.                            <li>
  14.                                <a href="<?php echo url::base().$m3->url;?>"><?php echo $m3->tekst;?></a>
  15.                            </li>
  16.                        <?php endforeach; ?>
  17.                        </ul>
  18.                        <?php endif; ?>
  19.                    </li>
  20.                <?php endforeach; ?>
  21.                </ul>
  22.                <?php endif; ?>
  23.            </li>
  24.        <?php endforeach; ?>
  25.        </ul>

kontroler
  1. <?php defined('SYSPATH') OR die('No direct access allowed.');
  2. class Glowna_Controller extends Controller {
  3.  
  4.    public function index()
  5.    {
  6.    $view = new View('layout/adm');
  7.    
  8.    $view->author = Kohana::config('settings.author');
  9.    $view->charset = Kohana::config('settings.charset');
  10.    $view->copyright = Kohana::config('settings.copyright');
  11.    
  12.     $menu = new Admin_Menu_Model;
  13.    $view->menu1 = $menu->menu_adm1();
  14.    $view->menu2 = $menu->menu_adm2('2');
  15.    $view->menu3 = $menu->menu_adm3('2');
  16.    
  17.    $view->content = new View('adm/glowna');
  18.    $view->render(true);
  19.    }
  20. }
  21. ?>

Mógłby ktoś mi pomóc rozwiązać ten dla wielu z was banalny problem
skowron-line
Według mnie tablica 2 wymiarowa była by najlepszym rozwiązaniem. W modelu byś sobie ją sklładał do kupy. A w widoku po niej jezdził foreachem.
henio
Cytat(skowron-line @ 30.06.2009, 12:44:47 ) *
Według mnie tablica 2 wymiarowa była by najlepszym rozwiązaniem. W modelu byś sobie ją sklładał do kupy. A w widoku po niej jezdził foreachem.


Masz jakiś przykładzik pod ręką, bo jak ponad 10 dni temu pisałem Kohana i MVC to dopiero wczesny etap nauki.

Chodzi mi o przykład tworzenia tablicy dwuwymiarowej w modelu we frameworku Kohana po wyjęciu danych z bazy
skowron-line
Nie wiesz jak wygląda tablica wielowymiarowa questionmark.gif

http://blog.bexlab.pl/moja-pierwsza-strona-w-kohana/218/ tu koleżanka pokazuje jak zbudować prostą stronę przy użyciu KOHANY i jest opcja menu smile.gif
henio
Cytat(skowron-line @ 30.06.2009, 12:57:45 ) *
Nie wiesz jak wygląda tablica wielowymiarowa questionmark.gif

http://blog.bexlab.pl/moja-pierwsza-strona-w-kohana/218/ tu koleżanka pokazuje jak zbudować prostą stronę przy użyciu KOHANY i jest opcja menu smile.gif


Czytałem to, ale tu jest zrobione bez udziału bazy danych
skowron-line
No ale powiedz w czym ty masz problem questionmark.gif ze zrobieniem tablicy 2 wymiarowej questionmark.gif
1 robisz zapytanie obracasz je w petli
2 odczytujesz podkategorię dla danej kategori wyciagnieteje wyżej
3 wszystko wrzucasz do tablicy
4 return tablica z menu.
henio
Cytat(skowron-line @ 30.06.2009, 13:11:44 ) *
No ale powiedz w czym ty masz problem questionmark.gif ze zrobieniem tablicy 2 wymiarowej questionmark.gif
1 robisz zapytanie obracasz je w petli
2 odczytujesz podkategorię dla danej kategori wyciagnieteje wyżej
3 wszystko wrzucasz do tablicy
4 return tablica z menu.


Pokaż jakiś przykład, bo nie moge jakoś tego zrobić
phpion
Pokaż jak próbowałeś, a my Cię naprowadzimy pokazując gdzie masz błędy.
henio
Cytat(phpion @ 30.06.2009, 13:56:04 ) *
Pokaż jak próbowałeś, a my Cię naprowadzimy pokazując gdzie masz błędy.


  1. <?php defined('SYSPATH') or die('No direct script access.');
  2.  class Admin_Menu_Model extends Model {
  3.    public function __construct()
  4.    {
  5.    parent::__construct();
  6.    }
  7.  
  8.    private $menu = array();
  9.    
  10.    public function menu_adm()
  11.    {
  12.    $menu = $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  13.                     ->from('menu-adm-1')
  14.                     ->orderby(array('kolejnosc' => 'ASC'))
  15.                     ->get();
  16.  
  17.        for($i=1; $i<$menu->count(); $i++)
  18.        {                    
  19.            if($menu[$i]->kolejny_poziom == 'TAK')
  20.            {
  21.            $menu1 = $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  22.                              ->from('menu-adm-2')
  23.                              ->where(array('id_menu_1' => $menu[$i]->id))
  24.                              ->orderby(array('kolejnosc' => 'ASC'))
  25.                              ->get();
  26.  
  27.                for($j=1; $j<$menu1->count(); $j++)
  28.                {                    
  29.                    if($menu1[$j]->kolejny_poziom == 'TAK')
  30.                    {
  31.                    $menu2 = $this->db->select('id', 'tekst', 'url')
  32.                                      ->from('menu-adm-3')
  33.                                      ->where(array('id_menu_2' => $menu1[$j]->id))
  34.                                      ->orderby(array('kolejnosc' => 'ASC'))
  35.                                      ->get();
  36.                    }
  37.                }
  38.            }
  39.        }
  40.    }
  41. }
  42. ?>
skowron-line
a gdzie wrzucasz to do tablicy questionmark.gif
henio
Cytat(skowron-line @ 30.06.2009, 15:31:43 ) *
a gdzie wrzucasz to do tablicy questionmark.gif


Jeszcze nie wrzucam, bo nie wiem czy to jest dobrze zrobione?
skowron-line
Cytat(henio @ 1.07.2009, 07:07:35 ) *
Jeszcze nie wrzucam, bo nie wiem czy to jest dobrze zrobione?

Dlaczego nie spróbujesz zrobić sam tylko pytasz czy dobrze questionmark.gif Jak będzie działać to znaczy że dobrze.
Pętle są okej więc wrzucaj do tablicy i zobacz jaki będzie wynik.
phpion
Dobrze to pojęcie względne ale powinno działać.
henio
zrobiłem na mniej więcej na podstawie tego co tu zobaczyłem
  1. <?php
  2. class Admin_Menu_Model extends Model {
  3.    public function __construct()
  4.    {
  5.    parent::__construct();
  6.    }
  7.  
  8.    private $menu = array();
  9.    
  10.    public function menu_adm()
  11.    {
  12.    $menu1 = $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  13.                     ->from('menu-adm-1')
  14.                     ->orderby(array('kolejnosc' => 'ASC'))
  15.                     ->get();
  16.  
  17.        for($i=1; $i<$menu1->count(); $i++)
  18.        {                    
  19.            if($menu1[$i]->kolejny_poziom == 'TAK')
  20.            {
  21.            $menu2[$menu1[$i]->id] = $this->db->select('id', 'tekst', 'url', 'kolejny_poziom')
  22.                                              ->from('menu-adm-2')
  23.                                              ->where(array('id_menu_1' => $menu1[$i]->id))
  24.                                              ->orderby(array('kolejnosc' => 'ASC'))
  25.                                              ->get();
  26.  
  27.                for($j=1; $j<$menu2[$menu1[$i]->id]->count(); $j++)
  28.                {                    
  29.                    if($menu2[$menu1[$i]->id][$j]->kolejny_poziom == 'TAK')
  30.                    {
  31.                    $menu[$menu1[$i]->id][$menu2[$menu1[$i]->id][$menu2[$j]->id]] = $this->db->select('id', 'tekst', 'url')
  32.                                                        ->from('menu-adm-3')
  33.                                                        ->where(array('id_menu_2' => $menu2[$j]->id))
  34.                                                        ->orderby(array('kolejnosc' => 'ASC'))
  35.                                                        ->get();
  36.                    }
  37.                }
  38.            }
  39.        }
  40.    }
  41. }
  42. ?>


Mam taki błąd:
C:/Program Files/Apache Group/Apache2/htdocs/Heniek_CMS/application/models/admin_menu.php [31]:
Undefined offset: 1
skowron-line
Dlaczego mam wrażenie że z każdą pierdołą piszesz tutaj
http://forum.php.pl/lofiversion/index.php/t104403.html
Chcesz zebuy ktoś to za ciebie zrobił.questionmark.gif
henio
Może aż tak źle ze mną nie jest.
Stworzyłem taką tablicę i chciałbym wiedzieć czy tak ona powinna wyglądać?
Kod
[menu] => Array
        (
            [1] => Array
                (
                    [id] => 1
                    [tekst] => Główna
                    [url] => adm/glowna
                    [kolejny_poziom] => NIE
                )

            [2] => Array
                (
                    [id] => 2
                    [tekst] => Newsy
                    [url] => #
                    [kolejny_poziom] => TAK
                    [1] => Array
                        (
                            [id] => 1
                            [tekst] => Zwykłe
                            [url] => #
                            [kolejny_poziom] => TAK
                            [1] => Array
                                (
                                    [id] => 1
                                    [tekst] => Dodaj
                                    [url] => adm/newsy/dodaj
                                )

                        )

                    [2] => Array
                        (
                            [id] => 2
                            [tekst] => Wydarzenia
                            [url] => #
                            [kolejny_poziom] => TAK
                        )

                    [3] => Array
                        (
                            [id] => 3
                            [tekst] => Artykuły
                            [url] => #
                            [kolejny_poziom] => TAK
                        )

                    [4] => Array
                        (
                            [id] => 4
                            [tekst] => Tagi
                            [url] => #
                            [kolejny_poziom] => TAK
                        )

                )

            [3] => Array
                (
                    [id] => 3
                    [tekst] => Komentarze
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [4] => Array
                (
                    [id] => 4
                    [tekst] => Użytkownicy
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [5] => Array
                (
                    [id] => 5
                    [tekst] => Terminarz
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [6] => Array
                (
                    [id] => 6
                    [tekst] => Galeria
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [7] => Array
                (
                    [id] => 7
                    [tekst] => Działy
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [8] => Array
                (
                    [id] => 8
                    [tekst] => Menu
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [9] => Array
                (
                    [id] => 9
                    [tekst] => Inne
                    [url] => #
                    [kolejny_poziom] => TAK
                )

            [10] => Array
                (
                    [id] => 10
                    [tekst] => Wyjdź
                    [url] => adm/wyloguj
                    [kolejny_poziom] => NIE
                )

        )


Teraz w widoku biorę się za odczytanie danych, ale w rezultacie mam coś takiego:
Kod
<ul id="nav">
   <li><a href="/heniek_cms/adm/glowna">Główna</a></li>
   <li><a href="/heniek_cms/#">Newsy</a>
     <ul>
       <li><a href="/heniek_cms/2">2</a></li>
       <li><a href="/heniek_cms/W">W</a></li>
       <li><a href="/heniek_cms/#">#</a></li>
       <li><a href="/heniek_cms/T">T</a></li>
     </ul>
   </li>
   <li><a href="/heniek_cms/#">Komentarze</a></li>
   <li><a href="/heniek_cms/#">Użytkownicy</a></li>
   <li><a href="/heniek_cms/#">Terminarz</a></li>
   <li><a href="/heniek_cms/#">Galeria</a></li>
   <li><a href="/heniek_cms/#">Działy</a></li>
   <li><a href="/heniek_cms/#">Menu</a></li>
   <li><a href="/heniek_cms/#">Inne</a></li>
   <li><a href="/heniek_cms/adm/wyloguj">Wyjdź</a></li>
</ul>


  1. <ul id="nav">
  2.         <?php foreach($menu as $m): ?>
  3.             <li>
  4.                 <a href="<?php echo url::base().$m['url'];?>"><?php echo $m['tekst'];?></a>
  5.                 <?php if($m['kolejny_poziom'] == "TAK" && !empty($m[$m['id']]['url'])) : ?>
  6.                 <ul>
  7.                 <?php foreach($m[$m['id']] as $m1): ?>
  8.                     <li>
  9.                         <a href="<?php echo url::base().$m1['url'];?>"><?php echo $m1['tekst'];?></a>
  10.                     </li>
  11.                 <?php endforeach; ?>
  12.                 </ul>
  13.                 <?php endif; ?>
  14.             </li>
  15.         <?php endforeach; ?>
  16.         </ul>

Mam nadzieję, że tym razem ktoś mi podpowie, co źle zrobiłem

Temat do zamknięcia, już sobie poradziłem
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.