Ocena wątku:
- 0 głosów - średnia: 0
- 1
- 2
- 3
- 4
- 5
Code Igniter - dołączanie kontrolera do widoku
|
Liczba postów: 5
Liczba wątków: 1
Dołączył: 27-10-2014
Reputacja:
0
27-10-2014, 21:17
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.
Liczba postów: 62
Liczba wątków: 7
Dołączył: 28-02-2010
Reputacja:
1
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
Liczba postów: 5
Liczba wątków: 1
Dołączył: 27-10-2014
Reputacja:
0
29-10-2014, 23:06
(Ten post był ostatnio modyfikowany: 29-10-2014, 23:07 przez Kazuhiro.)
(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.
Liczba postów: 62
Liczba wątków: 7
Dołączył: 28-02-2010
Reputacja:
1
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.
Liczba postów: 5
Liczba wątków: 1
Dołączył: 27-10-2014
Reputacja:
0
Oczywiście kod znajduje się w klasie, ale pokazanie tego nie było już istotne.
Wszystko działa, dzięki  . 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?
Liczba postów: 62
Liczba wątków: 7
Dołączył: 28-02-2010
Reputacja:
1
Liczba postów: 5
Liczba wątków: 1
Dołączył: 27-10-2014
Reputacja:
0
Liczba postów: 62
Liczba wątków: 7
Dołączył: 28-02-2010
Reputacja:
1
31-10-2014, 16:12
(Ten post był ostatnio modyfikowany: 31-10-2014, 16:13 przez msx83.)
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.
Liczba postów: 5
Liczba wątków: 1
Dołączył: 27-10-2014
Reputacja:
0
(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
|
Użytkownicy przeglądający ten wątek:
|
|
Sponsorzy i przyjaciele
|
|
|