Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: include
Forum PHP.pl > Forum > PHP
polkom21
Witajcie. Otóż pisze taki troszkę większy cms i zabrałem się za mod_rewrite. Chwila czytania w sieci i już kumam jak to działa napisałem sobie tam wszystko i teraz pytanie. Jak mam adres: strona.pl/page/temat_jakis.html (oryginalnie powinien wyglądać tak bez mod_rewrite: strona.pl/?action=page&title=temat_jakis) i jak otrzymać zmienną title do dalszej obróbki?


Dobra to działa ale za to mam problem z includowaniem pliku. Muszę pobierać plik przez file_get_content() gdyż zbudowałem silnik styli i w pliku który jest stylem mam np taki kod:

  1. Użytkownik: {$user->name}

i mam kod który zamienia mi { i } na <?php ?> no i to nie działa. kod php widać normalnie w źródle i nie jest on wyświetlany. Co mam z tym zrobić żeby to zadziałało?
CuteOne
  1. function renderTemplate($templateName, $vars) {
  2. extract($vars, EXTR_OVERWRITE);
  3. $myTemplate = '';
  4.  
  5. require $templateName;
  6. $myTemplate = ob_get_contents();
  7.  
  8. return $myTemplate;
  9. }
  10.  
  11. renderTemplate('templatka.php', arra('name' => $row->name));
polkom21
Dobra jest git tylko pytanie jak zrobić żeby tablica sama zapełniła się wartościami objętymi w {}
Crozin
1. Skorzystać z gotowego, "pełnoprawnego" systemu szablonów, np. PHPTAL, Twig, OPT, Smarty czy cokolwiek tam uznasz za stosowne.
2. Nie korzystać z żadnego dodatkowego narzędzia i użyć czystego PHP, który de facto również jest systemem szablonów.
polkom21
1. Nie skorzystam z gotowego systemu szablonów.
2. Piszę CMS i chcę żeby można było wybierać z jakiego stylu chce się korzystać
3. Jeżeli nie chcesz pomóc to się nie odzywaj.
Tajgeer
Skoro masz problem z wykonaniem funkcji, którą podał Ci CuteOne, to jak Ty sobie wyobrażasz dalsze pisanie CMS'a? Crozin wskazał Ci możliwe rozwiązania, a Ty wyjeżdżasz z tekstem, że "jeżeli nie chcesz pomóc, to się nie odzywaj". Trochę pokory.
polkom21
Tylko, że tyle to ja sam sobie napisałem z resztą i tak jakoś sobie poradzę bo czekać zanim się wymądrzą Ci, którzy najmniej wiedzą to szkoda czasu.
Tajgeer
Nie rozumiem w takim razie po co opisujesz na forum swoje problemy, skoro Ty wszystko wiesz najlepiej. Jak już pisałem trochę pokory - wiele osób jest na pewno od Ciebie mądrzejszych. Crozin się do nich zalicza, a mimo wszystko potrafiłeś go tylko "uciszyć" mimo, że Ci na pewno rozjaśnił niektóre sprawy.
polkom21
No wybacz jeżeli bym chciał to bym skorzystał z gotowego frameworka ale chodzi o to że nie chcę i dla tego pisze a że każdy zamiast pomóc to weź sobie gotowca no to sory ale take teksty mnie wkurzają.
Tajgeer
Wyjaśnijmy jedną rzecz:

Piszesz CMS'a czy swój framework?
polkom21
To będzie CMS

Wyświetla mi coś takiego w źródle:
  1. <!DOCTYPE HTML>
  2. <meta charset="UTF-8" />
  3. <title>Strona główna</title>
  4. </head>
  5. Zawartość strony: Strona <?php $test ?> Jakiś tam tekst i <?php $next ?> i tekst<?php $name ?>
  6. </body>
  7. </html>

