Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Undefined Index a isset zwraca true...
Forum PHP.pl > Forum > PHP
Matiash
Witam,

Otóż PHP powiadamia mnie w bardzo dziwnej sytuacji, a mianowicie odbieram sobie zmienną w widoku poprzez
  1. $view['url']
. Gdy robię na zmiennej
  1. isset($view['url'])
to zwraca mi true. Natomiast gdy poniżej w tym samym widoku odnoszę się do zmiennej, to wyskakuje mi taka notyfikacja:
  1. Undefined index: url w linijce 29 w pliku: /opt/lampp/htdocs/moj framework - php/view/main.php

Ponadto nawet po takim warningu, zmienna posiada prawidłową, rzeczywistą wartość;

W razie czego napiszę jak zmienne są z kontrolera do widoku przekazywane. Proszę o jakiekolwiek sugestie.
wookieb
A kod to Twoje cycki, że boisz się pokazać?
Matiash
Nie chodzi o to, że boję się pokazać ale sporo tego jest. Zatem do dzieła:



indexController
  1. class indexController extends BaseController {
  2. public function index() {
  3. $url = $this->registry->settings->getSettings('mainurl');
  4. $this->registry->view->url = $url; //$this->registry->view jest obiektem klasy View
  5. //wywolanie widoku
  6. $this->registry->view->show('main', array('top', 'middle', 'footer'));
  7.  
  8. }
  9. }


View
  1. class View {
  2. private $_registry;
  3. private $_vars = array();
  4. private $_path;
  5.  
  6. public function __construct($registry) {
  7. $this->_registry = $registry;
  8. }
  9.  
  10. public function __set($index, $value) {
  11. $this->_vars[$index] = $value;
  12. }
  13.  
  14. //pokazuje okreslony widok
  15. public function show($view, $view_modules = array()) {
  16. // Ładowanie zmiennych do widoku
  17. if (!class_exists($view)) {
  18. //TODO obsluzyc jesli brak widoku
  19. throw new Exception ('Nie można wczytać widoku: '. $view);
  20. }
  21.  
  22. foreach ($view_modules as $value) {
  23. if (!is_callable("{$view}::{$value}")) {
  24. //TODO obsluzyc niepoprawny modul widoku
  25. throw new Exception('Nie można wczytać modułu wiodku: '.$value.' w widoku: '.$view);
  26. } else {
  27. call_user_func("{$view}::{$value}", $this->_vars);
  28. }
  29. }
  30. }
  31.  
  32.  
  33. }


Widok main:

  1. class main {
  2. private function __construct() {
  3.  
  4. }
  5.  
  6. public static function top($view) {
  7. if (isset($view['url']) && !is_null($view['url'])) {
  8. echo $view['url']; //pokazuje prawidlowy url
  9. } else {
  10. echo "test";
  11. }
  12. //echo var_dump($view);
  13. echo '
  14. <!DOCTYPE html>
  15. <html lang="en">
  16. <head>
  17. <meta charset="utf-8" />
  18. <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame
  19. Remove this if you use the .htaccess -->
  20. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
  21. <title>new_file</title>
  22. <meta name="description" content="" />
  23. <meta name="author" content="Maciek" />
  24. <meta name="viewport" content="width=device-width; initial-scale=1.0" />
  25. <!-- Replace favicon.ico & apple-touch-icon.png in the root of your domain and delete these references -->
  26. <link rel="shortcut icon" href="/favicon.ico" />
  27. <link rel="apple-touch-icon" href="/apple-touch-icon.png" />
  28. <link rel="stylesheet" type="text/css" href="'.$view['url'].'/css/style.css" /> <!--zwraca, że jest undefined index-->
  29. </head>
  30. <body>
  31. top<hr><br /><br/>
  32. ';
  33. }
  34.  
  35. public static function middle($view) {
  36. echo '
  37. <a href="'.$view['url'].'/register">Zarejestruj się</a>';
  38. }
  39.  
  40. public static function footer($view) {
  41. echo '
  42. <br /><br /><hr>footer
  43. </body>
  44. </html>
  45. ';
  46. }
  47. }


Co ciekawe tylko, w metodzie "top", zwraca ten błąd.

wookieb
A więc tak
  1. if ( << tutaj sprawdzasz czy moja zabawka dinozaur (czytaj $view['url']) istnieje >> ) {
  2. << suuuupeer, mamo mamo dinozarł jest! >>>
  3. } else {
  4. << nie mam dinozarła :( >>
  5. }
  6. << mamo mamo, nie wiem czy jest dinozarł ale ja go chcem bo tata mi obiecał pod "hojinke"! :( >>

Jeżeli wiesz co robi IF to dlaczego chcesz się bawić w epokę jurajską skoro nie masz pewności, czy posiadasz odpowiednie osobniki?
Matiash
Tego ifa tylko testowo wrzuciłem. Załóżmy, że go tam nie ma. To dlaczego w metodzie middle, spokojnie mogę się odnosić do zmiennej $view['url'] a w metodzie top wyskakuje ten warning.
wookieb
Nieprawda. W obu miejscach mamusia daje ci po łapach wałkiem z resztkami ciasta pierogowego i krzyczy, że nie dostałeś "dinozałra pod hoinke".
Matiash
Heh, dobra pewnie masz rację, jednak nurtuje mnie dlaczego, jeśli z metody "top" usunę zmienną
  1. $view['url]

pozostawiając ją natomiast w metodzie "middle", php nie zwraca, żadnego warningu (choć powinien).
wookieb
Ciągle się mylisz. Dlaczego nie słuchasz mamusi?
Mam przed "ocyma" ten kod i jak byk
Kod
Notice: Undefined index: url in test.php on line 69
// echo '<a href="'.$view['url'].'/register">Zarejestruj się</a>';
Matiash
Problem polegał na tym, że widok error, dziedziczył po main i nadpisywał tylko metodę 'middle'. Natomiast w kontrolerze "error" nie przesyłałem zmiennej "url". Stąd te warningi...wookieb mnie nakierował smile.gif
wookieb
Dziedziczenie klas aby obsługiwały szablony... bardzo słaby pomysł. Polecam zapoznac się z TWIG-iem. Tam istnieje dobrze zrealizowany, podoby mechanizm.
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.