Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Code Igniter - problem z odczytem cookie w inclkudowanym pliku
Forum PHP.pl > Forum > Przedszkole
Testosteron
Witajcie.

Stworzyłem kontroler, który sprawdza, czy została zainicjowana sesja, a jeśli nie to czy istnieje plik cookie. Jeżeli jeden z tych warunków został spełniony, zostaje wyświetlone menu usera, w przeciwnym wypadku zostaje wyświetlona prośba o zalogowanie, bądź rejestrację. Testowałem go na "sucho" i wszystko działa ok, do czasu kiedy includowałem ten skrypt do mojego layoutu (co wiązało się także z koniecznością uruchomienia opcji allow_url_include w php.ini). Otóż, za każdym razem nie można odnaleźć pliku cookie. Stworzyłem więc nowy, uproszczony skrypt dla testu. Efekt jest dokładnie taki sam. Plik ten wygląda następująco
  1. <?php
  2.  
  3. class Nowy extends ci_Controller{
  4. function index(){
  5. if(isset($_COOKIE['log'])){
  6. echo 'Jesteś zalogowany';
  7. } else {
  8. echo 'Jesteś niezalogowany<br /><a href="login">Zaloguj</a>';
  9. }
  10. }
  11.  
  12. }
  13.  
  14. ?>

W widoku mam natomiast:
  1. <?php
  2. $this->load->helper('url');
  3. $a = base_url() . 'nowy';
  4. include($a);
  5. ?>
memory
Czemu includujesz controller do widoku ?
Testosteron
Ponieważ chcę, zeby w określonym miejscu layoutu znalazł się ten skrypt. Wiem, ze można dołączyć dane do widoku z kontrolera za pomocą tablicy, ale w tym przypadku chcę, żeby ten skrypt był dołączony do każdego pliku i ten sposób wydawał mi się prostszy.
memory
Poczytaj o architekturze MVC, oraz dokumentacje CI. To co teraz tworzysz to czysta herezja, która nie ma prawa zadziałać.

Testosteron
Zaglądałem do manuala CI, ale nie znalazłem tam informacji, które pomogłyby mi w zrealizowaniu tego zadania. O samej architekturze także czytałem i to nie tylko w manualu CI, ale teraz specjalnie sięgnąłem do innych stron, opisujących (ogólnie) tę problematykę. Niestety nie daje mi to praktycznej wiedzy, jak rozwiązać ten problem. Możesz dać mi przynajmniej jakieś wskazówki?
markonix
Jeżeli skrypt ma być wywoływany w wielu miejscach to zrób z niego helper.
Jednak znacznie lepszym pomysłem jest umieszczenie tego skryptu w kontrolerze. Jeżeli skrypt ma być wywoływany w wielu funkcjach (podstronach) to umieść go po prostu w konstruktorze, a jeżeli w całej aplikacji to stwórz MY_Controller.
Testosteron
Właśnie utworzyłem z niego kontroler, tylko nie wiem jak go zgrabnie dołączyć do widoku, tak, żeby stał sie jego częścią.

W tej chwili stworzyłem jeden layout w którym chcę umieścić ten skrypt, a przejściu na kolejne podstrony zmienia się tylko content.
markonix
Cytat(Testosteron @ 26.10.2014, 20:03:37 ) *
Właśnie utworzyłem z niego kontroler, tylko nie wiem jak go zgrabnie dołączyć do widoku, tak, żeby stał sie jego częścią.

Używasz takich sformułowań jakbyś w ogóle nie rozumiał idei MVC.

Z kontrolera masz przekazywać do widoku odpowiednią zmienną, a nie odwrotnie.
Testosteron
Tak też próbowałem, tj.
  1. $data = array(
  2. 'log' => $this->log_user()
  3. );
  4.  
  5. $this->load->view('themes', $data);


Wynik wykonania jest wyrzucany nad <html>.

Pisałeś też, że mogę stworzyć helper. Musiałbym jednak przebudować kod, ponieważ korzystam w nim z bibliotek.
rad11
To uzyj go w odpowiednim miejscu w widoku.
Testosteron
Użyłem. Jeżeli zamiast metody wrzucę zwykłego stringa to wszystko jest ok.
Turson
Pokaż kod metody log_user
Testosteron
  1. function log_user(){
  2. $this->load->database();
  3. $this->load->library('form_validation');
  4. $this->load->library('code_cookie');
  5. //Jeśli istnieje plik cookie
  6. if(isset($_SESSION['log']) ) {
  7. $login = $this->code_cookie->uncode_id($_COOKIE['log'] );
  8. $pass = $this->code_cookie->uncode_pass($_COOKIE['log'] );
  9. $query = $this->db->query("SELECT login, password FROM register WHERE login='" .$login. "' AND password='" .$pass. "'");
  10. if($query->num_rows == 1){
  11. echo 'Witaj ' . $login . "<br />";
  12. $this->load->view('user_menu');
  13. } else {
  14. setcookie("log", "", 0);
  15. }
  16. } else {
  17. if(isset($_COOKIE['log']) ){
  18. $login = $this->code_cookie->uncode_id($_COOKIE['log'] );
  19. $pass = $this->code_cookie->uncode_pass($_COOKIE['log'] );
  20. $query = $this->db->query("SELECT login, password FROM register WHERE login='" .$login. "' AND password='" .$pass. "'");
  21. if($query->num_rows == 1){
  22. echo 'Witaj ' . $login . "<br />";
  23. $this->load->view('user_menu');
  24. } else {
  25. setcookie("log", "", 0);
  26. }
  27.  
  28.  
  29. } else {
  30. echo 'Witaj <b> Nieznajomy</b><br />';
  31. echo "<a href='register'>Zarejestruj się</a> | <a href='login'>Zaloguj</a><br /><a href='remmember-password'>Nie pamiętam hasła</a>";
  32. }
  33. }
  34. }

Ten sam problem występuje, jeśli stworzę testową klasę, drukującą jakiś komunikat.
Turson
Echo w metodzie? Łamiesz zasady MVC
Testosteron
Wiem, wiem. Na razie chcę stworzyć szkielet, który będzie działał.
Turson
Próbujesz przekazać do widoku metodę, która pluje echo, wyświetla content, ładuje widok i w ogóle. Zacznij wolniej ale poprawnie.
Testosteron
Przeprowadziłem mały test. Stworzyłem nową metodę, która ładuje jakiś tam widom. W widoku tym znajduje się tylko tekst. Efekt jest dokładnie taki sam. Tak jak zaznaczałem wcześniej - to jest moja pierwsza styczność z MVC i ciężko jest na początku wszystko ogarnąć.

Z tego co zauważyłem, jeśli metoda zwraca int, to widok normalnie odbierą taką wartość. W przypadku, gdy wysyłam stringa, zaczynają się problemu. To co? Mam wysyłać int'y, a w widoku zrobić instrukcję warunkową switch? Na razie tylko to przychodzi mi do głowy, chociaż skrypt będzie później trudniejszy w modyfikacji.
markuz
application/controllers/TestController.php
  1. class TestController extends CI_Controller
  2. {
  3. public function index()
  4. {
  5. $zmienna = "Cześć!";
  6. $this->load->view('test/index', array('zmienna' => $zmienna));
  7. }
  8. }


application/views/test/index.php
  1. <h1><?php echo $zmienna; ?></h1>
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.