Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Code Igniter - dołączanie kontrolera do widoku
#1
Question 
Witajcie!
Ostatnio uczę się CI, ale napotkałem na pewien problem. Stworzyłem layout i w jednym divie chcę umieścić kontroler. W przypadku, gdy zostanie znaleziony plik cookie, bądź sesja została zainicjowana, pokazuje menu usera, w przeciwnym wypadku wyświetla prośbę o zalogowanie się, bądź rejestrację. Nic specjalnie skomplikowanego. Napisałem taki skrypt (kontroler), jednak mam problem z umieszczeniem go w widoku (layoucie). Próbowałem nawet includować ten skrypt w widoku (co wiązało się ze zmianą ustawień php.ini [allow_url_string] i mam wrażenie, że nie jest to zbyt bezpieczne). Niby skrypt został umieszczony poprawnie, jednak przestał spełniać swoją podstawową rolę, tj. bez względu na to, czy ciasteczko zostało utworzone, czy nie - zachęca do rejestracji.

Zaznaczam, ze jest to moje pierwsze spotkanie z MVC. Szukałem odpowiedzi na to pytanie w manualu, a także czytałem ogólne informacje na temat MVC.
Odpowiedz
#2
Witam.
Nie kontroler umieszczasz w layoucie tylko na odwrót. Jak sama nazwa wskazuje kontroler, kontroluje czy jesteś zalogowany czy nie (ciasteczko ustawione lub brak ciastka) i na tej podstawie wyświetla odpowiednie div-y (layout, formularz rejestracyjny lub logowania).
Pokarz kod, to może ktoś pomoże.
Pozdrawiam
Odpowiedz
#3
(29-10-2014, 22:31)msx83 napisał(a): Witam.
Nie kontroler umieszczasz w layoucie tylko na odwrót. Jak sama nazwa wskazuje kontroler, kontroluje czy jesteś zalogowany czy nie (ciasteczko ustawione lub brak ciastka) i na tej podstawie wyświetla odpowiednie div-y (layout, formularz rejestracyjny lub logowania).
Pokarz kod, to może ktoś pomoże.
Pozdrawiam
Wiem o to chodzi, jednak jeśli spróbuję umieścić w widoku zmienną i wysłać do niej wynik funkcji, to jest ona wyrzucana nad <html>. Wiem, że ten kod nie jest jeszcze dopracowany - zmieniałem go już kilka razy, sprawdzając, czy zadziała. Dlatego na razie traktuję go raczej jako szkielet, niż gotowy kod:
Kod PHP:
    function log_user(){
        
$this->load->database();
        
$this->load->library('form_validation');
        
$this->load->library('code_cookie');
        
//Jeśli istnieje plik cookie
        
if(isset($_SESSION['log']) ) {
            
$login $this->code_cookie->uncode_id($_COOKIE['log'] );
            
$pass $this->code_cookie->uncode_pass($_COOKIE['log'] );
            
$query $this->db->query("SELECT login, password FROM register WHERE login='" .$login"' AND password='" .$pass"'");
            if(
$query->num_rows == 1){
                echo 
'Witaj ' $login "<br />";    
                
$this->load->view('user_menu');        
            } else {
                
setcookie("log"""0);            
            }
        } else {
        if(isset(
$_COOKIE['log']) ){
            
$login $this->code_cookie->uncode_id($_COOKIE['log'] );
            
$pass $this->code_cookie->uncode_pass($_COOKIE['log'] );
            
$query $this->db->query("SELECT login, password FROM register WHERE login='" .$login"' AND password='" .$pass"'");
            if(
$query->num_rows == 1){
                echo 
'Witaj ' $login "<br />";    
                
$this->load->view('user_menu');        
            } else {
                
setcookie("log"""0);            
            }
    

        } else {
            echo 
'Witaj <b> Nieznajomy</b><br />';    
            echo 
"<a href='register'>Zarejestruj się</a> | <a href='login'>Zaloguj</a><br /><a href='remmember-password'>Nie pamiętam hasła</a>";    
        }
}    
    }
    
    function 