Zrobiłem tak żeby zamieniało wszystko jak chciałem tylko właśnie tak w kodzie mi wyświetla dziadosko i nie działa.
Klasa styli:
  1. <?php
  2.  
  3. class template {
  4. public $file;
  5. public $output;
  6. public $values = array();
  7.  
  8. function __construct($file){
  9. $this->file = $file;
  10. $this->output = file_get_contents($file);
  11. }
  12.  
  13. function set($key, $value){
  14. $this->values[$key] = $value;
  15. }
  16.  
  17. function output(){
  18. foreach($this->values as $key => $value){
  19. $tagsToReplace = "{".$key."}";
  20. $this->output = str_replace($tagsToReplace, $value, $this->output);
  21. }
  22. return $this->output;
  23. }
  24. function page($page){
  25. if(!isset($page)){
  26. $this->page = file_get_contents("template/index.php");
  27. $this->prase($this->page);
  28. return $this->page;
  29. } else {
  30. $this->page = file_get_contents("template/".$page.".php");
  31. $this->prase($this->page);
  32. $this->renderTemplate($this->page);
  33. return $this->page;
  34. }
  35. }
  36. function prase($page){
  37. $file = $this->page;
  38. $tekst = split("[{}]", $file);
  39. $wielkosc = count($tekst);
  40. $i = 1;
  41. $s = 0;
  42. while ($i <= $wielkosc -1) {
  43. //$tablica[klucz][wartosc];
  44. $tablica[] = array("{".$tekst[$i]."}", $tekst[$i]);
  45. $i = $i + 2;
  46. $s++;
  47. }
  48. $ile = count($tablica);
  49. for($a=0; $a<$ile; $a++){
  50. $this->page = str_replace($tablica[$a][0], "<?php ".$tablica[$a][1]." ?>", $this->page);
  51. }
  52. }
  53. function renderTemplate($name){
  54. $myTemplate = '';
  55. print_r($name);
  56. $myTemplate = ob_get_contents();
  57. return $myTemplate;
  58. }
  59.  
  60.  
  61. }
  62.  
  63. ?>
untorched
Jak to mówią różni dziwni ludzie: TRZĘSE SIĘ...

Linijka nr 50:
  1. $this->page = str_replace($tablica[$a][0], "<?php ".$tablica[$a][1]." ?>", $this->page);

Zamień na:
  1. $this->page = str_replace($tablica[$a][0], $tablica[$a][1], $this->page);
polkom21
No to się trzęś bo zamiast nazwy zmiennej ma mi wyświetlić jej zawartość a poza tym to już tego sposobu próbowałem smile.gif Czekam na dalsze podpowiedzi bo szczerze pierwszy raz piszę obiektowo w php i taki większy CMS pisze. Kto ma jakiś pomysł jak zaspokoić moją zachciankę?
Tajgeer
Od biedy można eval użyć ;-)
polkom21
No dobra mam to:
  1. function page($page){
  2. if(!isset($page)){
  3. $this->page = file_get_contents("template/index.php");
  4. $this->prase($this->page);
  5. return $this->page;
  6. } else {
  7. $this->page = file_get_contents("template/".$page.".php");
  8. $this->prase($this->page);
  9. $this->renderTemplate($this->page);
  10. return $this->page;
  11. }
  12. }
  13.  
  14. function renderTemplate($name){
  15. $this->page = eval("\$name = \"$name\";");
  16. }

i nie wyświetla mi wcale pliku. Jakie dalej pomysły?
untorched
  1. class Template {
  2.  
  3. private $varibles = array();
  4.  
  5. public function __construct() {}
  6.  
  7. public function set($name, $value)
  8. {
  9. $this->varibles[$name] = $value;
  10. }
  11.  
  12. public function parse($filename)
  13. {
  14. if(file_exists('template/'.$filename.'.php') === FALSE)
  15. {
  16. die('Nie mozna odnalezc pliku z szablonem!');
  17. }
  18.  
  19. $content = file_get_contents('template/'.$filename.'.php');
  20.  
  21. foreach($this->varibles as $name => $value)
  22. {
  23. $content = str_replace('{$'.$name.'}', $value, $content);
  24. }
  25.  
  26. echo $content;
  27. }
  28.  
  29. };
  30.  
  31. $test = new Template();
  32. $test->set('test', 'Jakas tresc zmiennej');
  33. $test->parse('glowna');


Prosta klasa robiąca dokładnie to czego potrzebujesz..
polkom21
No nie działa tak jak chcę bo w jak w głównym template mam {$menu} {$content} {$label} to zamiast każdej mają być wrzucone dane z następnych plików w których też są dane w {} gdzie chciał bym żeby samo przekłądało kod w {} na wykonany kod php.
Tajgeer
Przejrzyj sobie pliki źródłowe np. Smarty i będziesz wiedział, jak osiągnąć to, co chcesz.
polkom21
Wyświetla mi taki kod:
  1. Strona <?php $test ?> Jakiś tam tekst i <?php $next ?> i tekst<?php $name ?>

czy jest to możliwe, że przez mod_rewrite mi tak wświetla i nie wykonuje tego co jest w php? W .htaccess mam tak:

DirectoryIndex index.php przerwa.html

RewriteEngine On
RewriteRule ^([^/]*).html /?action=$1 [L]
ethann
  1. <?php $name ?>

Zastanów się co robi ten fragment kodu... Bo on nie robi nic.

  1. <?php echo $name ?>
  2. <?=$name?> // potrzebne włączone short_tags
