Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: template, extract i foreach
Forum PHP.pl > Forum > PHP
kfc4
Witam,

Mam klasę widok:
  1. <?php
  2. class widok {
  3.    // Zmienne:
  4.    private $_szablon;
  5.    private $_zmienne = array();
  6.    
  7.    // Funkcje:
  8.    public function __construct($nazwa) {
  9.        if (!file_exists("home/widok/".$nazwa.".php"))
  10.            throw new Exception("Nie znaleziono widoku: ".$nazwa);
  11.        $this->_szablon = file_get_contents("home/widok/".$nazwa.".php");
  12.    }
  13.    
  14.    public function __set($nazwa, $wartosc) {
  15.        $this->_zmienne[$nazwa] = $wartosc;
  16.    }
  17.    
  18.    public function pokaz() {
  19.        ob_start();
  20.        extract($this->_zmienne, EXTR_OVERWRITE);
  21.        eval("?>".$this->_szablon);
  22.        ob_end_flush();
  23.    }
  24. }


W innym pliku ją wywołuję
  1. <?php
  2. $test = new widok("test");
  3.        
  4.        $test->lol = "hi";
  5.        $test->tytul = "tytul";
  6.        
  7.        $test->tablica = array (
  8.        'bah' => 'qwe',
  9.        'bah' => 'rty',
  10.        );
  11.        
  12.        $test->pokaz();
  13. ?>

A widok.php wygląda tak:
  1. <html>
  2. <head>
  3. <title><?php echo $tytul ?></title>
  4. </head>
  5. <body>
  6. <?php echo $lol; ?>
  7. <br>
  8. <br />
  9. <?php
  10. foreach ($tablica as $asd) {
  11.    echo $asd['bah'];
  12.    echo "<hr>";
  13. }
  14. ?>
  15. </body>
  16. </html>


Wynik całości:
  1. <title>tytul</title>
  2. </head>
  3. hi<br>
  4. <br />
  5. r<hr></body>
  6. </html>


Jak widać pętla foreach nie działa jak trzeba. Więc tu powstaje moje pytanie: Jak używać pętel (i warunków) w systemach szablonów?
Nie chce używać gotowych rozwiązań z prostego względu - chcę się czegoś nauczyć.

I jeszcze jedno
  1. <?php
  2. print_r($this->_zmienne);
  3.        print_r($tablica);
  4. ?>
Daje

  1. <?php
  2. (
  3.    [lol] => hi
  4.    [tytul] => tytul
  5.    [tablica] => Array
  6.        (
  7.            [bah] => rty
  8.        )
  9.  
  10. )
  11. (
  12.    [bah] => rty
  13. )
  14. ?>
kfc4
Zrobiłem print_r i (nie jestem specem, ale) wydaje mi się, że __set() nawala, znaczy nie pobiera/zapisuje tablicy.
@grn: ewaluować kod ręcznie
? Jak?
grn
  1. <?php
  2. foreach ($tablica as $asd) {
  3.   echo $asd['bah'];
  4.   echo "<hr>";
  5. }
  6. ?>

Tutaj niepotrzebnie jest nawias kwadratowy. Zmienna $asd będzie w tej pętli przyjmowała kolejne wartości z tablicy. Obecnie sprawa wygląda tak:
  1. zmienna $asd ustawiana jest na 'rty'. Jest to jedyny element tablicy,
  2. $asd['bah'] oznacza znak o indeksie 'bah' w ciągu 'rty'. Ciąg 'bah' ewaluowany w kontekście numerycznym to 0. Dlatego zwracane jest 'r'.

Dołączenie szablonu możesz zrealizować poprzez include w metodzie pokaz.
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.