xProteuSx Posted July 4, 2016 Share Posted July 4, 2016 I am starting a project that is way over my head. As usual, I will be learning a lot as I go. The short and skinny: a website that allows users to select which theme they would like to use. My file structure is like this: www.website.com www.website.com/index.html www.website.com/about.html www.website.com/contact.html //default theme www.website.com/theme/default/index.html www.website.com/theme/default/about.html www.website.com/theme/default/contact.html //theme 1 www.website.com/theme/theme1/index.html www.website.com/theme/theme1/about.html www.website.com/theme/theme1/contact.html //theme 2 www.website.com/theme/theme2/index.html www.website.com/theme/theme2/about.html www.website.com/theme/theme2/contact.html So, I think its pretty self explanatory. I would like the URL's to always be: www.website.com www.website.com/index.html www.website.com/about.html www.website.com/contact.html But I want these files to change depending on the theme selected. So, if the user selects "theme 1": www.website.com/index.html -> will display content of -> www.website.com/theme/theme1/index.html www.website.com/about.html -> will display content of -> www.website.com/theme/theme1/about.html www.website.com/contact.html -> will display content of -> www.website.com/theme/theme1/contact.html I have done a bunch of research, but all I seem to find are tutorials and articles about using the include(), include_once(), and require() functions. Any pointers to some better content? Is there a shortcut that can be taken? Something akin to .htaccess rewrite? Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/ Share on other sites More sharing options...
Muddy_Funster Posted July 4, 2016 Share Posted July 4, 2016 What exactly changes between themes that you need to re-write all the content every time? Normally I would do something like: ---------------------------------------------- wbsite.com/index.php website.com/about.ctnt website.com/contact.ctnt website.com/css/primary.css website.com/css/theme/clearWhite.css website.com/css/theme/fancyBlue.css website.com/css/theme/dangerRed.css website.com/script/php/loader.php website.com/script/php/conBroker.php website.com/script/js/myCustom.js website.com/libs/js/jquery-min.js ------------------------------------------------ Have a theme stored in the DB against a user login and then load in the relevant css based on that, or clearWhite.css as a default if no DB results are returned for a theme. Here's some brutally over-simplified example code: //inex.php ----> <?php requre_once(loader.php) if($user){ (!empty($user->theme)) ? $userTheme = $user->theme : $userTheme = 'clearWhite.css' $themeLink = '/css/theme/'.$userTheme } else{ $themeLink = '/css/theme/clearWhite.css'; $header = <<<HTML_CUST_HEAD <head> <link type="text/css" rel="stylesheet" href="/css/primary.css /> <link type="text/css" rel="stylesheet" href="{$themeLink} /> <script src="/libs/js/jquery-min.js"></script> <script src="/script/js/myCustom.js"></script> ... rest of head data HTML_CUST_HEAD; //... echo $header //... ?> You shouldn't need multiple copies of all the pages for all the themes. Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534218 Share on other sites More sharing options...
Jacques1 Posted July 4, 2016 Share Posted July 4, 2016 Literally duplicating every single HTML file for every single theme is the worst approach you can possibly take. Whenever the content changes, you'll be busy wading through all of your themes and adjusting them. Writing a new theme is also a pain in the ass, because the files are cluttered with text and images and other content that has nothing to do with a theme. Have you considered solving your problem with PHP? I'm talking about a dynamic website where the content is stored in a database and then inserted into HTML templates. An even better approach is to combine PHP with a modern template engine like Twig. This gives you advanced features like template inheritance: Instead of writing every about page, contact page etc. from scratch, you can define a base template which already contains a default page structure. Within each theme, you only need to override the parts which are actually different. This again avoids duplication and makes the themes very compact. I recommend you look into existing projects and see how they do it (content management systems, blogs, forums, ...). The concept of themes isn't exactly new in web programming. Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534219 Share on other sites More sharing options...
xProteuSx Posted July 5, 2016 Author Share Posted July 5, 2016 Maybe I am not understanding your suggestions (thanks by the way!), but the themes that I am thinking of are drastically different so I am not sure I can adopt your suggestions. These themes do have a core style.css file, but each and every theme has completely different content formatting for each page, so calling up different .css files won't do the whole trick. I've implemented a temporary work-around, that I am confident I will be frowned upon by one and all: www.website.com/index.html -> all content = include('theme/' . $themedirectory . '/index.html') www.website.com/about.html -> all content = include('theme/' . $themedirectory . '/about.html') www.website.com/contact.html -> all content = include('theme/' . $themedirectory . '/contact.html') Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534228 Share on other sites More sharing options...
Muddy_Funster Posted July 5, 2016 Share Posted July 5, 2016 Does the actual content change between themes? Does one theme get different about us info than another? does one theme get a different contact us form? If not then you only need to change the css, at most the css and a javascript file if you are using js to create some of the UI elements. If you have designed your pages properly then there is no need to use multiple copies of the html as all that should be in that is the core data. Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534231 Share on other sites More sharing options...
Jacques1 Posted July 5, 2016 Share Posted July 5, 2016 It's perfectly fine to use different HTML structures for different themes. A theme engine which can only swap CSS/JavaScript files is actually very limited and will require hacks as soon as the layouts become more complex. But then you still don't copy-and-paste hand-written HTML files. A theme is a graphical representation of a particular content. When you have to create 100 themes, it would be insane to duplicate the entire content 100 times. What you do instead is create the content once and then insert it into theme-specific templates. Anyway, I'm starting to think this is hopeless ... Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534232 Share on other sites More sharing options...
Muddy_Funster Posted July 5, 2016 Share Posted July 5, 2016 Anyway, I'm starting to think this is hopeless ... That's what I love about you @Jacques1 - your such a ray of sunshine! I haven't hit an issue where I need to hack a theme yet, but I will admit a huge lack of experience in this so... could you explain why it's limited to do this? Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534233 Share on other sites More sharing options...
kicken Posted July 5, 2016 Share Posted July 5, 2016 Maybe I am not understanding your suggestions (thanks by the way!), but the themes that I am thinking of are drastically different so I am not sure I can adopt your suggestions. You might be surprised what can be done with just CSS to alter the look and feel of a page. However even if you need more than just CSS changes you can use alternative an HTML structure. The way you create a theme is you create different template files with whatever base HTML you need. Within that HTML you put various placeholder values that you can replace with the actual content of the page later. For example, take a look at the Twig template engine. You'd define your template as something like this: theme1.html.twig <!doctype html> <html> <head><title>Theme 1</title></head> <body> {% block content '' %} </body> </html> You'd create as many of these theme templates as you need, each with a content block which will be replaced later. You can create multiple blocks if necessary, just give each one a unique name. Then all your content files extend the desired theme template. For example: about.html.twig {% extends 'theme1.html.twig' %} {% block content %} <p>This is your page content. All about us.</p> {% endblock %} Once you have all that working for one theme, you can change the extends tag to use a variable instead of a static file name and have PHP populate that variable with the theme template filename you wish to use. Be sure to go over all the Twig documentation to learn how to set it up and use it. Search for a few tutorials if need be also. Quote Link to comment https://forums.phpfreaks.com/topic/301426-building-theme-system-and-implementation/#findComment-1534238 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.