Temat: CakePHP, Komponent -> dostęp do bazy

Witam,

Jak uzyskać bezpośrednio z komponentu dostęp do bazy ?

Mam coś takiego:

<?php
function _zrob_obiekt($nazwa) {
    $obj = & new $nazwa();
    return $obj;
}
       
function _zapytanie_do_bazy($zapytanie) {
    $klasy = get_declared_classes();
    $moje_klasy = array('Podstrony', 'Aktualnosci', 'Szukaj', 'Newsletter'); // moje klasy w folderze controllers
           
    for ($i = 0; $i < count($klasy); $i++) {
        for ($j = 0; $j < count($moje_klasy); $j++) {
            if ($klasy[$i] == $moje_klasy[$j] && class_exists($moje_klasy[$j])) {
                $this->Test = $this->_zrob_obiekt($moje_klasy[$j]);
                return $this->Test->query($zapytanie);
            }
        }
    }
}
?>



a chciałbym mieć dostęp do bazy w stylu $this->query($zapytanie); lub coś podobnego - bez sprawdzania który 'controllers' jest aktualnie aktywny... - jest mi to potrzebne do m.in. generowania menu, które jest na każdej stronie takie samo...

Z góry dziękuje za odpowiedź.

2

Odp: CakePHP, Komponent -> dostęp do bazy

Witam.
Nie znam odpowiedzi na Twoje pytanie, ponieważ nie spotkałem się dotąd w żadnym komponencie z pobieraniem nazwy kontrolera w którym był wywoływany, może bardziej zaawansowani użytkownicy znają taki sposób.
Ja natomiast mogę natomiast podzielić się z Tobą, jak ja wyświetlam menu.

Napisałem sobie komponent, który przy logowaniu pobiera menu dla danej grupy użytkowników.
Do tego komponentu dołożyłem jeszcze helper, który wykorzystuję do wyświetlania elementów menu i jeśli istnieje - submenu. Można również dodawać grafiki dla elementów, a po przejściu do danej strony z menu, jego odpowiednia pozycja jest oznaczana.

Jeśli byłbyś zainteresowany kodem źródłowym, to daj znać.
Pozdrawiam.

3

Odp: CakePHP, Komponent -> dostęp do bazy

Dziękuje za odpowiedź.

Jeśli możesz wyślij mi kod źródłowy -> cakeowiec[małpa]gmail[kropka]com

Pozdrawiam

4

Odp: CakePHP, Komponent -> dostęp do bazy

Komponent :

<?php

class tabMenuComponent extends Object
{

    var $controller = true;

    var $user_model = 'User';
    var $group_model = 'Group';
    var $menu_model = 'Menu';
    var $melement_model = 'Melement';
    var $msubelemen_model = 'Msubelement';
    var $components = array('Session');

 
    function startup(&$controller)
    {
        $this->controller = $controller;
    }
    
    function init($group_id){

        $menu = $this->controller->{$this->user_model}->{$this->group_model}->{$this->menu_model}->findAll(array('Menu.group_id'=>$group_id),null,null,null,null,2);
        $this->Session->write('full_menu', $menu[0]);
    }
    
    function getMenu(){
        return $this->Session->read('full_menu');
    }
}

?>

Helper:

<?php
class tabMenuHelper extends Helper{

    var $helpers = array('Html');
    var $li_class_main = "activated";
    var $li_class_sub = "activated_sub";
    
    var $main_menu_container = 'tnavmenu';
    var $sub_menu_container = 'tnavsubmenu';


    function showMenu($menu, $sub = true){
    
        $submenu = '';
        $result = "<div id=\"" . $this->main_menu_container  . "\"><ul>\n";
        
        foreach ($menu['Melement'] as $melement){
             $result.=$this->getMenuElement($melement, $submenu, $sub);
        }
        $result .= "</ul></div>\n";
        
        if ($sub)
            $result .= "<div id=\"". $this->sub_menu_container ."\"><ul>" . $submenu . "</ul></div>\n";
        
        return $result;
    }
    
    function getSubmenuElement($submenu){
        
        $result = '';
                
        foreach ($submenu as $subelement){
            
            if($this->getActionNameCurrentPath() == $this->getActionNameLinkPath($subelement['link'])){
                $result .= '<li class="'.$this->li_class_sub .'">';
                
            }else{
                $result .= '<li>';
            }

            if ($subelement['img'] != ''){
                $obj = $this->Html->image($subelement['img']) . '<br/>' . $subelement['name'];
            }else{
                $obj = $subelement['name'];
            }            

            $result .= $this->Html->link($obj ,$subelement['link'],array('title'=>trim($subelement['name'])),false,false). "</li>\n"; 
        }
        
        return $result;
    
    }

    function getMenuElement($melement, &$submenu, $sub){

        $result = '';
                
            if($this->getControllerNameCurrentPath() == $this->getControllerNameLinkPath($melement['link'])){
                $result .= '<li class="'.$this->li_class_main .'">';
                if ($sub){
                    $submenu =$this->getSubmenuElement($melement['Msubelement']);
                }
                
            }else{
                $result .= '<li>';
            }

            if ($melement['img'] != ''){
                $obj = $this->Html->image($melement['img']) . '<br/>' . $melement['name'];
            }else{
                $obj = $melement['name'];
            }
            
            $result .= $this->Html->link($obj ,$melement['link'],array('title'=>trim($melement['name'])),false,false). "</li>\n"; 
        
        return $result;
    }

    
    function getControllerNameCurrentPath(){
        return $this->params['controller'];
    }
    
    function getControllerNameLinkPath($link){
        $tmp = explode('/',$link);
        return $tmp[1];
    }
    
    function getActionNameCurrentPath(){
        return $this->param['action'];
    }
    
    function getActionNameLinkPath($link){
        $tmp = explode('/',$link);
        return !empty($tmp[2]) ? $tmp[2] : 'index';
    }        
}
?>

Kod sql dla Postgres'a

CREATE TABLE menus
(
  id serial NOT NULL,
  group_id integer,
  CONSTRAINT pk_menus PRIMARY KEY (id),
)


CREATE TABLE melements
(
  id serial NOT NULL,
  menu_id integer NOT NULL,
  name character varying(50),
  link character varying(255),
  img character varying(255),
  CONSTRAINT pk_column_id PRIMARY KEY (id),
) 


CREATE TABLE msubelements
(
  id serial NOT NULL,
  melement_id integer,
  name character varying(50),
  link character varying(255),
  img character varying,
  CONSTRAINT pk_msubelement_id PRIMARY KEY (id)
)

Dla stworzony tabel tworzymy modele a w nich dwie asocjacje:
* menu hasMany melement
* melement hasMany msubelement.

Dodajemy helper i komponent do kontrolera:

var $helpers = array('tabMenu');
var $components = array('tabMenu')

Po udanej akcji logowania, pobieramy id grupy użytkownika i odpalamy akcje komponentu.

$group_id = $this->User->field('group_id',array('username'=>$this->data['User']['username']));    
$this->tabMenu->init($group_id);

Potem w layoucie, lub gdziekolwiek w widoku uruchamiamy:

echo $tabMenu->showMenu($this->controller->tabMenu->getMenu(), false);

Ostatni parametr ustawiony jako false powoduje że nie pobierane będą elementy submenu.

Ostatnio edytowany przez maciek (2008-02-24 15:59:12)

5

Odp: CakePHP, Komponent -> dostęp do bazy

Dzięki !