polkom21
18.08.2012, 23:58:00
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:
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
19.08.2012, 11:27:56
function renderTemplate($templateName, $vars) {
$myTemplate = '';
require $templateName;
return $myTemplate;
}
renderTemplate('templatka.php', arra('name' => $row->name));
polkom21
19.08.2012, 11:35:02
Dobra jest git tylko pytanie jak zrobić żeby tablica sama zapełniła się wartościami objętymi w {}
Crozin
19.08.2012, 11:42:10
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
19.08.2012, 11:44:33
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
19.08.2012, 12:03:00
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
19.08.2012, 13:48:39
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
19.08.2012, 14:03:16
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
19.08.2012, 14:30:49
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
19.08.2012, 15:06:52
Wyjaśnijmy jedną rzecz:
Piszesz CMS'a czy swój framework?
polkom21
19.08.2012, 21:12:03
To będzie CMS
Wyświetla mi coś takiego w źródle:
<!DOCTYPE HTML>
Zawartość strony: Strona <?php $test ?> Jakiś tam tekst i <?php $next ?> i tekst<?php $name ?>
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:
<?php
class template {
public $file;
public $output;
public $values = array();
function __construct($file){
$this->file = $file;
}
function set($key, $value){
$this->values[$key] = $value;
}
function output(){
foreach($this->values as $key => $value){
$tagsToReplace = "{".$key."}";
$this->output = str_replace($tagsToReplace, $value, $this->output); }
return $this->output;
}
function page($page){
$this->prase($this->page);
return $this->page;
} else {
$this->prase($this->page);
$this->renderTemplate($this->page);
return $this->page;
}
}
function prase($page){
$file = $this->page;
$tekst = split("[{}]", $file); $wielkosc = count($tekst); $i = 1;
$s = 0;
while ($i <= $wielkosc -1) {
//$tablica[klucz][wartosc];
$tablica[] = array("{".$tekst[$i]."}", $tekst[$i]); $i = $i + 2;
$s++;
}
for($a=0; $a<$ile; $a++){
$this->page = str_replace($tablica[$a][0], "<?php ".$tablica[$a][1]." ?>", $this->page); }
}
function renderTemplate($name){
$myTemplate = '';
return $myTemplate;
}
}
?>
untorched
19.08.2012, 22:25:46
Jak to mówią różni dziwni ludzie:
TRZĘSE SIĘ...
Linijka nr 50:
$this->page = str_replace($tablica[$a][0], "<?php ".$tablica[$a][1]." ?>", $this->page);
Zamień na:
$this->page = str_replace($tablica[$a][0
], $tablica[$a][1
], $this->page);
polkom21
19.08.2012, 22:36:25
No to się trzęś bo zamiast nazwy zmiennej ma mi wyświetlić jej zawartość a poza tym to już tego sposobu próbowałem

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
19.08.2012, 23:05:34
Od biedy można
eval użyć ;-)
polkom21
19.08.2012, 23:33:38
No dobra mam to:
function page($page){
$this->prase($this->page);
return $this->page;
} else {
$this->prase($this->page);
$this->renderTemplate($this->page);
return $this->page;
}
}
function renderTemplate($name){
$this->page = eval("\$name = \"$name\";"); }
i nie wyświetla mi wcale pliku. Jakie dalej pomysły?
untorched
20.08.2012, 00:17:25
class Template {
private $varibles = array();
public function __construct() {}
public function set($name, $value)
{
$this->varibles[$name] = $value;
}
public function parse($filename)
{
if(file_exists('template/'.$filename.'.php') === FALSE) {
die('Nie mozna odnalezc pliku z szablonem!'); }
foreach($this->varibles as $name => $value)
{
$content = str_replace('{$'.$name.'}', $value, $content); }
}
};
$test = new Template();
$test->set('test', 'Jakas tresc zmiennej');
$test->parse('glowna');
Prosta klasa robiąca dokładnie to czego potrzebujesz..
polkom21
20.08.2012, 09:08:00
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
20.08.2012, 10:21:41
Przejrzyj sobie pliki źródłowe np. Smarty i będziesz wiedział, jak osiągnąć to, co chcesz.
polkom21
20.08.2012, 11:22:41
Wyświetla mi taki kod:
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
20.08.2012, 11:38:24
<?php $name ?>
Zastanów się co robi ten fragment kodu... Bo on nie robi nic.
<?=$name?> // potrzebne włączone short_tags
polkom21
20.08.2012, 11:47:21
Ale ten kod php w ogóle nie powinien być widoczny w źródle.
untorched
20.08.2012, 12:07:39
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..
class Template {
private $varibles = array();
public function __construct() {}
public function set($name, $value)
{
$this->varibles[$name] = $value;
}
public function parse($filename, $print = TRUE)
{
if(file_exists('template/'.$filename.'.php') === FALSE) {
die('Nie mozna odnalezc pliku z szablonem!'); }
foreach($this->varibles as $name => $value)
{
$content = str_replace('{$'.$name.'}', $value, $content); }
// Czyszczenie tablicy zmiennych
$this->varibles = array();
// Wyświetlanie szablonu
if($print === TRUE) echo $content;
// Zwracanie parsowanego szablonu
return $content;
}
};
$test = new Template();
// menu
$test->set('jakas_zmienna_w_menu', 'Treść jakiejś zmiennej w menu');
$menu = $test->parse('menu', FALSE);
// content
$test->set('jakas_zmienna_w_content', 'Jakaś inna treść w content');
$content = $test->parse('content', FALSE);
// label
$test->set('jakas_zmienna_w_label', 'Bla bla bla :)');
$label = $test->parse('label', FALSE);
// całość
$test->set('menu', $menu);
$test->set('content', $content);
$test->set('label', $label);
$test->set('test', 'Jakas tresc zmiennej');
$test->parse('glowna');
polkom21
20.08.2012, 13:22:27
Tylko że mnie nie satysfakcjonuje odręcznie wpisywanie każdej wartości dla każdej zmiennej.
Tajgeer
20.08.2012, 13:24:02
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
20.08.2012, 13:45:13
Ale ja chcę żeby to samo mi wyszukiwało i podmieniało na wartości zmiennych, które są zawarte w klamrach.
untorched
20.08.2012, 15:40:28
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
20.08.2012, 16:49:30
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
20.08.2012, 17:19:50
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
23.08.2012, 16:01:45
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ę :
class post_viev {
function viev($ile) {
$exit = '';
$result = mysqla::query('*', 'posts', 'id', $ile);
Template::set('title', $p['title']);
Template::set('date', $p['date']);
Template::set('cat', $p['cat']);
Template::set('tresc', $p['tresc']);
$exit = $exit.Template::parse('index', FALSE);
}
return $exit;
}
}
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.