test(){
        
$this->load->view('testowy');    
    }
    function 
index(){
        
$data = array(
            
'log'    => $this->test()
        );
        
        
$this->load->view('themes'$data);


Na tym przykładzie nawet widać, że próbowałem wywołać testową funkcję z samym widokiem, niestety... nic to nie dało.
Odpowiedz
#4
Jeżeli są to metody jakiejś klasy, to pół bidy, ale jeżeli próbujesz odpalić to inaczej to ja wysiadam.
Metoda "Index" w klasach CI jest wywoływana automatycznie, tak więc w tym kodzie próbujesz do elementu "log" tablicy "data" przekazać zawartość metody "test", która wywołuje widok "testowy", który z kolei i tak jest źle zwracany przez metode, bo powinien wyglądać mniej więcej tak:
Kod PHP:
function test(){
    return 
$this->load->view('testowy'', '', true);

Jeżeli chodzi o resztę kodu, to w tym przykładzie nie jest wywołana, więc nie wiem w czym tkwi problem.
Pozdrawiam.
Odpowiedz
#5
Oczywiście kod znajduje się w klasie, ale pokazanie tego nie było już istotne.
Wszystko działa, dzięki Smile. A co zrobić, zeby nie musieć za każdym razem kopiować metody. Jak to zrobić zgrabnie. Biblioteki można ładować automatycznie. A co zrobić z kontrolerami?
Odpowiedz
#6
Odpowiedz
#7
Odpowiedz
#8
Nie szkodzi.
Utwórz np.
Mian_Controller.php
Kod PHP:
Class Main_Controller extends CI_Controller {
    function 
__construct() {
        
parent::__construct();
        
// załaduj biblioteki i inne bzdety
        
$this->load->library('form_validation');
        
$this->load->library('code_cookie');
    }
    function 
main_method_one() {
        return 
'główna metoda głównego kontrolera';
    }
    function 
main_method_two() {
        
//ciało funkcji
    
}

Inny_Controller.php
Kod PHP:
Class Inny_Controller extends Main_Controller {
    function 
__construct() {
        
parent::__construct();
        
// masz juz dostęp do załadowanych bibliotek z main_controller.php
    
}
    function 
moja_funkcja() {
        
$var $this->main_method_one();
        
$this->data['dane'] = $var;
        
$this->load->view('layout'$this->data['dane']);
    }

Wszystko masz ładnie zrobione w wersji CI z GitHuba, którego link podałem wyżej.
Odpowiedz
#9
(31-10-2014, 16:12)msx83 napisał(a): Nie szkodzi.
Utwórz np.
Mian_Controller.php
Kod PHP:
Class Main_Controller extends CI_Controller {
    function 
__construct() {
        
parent::__construct();
        
// załaduj biblioteki i inne bzdety
        
$this->load->library('form_validation');
        
$this->load->library('code_cookie');
    }
    function 
main_method_one() {
        return 
'główna metoda głównego kontrolera';
    }
    function 
main_method_two() {
        
//ciało funkcji
    
}

Inny_Controller.php
Kod PHP:
Class Inny_Controller extends Main_Controller {
    function 
__construct() {
        
parent::__construct();
        
// masz juz dostęp do załadowanych bibliotek z main_controller.php
    
}
    function 
moja_funkcja() {
        
$var $this->main_method_one();
        
$this->data['dane'] = $var;
        
$this->load->view('layout'$this->data['dane']);
    }

Wszystko masz ładnie zrobione w wersji CI z GitHuba, którego link podałem wyżej.

Wielkie dzięki
Odpowiedz


Podobne wątki…
Wątek: Autor Odpowiedzi: Wyświetleń: Ostatni post
  [pytanie z Yii] jak edytować layout z poziomu kontrolera? R_Rafalsky 4 4,051 26-10-2011, 01:59
Ostatni post: R_Rafalsky
  [PHP][CI]Code Igniter problem z headerem edix92 8 7,369 03-02-2011, 23:59
Ostatni post: Pedro84

Skocz do:


Użytkownicy przeglądający ten wątek:
Sponsorzy i przyjaciele
SeoHost.pl