Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: $this-> nie działa. Dlaczego?
Forum PHP.pl > Forum > PHP > Object-oriented programming
matii578
Proszę o pomoc. Opis błędu i reszty jest poniżej...

Mam główny plik index.php
  1. <?php
  2.  
  3. include("core/init.php");
  4.  
  5. $controller = isset($_GET['ctrl'])?$_GET['ctrl']:'index';
  6. $view = isset($_GET['view'])?$_GET['view']:'v_index';
  7.  
  8. switch($controller){
  9.  
  10. case 'index':
  11.  
  12.  
  13. break;
  14.  
  15.  
  16. }
  17.  
  18. include($_SERVER['DOCUMENT_ROOT'] . 'li/controllers/' . $controller . '/' . $controller . '.php');
  19.  
  20.  
  21.  
  22. ?>


W którym jest dołączany plik core/init.php
  1. <?php
  2.  
  3. define("STRONA","http://localhost/li/");
  4. define("ZASOBY","http://localhost/li/res/");
  5. define("SCIEZKA",str_replace("\\", "/", dirname("core")) . "/"); // dirname(__FILE__); zwraca katalog w którym jest plik init.php
  6.  
  7.  
  8. include("models/m_template.php");
  9. include("models/m_logowanie.php");
  10. include("models/m_rejestracja.php");
  11.  
  12.  
  13. $server = 'localhost';
  14. $user = 'li_admin';
  15. $pass = 'imperia';
  16. $db = 'li';
  17.  
  18.  
  19. require_once("core/core.php");
  20.  
  21. $Core = new Core($server,$user,$pass,$db);
  22.  
  23.  
  24.  
  25. ?>


Z kolei w init.php jest dołączany plik core/core.php
  1. <?php
  2.  
  3. class Core {
  4.  
  5. public $Template, $Log, $Database, $Rejestracja;
  6.  
  7. function __construct($server, $user, $pass, $db) {
  8.  
  9. $this->Database = new mysqli($server, $user, $pass, $db);
  10. $this->Database->set_charset('utf8');
  11.  
  12. include(STRONA . "models/m_template.php");
  13. $this->Template = new Template();
  14. $this->Template->setAlertTypes(array('succes', 'warning', 'error'));
  15.  
  16. include(STRONA . "models/m_logowanie.php");
  17. $this->Log = new Login();
  18.  
  19. include(STRONA . "models/m_rejestracja.php");
  20. $this->Rejestracja = new Register();
  21.  
  22.  
  23. }
  24.  
  25. function __destruct() {
  26. $this->Database->close();
  27. }
  28.  
  29. }
  30.  
  31.  
  32. ?>


A w nim models/m_template.php
  1. <?php
  2.  
  3. class Template {
  4.  
  5.  
  6. //public $zasoby;
  7. //private $zasoby = 'http://localhost/li/res/';
  8.  
  9. private $data;
  10. private $alertTypes;
  11.  
  12. function __construct() {
  13.  
  14. }
  15.  
  16. function load($url) { // FUNKCJA DOŁĄCZAJĄCA PLIKI
  17. include($url);
  18. }
  19.  
  20. function load_once($url) { // FUNKCJA DOŁĄCZAJĄCA PLIKI
  21. include_once($url);
  22. }
  23.  
  24. function redirect($url) { // FUNKCJA DOŁĄCZAJĄCA PLIKI
  25. header("Location: $url");
  26. }
  27.  
  28. function setAlertTypes($types){ // FUNKCJA USTAWIAJĄCA TYPY ALERTÓW
  29. $this->alertTypes = $types;
  30. }
  31.  
  32. function setAlert($value, $type = null){ // FUNKCJA USTAWIAJĄCA KOMUNIKAT (ALERT)
  33. if($type == ''){
  34. $type = $this->alertType[0];
  35. }
  36. $_SESSION[$type][] = $value; //zapisujemy wartość do zmiennej sesjiw której kluczem jest typ alertu.
  37. }
  38.  
  39. function getAlerts(){ // FUNKCJA WYŚWIETLAJĄCA ALERT W POSTACI LISTY PUNKTOWANEJ
  40. $data = '';
  41. foreach($this->alertTypes as $alert){ // alertTypes przechowuje tablicę w której są typy alertów.
  42. if(isset($_SESSION[$alert])){
  43. foreach($_SESSION[$alert] as $value){ //foreach przeanalizuje zmienną sesji której kluczem jest jeden z typów alertu i wypisze je w postaci listy
  44. $data .= '<li class="' . $alert . '">' . $value .'</li>';
  45. }
  46. unset($_SESSION[$alert]); // usunięcie zmiennej sesji z przeanalizowanm typem alertu jako klucz.
  47. }
  48. }
  49. return $data;
  50. }
  51.  
  52. function setData($name, $value) { // FUNKCJA USTAWIAJĄCA DANE
  53. $this->data[$name] = htmlentities($value, ENT_QUOTES);
  54. }
  55.  
  56. function getData($name) { // FUNKCJA WYŚWIETLAJĄCA DANE
  57. if(isset($this->data[$name])) {
  58. return $this->data[$name];
  59. } else {
  60. return '';
  61. }
  62. }
  63.  
  64. function makeLink($ctrl, $view, $action = NULL) {
  65. if($action == NULL) {
  66. return 'index.php?cltr='.$ctrl.'&view='.$view.'';
  67. } else {
  68. return 'index.php?cltr='.$ctrl.'&view='.$view.'&action='.$action.'';
  69. }
  70. }
  71.  
  72. }
  73.  
  74.  
  75. ?>