polkom21
Ale ten kod php w ogóle nie powinien być widoczny w źródle.
untorched
Dałem Ci przykład klasy, która parsowała tak jak chcesz. To nie było gotowe rozwiązanie, wystarczy przerobić pod swoje potrzeby. Zrobiłem to za ciebie, może Ci się przyda..

  1. class Template {
  2.  
  3. private $varibles = array();
  4.  
  5. public function __construct() {}
  6.  
  7. public function set($name, $value)
  8. {
  9. $this->varibles[$name] = $value;
  10. }
  11.  
  12. public function parse($filename, $print = TRUE)
  13. {
  14. if(file_exists('template/'.$filename.'.php') === FALSE)
  15. {
  16. die('Nie mozna odnalezc pliku z szablonem!');
  17. }
  18.  
  19. $content = file_get_contents('template/'.$filename.'.php');
  20.  
  21. foreach($this->varibles as $name => $value)
  22. {
  23. $content = str_replace('{$'.$name.'}', $value, $content);
  24. }
  25.  
  26. // Czyszczenie tablicy zmiennych
  27. $this->varibles = array();
  28.  
  29. // Wyświetlanie szablonu
  30. if($print === TRUE) echo $content;
  31.  
  32. // Zwracanie parsowanego szablonu
  33. return $content;
  34. }
  35.  
  36. };
  37.  
  38. $test = new Template();
  39.  
  40. // menu
  41. $test->set('jakas_zmienna_w_menu', 'Treść jakiejś zmiennej w menu');
  42. $menu = $test->parse('menu', FALSE);
  43.  
  44. // content
  45. $test->set('jakas_zmienna_w_content', 'Jakaś inna treść w content');
  46. $content = $test->parse('content', FALSE);
  47.  
  48. // label
  49. $test->set('jakas_zmienna_w_label', 'Bla bla bla :)');
  50. $label = $test->parse('label', FALSE);
  51.  
  52. // całość
  53. $test->set('menu', $menu);
  54. $test->set('content', $content);
  55. $test->set('label', $label);
  56.  
  57. $test->set('test', 'Jakas tresc zmiennej');
  58. $test->parse('glowna');
polkom21
Tylko że mnie nie satysfakcjonuje odręcznie wpisywanie każdej wartości dla każdej zmiennej.
Tajgeer
Masz podwaliny, przerób tak, aby Ci pasowało. W czym problem?

Przerób funkcję set tak, aby mogła ona przyjmować także tablicę, jeśli nie chcesz kilka razy pisać $test->set().
polkom21
Ale ja chcę żeby to samo mi wyszukiwało i podmieniało na wartości zmiennych, które są zawarte w klamrach.
untorched
Jeśli masz problem z podstawowymi rzeczami to ja nie wiem jak ty chcesz stworzyć tego twojego CMS'a. preg_replace i preg_match. A tak po za tym to nie stosuje się takiej metody, gdyż można sobie gdzieś wyświetlić coś czego się nie chce..
polkom21
Pierwszy raz piszę coś takiego jak system szablonów więc wybacz ale nie muszę od razu wiedzieć co i jak a poza tym człowiek uczy się całe życie.
abort
Cytat(polkom21 @ 20.08.2012, 14:45:13 ) *
Ale ja chcę żeby to samo mi wyszukiwało i podmieniało na wartości zmiennych, które są zawarte w klamrach.

No to napisz kod. Kod "SAM" się nie napisze. Inaczej nie byłoby zawodu programisty.
polkom21
Na tyle głupi to ja nie jestem żebym nie wiedział że kod sam się nie napisze.

Koniec kombinowania. Jednak zrobię tak jak untorched mi podał mam nadzieję, że dalej też będzie wszystko pasowało. Już i tak za dużo czasu straciłem na kombinowanie nad tym. Dzięki wszystkim za pomoc.

Tak z lekka odkopuje temat gdyż na stronie głównej mają być newsy więc napisałem taką klasę :

  1. class post_viev {
  2.  
  3. function viev($ile) {
  4. $exit = '';
  5. $result = mysqla::query('*', 'posts', 'id', $ile);
  6. while ($p = mysql_fetch_array($result)) {
  7. Template::set('title', $p['title']);
  8. Template::set('date', $p['date']);
  9. Template::set('cat', $p['cat']);
  10. Template::set('tresc', $p['tresc']);
  11. $exit = $exit.Template::parse('index', FALSE);
  12. }
  13. return $exit;
  14.  
  15. }
  16. }


i wywala mi, że nie mozna odnalezc pliku z szablonem! i tu pytanie dlaczego.
Mam taką strukturę folderów:

Klasa post_viev jest w pliku inc/viev.php
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.