Autor | Zpráva | ||
---|---|---|---|
sir_lamoid Profil |
Dobrý den,
snažím se naprogramovat jednoduchý redakční systém v architektuře MVC, ale narážím na chybu Fatal error: Call to a member function vypisView() on a non-object in C:\wamp\www\xx\xxx\view\rozlozeni.phtml on line 239 Můj zkraceny kod rozlozeni.phtml <meta name="description" content="<?= $popis ?>" /> <meta name="keywords" content="<?= $klicova_slova ?>" /> <meta name="author" content="Jakub Stejskal" /> <title><?= $titulek ?></title> ....... ... .... <?php foreach ($zpravy as $zprava) : ?> <p class="zprava"><?= $zprava ?></p> <?php endforeach ?> <!-- End page header --> <!-- Your awesome content goes here --> <?php $this->controller->vypisView() ?> <?php // Výchozí Controller abstract class Controller { // Pole, jehož indexy jsou poté viditelné v šabloně jako běžné proměnné protected $data = array(); // Název šablony bez přípony protected $view = ""; // Hlavička HTML stránky protected $hlavicka = array('titulek' => '', 'klicova_slova' => '', 'popis' => ''); // Funkce rekurzivně ošetří hodnoty v poli $data tak, aby je bylo možné // bezpečně vypsat v šabloně. Ošetřují se řetězce a to i ve vnořených // polích. Objekty (které v šabloně většinou nejsou třeba) si musíte ošetřit manuálně. private function osetri($x = null) { if (!isset($x)) return null; elseif (is_string($x)) return htmlspecialchars($x); elseif (is_array($x)) { foreach($x as $k => $v) { $x[$k] = $this->osetri($v); } return $x; } else return $x; } // Vyrenderuje view public function vypisView() { if ($this->view) { extract($this->osetri($this->data)); extract($this->data, EXTR_PREFIX_ALL, ""); require("view/" . $this->view . ".phtml"); } } // Přesměruje na dané URL public function presmeruj($url) { header("Location: $url"); header("Connection: close"); exit; } // Hlavní metoda controlleru abstract function zpracuj($parametry); } // Funkce pro zjednodušené manuální zabezpečení vstupů v případě, že chceme // zabezpečit jen některé části pole $data a ostatní již obsahují HTML výstup function o($s) { return htmlspecialchars($s); } <?php // Router je speciální typ controlleru, který podle URL adresy zavolá // správný controller a jím vytvořený view vloží do šablony stránky class SmerovacController extends Controller { // Instance controlleru protected $controller; // Metoda převede pomlčkovou variantu controlleru na název třídy private function pomlckyDoVelbloudiNotace($text) { $veta = str_replace('-', ' ', $text); $veta = ucwords($veta); $veta = str_replace(' ', '', $veta); return $veta; } // Naparsuje URL adresu podle lomítek a vrátí pole parametrů private function parsujURL($url) { // Naparsuje jednotlivé části URL adresy do asociativního pole $naparsovanaURL = parse_url($url); // Odstranění počátečního lomítka if (mb_strpos($naparsovanaURL["path"], "/") === 0) $naparsovanaURL["path"][0] = ""; // Rozbití řetězce podle lomítek $rozdelenaCesta = explode("/", $naparsovanaURL["path"]); // Odstranění bílého místa z částí řetězce for ($i = 0; $i < count($rozdelenaCesta); $i++) $rozdelenaCesta[$i] = trim($rozdelenaCesta[$i]); return $rozdelenaCesta; } // Naparsování URL adresy a vytvoření příslušného controlleru public function zpracuj($parametry) { $naparsovanaURL = $this->parsujURL($parametry[0]); // Výchozí URL pokud je zadána prázdná if (!$naparsovanaURL[0]) $naparsovanaURL = array('pacman-remake'); // Vytvoření controlleru $mc = new ManazerClanku(); // Pokud existuje článek s URL co je v 1. parametru, controller je ArticleController if ($mc->clanekExistuje($naparsovanaURL[0])) $this->Controller = new ClanekController($naparsovanaURL[0]); else { // Článek nenalezen, Controller je 1. parametr URL $tridaControlleru = $this->pomlckyDoVelbloudiNotace(array_shift($naparsovanaURL)) . 'Controller'; if (file_exists('controller/' . $tridaControlleru . '.php')) $this->Controller = new $tridaControlleru; else { header("HTTP/1.0 404 Not Found"); exit; } } // Volání controlleru $this->Controller->zpracuj($naparsovanaURL); // Nastavení proměnných pro šablonu $this->data['titulek'] = $this->Controller->hlavicka['titulek']; $this->data['popis'] = $this->Controller->hlavicka['popis']; $this->data['klicova_slova'] = $this->Controller->hlavicka['klicova_slova']; $this->data['zpravy'] = Zprava::vratZpravy(); // Nastavení hlavní šablony $this->view = 'rozlozeni'; } } |
||
Tori Profil |
#2 · Zasláno: 12. 2. 2014, 08:48:16
sir_lamoid:
V jakém kontextu spouštíte tu druhou šablonu? Zřejmě $this odkazuje na něco jiného, než čekáte.
|
||
Tori Profil |
#3 · Zasláno: 13. 2. 2014, 14:04:14
Až teď jsem si všimla:
šablona: $this->controller->vypisView()
router: protected $controller; ale: $this->Controller = new $tridaControlleru; (ř. 49 + 55)
Tomuhle typu chyb se dá předcházet např. tím, že všechny třídy budou potomkem nějakého základního objektu, který bude při pokusu o přiřazení do nedefinované vlastnosti házet výjimku (viz Nette\Object ).
|
||
Časová prodleva: 10 let
|
0