W głównym pliku index dołączam również kontroller (controllers/index/index.php)
  1. <?php
  2.  
  3. $Core->Template->load_once(STRONA . 'views/templates/' . $controller . '/header.php'); //NAGŁÓWEK ŁADUJĘ METODĄ KLASY TEMPLATE KTÓRA ZOSTAŁA ZAINICJOWANA (STWORZONA) W KONSTRUKTORZE KLASY CORE
  4.  
  5.  
  6.  
  7. switch($view){
  8.  
  9. case 'v_rejestracja':
  10.  
  11.  
  12. if(isset($_POST['login'])) {
  13. $Core->Template->setData('reg_login', $_POST['login']);
  14. $Core->Template->setData('reg_email', $_POST['email']);
  15.  
  16. if($Core->Rejestracja->checkRegisterData($_POST['login'], $_POST['email'], $_POST['haslo'], $_POST['p_haslo'])
  17. && $Core->Rejestracja->checkUsername($_POST['login'])){
  18.  
  19. $type = 1;
  20. $Core->Rejestracja->register($_POST['login'], $_POST['email'], $_POST['haslo'], $type);
  21. $Core->Template->redirect(STRONA . 'index.php');
  22.  
  23. } else {
  24.  
  25. $Core->Template->load_once(STRONA . 'views/index/v_rejestracja.php');
  26. }
  27.  
  28. } else {
  29.  
  30. $Core->Template->load_once(STRONA . 'views/index/v_rejestracja.php');
  31. }
  32.  
  33. break;
  34.  
  35. }
  36.  
  37.  
  38. $Core->Template->load_once(STRONA . 'views/' . $controller . '/' . $view . '.php'); //TU W TEN SAM SPOSÓB ŁADUJĘ WIDOK
  39.  
  40.  
  41.  
  42. $Core->Template->load_once(STRONA . 'views/templates/' . $controller . '/footer.php');
  43.  
  44.  
  45. ?>


Gdy w linku występuje index.php?ctrl=index&view=v_rejestracja to dołączany zostaje widok views/index/v_rejestracja.php... W kodzie poniżej komentarzami zaznaczyłem błędy

  1. <div id="content">
  2. <p>
  3.  
  4. <?php
  5. $alerts = $this->getAlerts(); //UŻYWAM $this-> BO ZAŁADOWAŁEM TEN PLIK METODĄ KLASY TEMPLATE, A FUNKCJA getAlerts(); NALEŻY DO TEJ KLASY ALE TU WYRZUCA BŁĄD SCREEN'A WKLEJĘ PONIŻEJ.
  6. if($alerts != '') {
  7. echo '<ul class="alerts">' . $alerts . '</ul>';
  8. }
  9. ?>
  10.  
  11. </p>
  12.  
  13.  
  14.  
  15. <p>
  16. <form action="" method="post" id="login">
  17. <table border="0" cellpadding="4">
  18. <tr><td>Login: </td><td><input id="login" name="login" size="50" maxlength="50" value="<?php echo $this->getData('reg_login'); //TU PEWNIE TEŻ WYRZUCI BŁĄD ?>" /></td></tr>
  19. <tr><td>Email: </td><td><input id="email" name="email" size="50" maxlength="50" value="<?php echo $this->getData('reg_email'); ?>" /></td></tr>
  20. <tr><td>Hasło: </td><td><input type="password" id="haslo" name="haslo" size="20" maxlength="20" /></td></tr>
  21. <tr><td>Powtórz hasło: </td><td><input type="password" id="p_haslo" name="p_haslo" size="20" maxlength="20" /></td></tr>
  22. <td></td>
  23. <tr><td><input type="submit" value="Wyślij" /></td><td><input type="reset" value="Reset" /></td></tr>
  24. </table>
  25. </form>
  26. </p>
  27.  
  28. </div>


Screen tego błędu:

SCREEN

na te teksty na screen'ie typu "ctrl jest" nie zwracajcie uwagi. Sprawdzałem nimi czy dołącz mi wszystkie pliki biggrin.gif

Czym to może być spowodowane? Bardzo zależy mi na odpowiedzi, bo bez tego dalej nie ruszę sad.gif
mstraczkowski
$this można używać tylko w ciele klasy.
Ty próbujesz użyć $this w zwykłym pliku PHP/HTML.

By the way: Widzę, że próbujesz trzymać się jakiś standardów, nazywasz pliki kontrolerami, widokami, modelami.
Ale w twoim przypadku to niestety są tylko nazwy

Twoje pliki z prawdziwymi kontrolerami / modelami / widokami nie mają raczej wiele wspólnego.
Troszkę idziesz w złym kierunku, to nie tak powinno to wszystko wyglądać.

Innymi słowy - obiektowość twojego kodu jest tutaj mocno naciągana
matii578
ale jak dam tam $Core->Template->getAlerts(); to jest znowu taki błąd:

błąd2
mstraczkowski
Twój plik "widoku" nie ma czegoś takiego jak $Core
Jest on wczytywany przez metodę load_once za pomocą include_once i tyle.
Nie ma on dostępu do abstrakcji, do twoich klas.

Innymi słowy, musisz mu jakoś przekazać obiekt, na którym chcesz operować.
W tym przypadku, musisz wymyślić co zrobić, aby z widoku móc się odwołać do klasy Template
matii578
A mógłbyś coś podpowiedzieć.. Bo ja praktycznie nie mam doświadczenia bo dopiero jestem w 2 kl technikum.

zamieniłem w tym moim "kontrolerze" $Core->Template->load_once(STRONA . 'views/index/v_rejestracja.php'); na
$Core->Template->load_once('views/index/v_rejestracja.php');

i w widoku z $this-> nie wyrzuca już błędu, tylko całość się tak jakby łączy nie w tej kolejni=ości co powinna.. Czy dalej jest coś nie tak, bo this już działa?

Screen
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.