Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Szablony w bazie danych?
Forum PHP.pl > Forum > PHP
sivyer
Witam,

Od dluzszego czasu zastanawialem sie nad pewna kwestia. Mam zamiar dac uzytkownikom mojego serwisu mozliwosc ustalania, po zarejestrowaniu sie w serwisie, kolejnosci wyswietlania poszczegolnych elementow strony. Zaczelo sie od tworzenia szablonu plikow dla kazdego uzytkownika i zapisywania go na serwerze, co z poczatku wydawalo mi sie dobrym rozwiazaniem, ale jesli zarejestrowaloby sie kilkaset osob, czy nawet kilka tysiecy, to chyba nie byloby zbyt optymalne rozwiazanie..

Teraz wpadlem na pomysl, aby te dane przechowywac w bazie danych. A konkretniej, w jednej tabeli sa dane modulow, razem z szablonem tego modulu (zaleznie od "skorki" strony), a w drugiej ustawienia uzytkownika:
- mdl_templates (tabela z szablonami modulow)
- user_modules (tabela z ustawieniami uzytkownika)

[sql:1:8b9ea98938]
CREATE TABLE mdl_templates (
skinID tinyint(3) unsigned NOT NULL default '0',
moduleID tinyint(2) unsigned NOT NULL default '0',
moduleName varchar(32) NOT NULL default '',
moduleTpl mediumtext NOT NULL
) TYPE=MyISAM;

CREATE TABLE user_modules (
userID tinyint(3) unsigned NOT NULL default '0',
moduleID tinyint(3) unsigned NOT NULL default '0',
moduleColumn char(1) NOT NULL default '',
moduleOrder tinyint(2) unsigned NOT NULL default '0'
) TYPE=MyISAM;
[/sql:1:8b9ea98938]

I teraz, przy wejsciu na strone, sprawdzamy czy uzytkownik ma zapisane cookie (czyli jest zalogowany). Jesli nie, to formularz do logowania, jesli sie uda, to moze sobie wybrac kolejnosc modulow, przenosic je z jednej kolumny do drugiej itd (to bedzie zadanie dla skryptu JavaScript). Jesli autoryzacja wypadnie pomyslnie, uzytkownik zostanie przeniesiony na strone glowna zbudowana dynamicznie w oparciu o jego ustawienia, szablon dynamicznie zostanie doklejony do szablonu podstawowego.

W tym miejscu jest dla mnie niewiadoma. Czy istnieje mozliwosc "parsowania" szablonu-hybrydy (tzn. czesc szablonu w pliku na serwerze, reszta doklejana z bazy danych i dopiero przeslany do parsera)? Z tego co slyszalem, Smarty daje takie mozliwosci. Bo jezeli szablon z bazy zostanie do szablonu podstawowego "doklejony" juz po dzialaniu np. Smarty, to psu na bude taka metoda, ale jesli najpierw zostanie ten szablon uzupelniony i dopiero przeslany do Smarty, to o to mi wlasnie chodzi smile.gif

Z gory zaznaczam, ze w takich zagadnieniach stawiam dopiero pierwsze kroki, dlatego prosze Was o komentarze co do mojego rozwiazania, wskazowki czy jakiekolwiek komentarze, ktore moga mi pomoc smile.gif Moze ktos z Was ma juz doswiadczenia w podobnych projektach i moglby sie podzielic ta wiedza? Bede bardzo wdzieczny za wszelkie konstruktywne uwagi.
sivyer
Mam dostep do netu w pracy, wiec siedze i szukam informacji na ten temat. Jakby ktos rowniez kiedys mial taki problem, podaje linki do artykulow, jakie na ten temat udalo mi sie znalezc:
http://www.phpinsider.com/smarty-forum/vie...te+resource+dbx
http://www.phpinsider.com/smarty-forum/vie...topic.php?t=517.
http://www.bblog.com/sourcecode/bblog/inc/...php.source.html
http://www.onlamp.com/pub/a/php/2003/04/17...ear_smarty.html

No i z manuala co nieco:
http://smarty.php.net/manual/en/plugins.resources.php

--
edycja: jeden znacznik za duzo smile.gif
edycja2: nowe linki
FiDO
Widzisz teraz jak sie oplaca czytac manuala... smile.gif
Od deski do deski ale po lepkach, tyle tylko zeby wiedziec jakie sa mozliwosci, bez zaglebiania sie w szczegoly (to dopiero w razie potrzeby).
sivyer
Wszystkim, ktorym przyjdzie sie kiedys zmierzyc z takim problemem, polecam sciagniecie systemu Xoops, ktory wykorzystuje Smarty i korzysta z szablonow przechowywanych m.in. w bazie danych. Sa tam funkcje do obslugi tego typu szablonow, ja wlasnie zabieram sie za ich przegladanie smile.gif Zawsze to cos..

Sukces (połowiczny) smile.gif
[sql:1:ab96fe013d]
CREATE TABLE `templates` (
`id` tinyint(1) NOT NULL auto_increment,
`nazwa` varchar(50) NOT NULL default '',
`template` text NOT NULL,
`timestamp` int(10) NOT NULL default '0',
KEY `id` (`id`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

INSERT INTO `templates` VALUES (1, 'footer.tpl', '</BODY>rn</HTML>', 1061925760);
INSERT INTO `templates` VALUES (2, 'header.tpl', '<HTML>rn<HEAD>rn<TITLE>{$tpl_name} - {$tbl_name}</TITLE>rn</HEAD>rn<BODY bgcolor="#ffffff">', 1061925750);
INSERT INTO `templates` VALUES (3, 'index.tpl', '{include file="db:header.tpl" title="Tytuł jak tytuł"}rnrn<PRE>rnSzablony pobierane z bazy danych, z tabeli {$tbl_name}.rnrnNazwa obecnego szablonu: {$tpl_name}rnrn</PRE>rnrn{include file="db:footer.tpl"}', 1061925572);
[/sql:1:ab96fe013d]

Plik "resource.db.php"
[php:1:ab96fe013d]
<?php
function smarty_resource_db_source($tpl_name, &$tpl_source, &$smarty_obj) {
global $db;
$tpl_source = $db->get_var("SELECT template FROM templates WHERE nazwa='$tpl_name'");
return true;
}

function smarty_resource_db_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj) {
global $db;
$tpl_timestamp = $db->get_var("SELECT timestamp FROM templates WHERE nazwa='$tpl_name'");
return true;
}

function smarty_resource_db_secure($tpl_name, &$smarty_obj) {
return true;
}


function smarty_resource_db_trusted($tpl_name, &$smarty_obj){

}
?>[/php:1:ab96fe013d]
Plik "index.php"
[php:1:ab96fe013d]
<?php

include('./libs/ez_sql.php');
require './libs/Smarty.class.php';

$smarty = new Smarty;

$smarty->compile_check = true;
$smarty->debugging = false;

$smarty->assign("tbl_name", "templates");
$smarty->assign("tpl_name", "index.tpl");

// Inicjuje obiekt db (ezSql)
$db = new db("root", "", "smarty", "localhost");
$smarty->display('db:index.tpl');
?>[/php:1:ab96fe013d]

I działa smile.gif
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.