Welcome to Geeklog Monday, October 21 2019 @ 01:24 pm EDT

Geeklog Forums

Changing the theme with the topic


Status: offline

Dirk

Site Admin
Admin
Registered: 12/01/02
Posts: 13073
Location:Stuttgart, Germany
For a site I'm working on, I wanted the theme to change when you change the topic. Now, this has been discussed before and the Chameleon hack was developed as a result.

However, when all you need are a few color changes, there's a simpler solution that doesn't require any changes to Geeklog's core code.

This relies on the fact that you can use PHP in a theme's header.thtml file. To keep things readable, PHP code can also be added to the functions.php file that's part of every theme, so that you could add a function to that file and then simply call it from header.thtml.

So here's a simplified version of what I did:

In the theme's functions.php, add a function like this:
PHP Formatted Code
function theme_emitCSS ()
{
    global $topic;

    switch ($topic) {
        case 'GeekLog':
            $color = 'red';
            break;

        case 'General':
            $color = 'green';
            break;

        default:
            $color = 'black';
            break;
    }

    $retval = '<style type="text/css">' . LB
            . '.current-color {' . LB
            . '  color: ' . $color . ';' . LB
            . '  background-color: white;' . LB
            . '}' . LB
            . '</style>' . LB;

    return $retval;

}
 
This function simply checks what the current topic is and then emits CSS for a class called 'current-color', setting the foreground color accordingly.

All you have to do now is to add a call to that function in your theme's header.thtml like this:
PHP Formatted Code
<head>
...
<?php theme_emitCSS (); ?>
</head>
 
and then use class="current-color" wherever you need it, e.g. in the blockheader.thtml template file.

This can be extended to emit CSS using background images and other, more complicated CSS rules. You can also check what the current PHP file is (using $HTTP_SERVER_VARS['PHP_SELF'], after adding $HTTP_SERVER_VARS to the list of global variables for that function) to select colors for Geeklog's calendar, links section, etc.

Hope it helps someone ...

bye, Dirk

Status: offline

orfilms

Forum User
Regular Poster
Registered: 02/08/05
Posts: 70
It doesn't seem to be working for me, i put the php call in the header, and in functions I'm putting:

PHP Formatted Code
function theme_emitCSS ()
{
    global $topic;

    switch ($topic) {
        case 'DVD':
            $color = 'slashdvd.jpg';
            break;

        default:
            $color = 'logo/imagerotator.php';
            break;
    }

    $retval = '<style type="text/css">' . LB
            . '#header {' . LB
            . 'width: 100%;' . LB
            . 'height: 150px;' . LB
            . 'white-space: nowrap;' . LB
            . 'background-color: #897F75;' . LB
            . 'text-align: left;' . LB
            . 'background-image: url(images/$color);' . LB
            . 'background-repeat: no-repeat;' . LB
            . 'padding: 0px 0px 0px 0px;' . LB
            . '}' . LB
            . '</style>' . LB;

    return $retval;

}
 


Shouldn't that work? Nothing comes up in the page source where i put the php call...

Status: offline

Dirk

Site Admin
Admin
Registered: 12/01/02
Posts: 13073
Location:Stuttgart, Germany
That CSS snippet should be there, at least, if you do a "view source" (or whatever the option is called) in your browser, i.e. have a look at the actual HTML of the page.

What won't work is the use of $color, as you put it between single quotes there. PHP doesn't replace variables enclosed in single quotes, so you would end up with '$color' in your CSS.

bye, Dirk

Status: offline

orfilms

Forum User
Regular Poster
Registered: 02/08/05
Posts: 70
Well nothing is showing up in the source at all where i put the php call:

PHP Formatted Code
<?php theme_emitCSS (); ?>
 


I'm assuming there must be something wrong with my call? Is there any way to put the php in the header.thtml to see if that works?

Status: offline

Dirk

Site Admin
Admin
Registered: 12/01/02
Posts: 13073
Location:Stuttgart, Germany
Whoops, the above example is missing a "print" statement:
PHP Formatted Code
<head>
...
<?php print theme_emitCSS (); ?>
</head>
 

Funny that nobody noticed (or bothered to mention) it in over a year ...

bye, Dirk

Status: offline

orfilms

Forum User
Regular Poster
Registered: 02/08/05
Posts: 70
This worked great...

but than I think it caused a few errors (I'm pretty sure it was this mod)

When people try to log off or log on it doesn't let them and gives them a refresh page that says:

"Warning: Cannot modify header information - headers already sent by (output started at /home/virtual/site128/fst/var/www/html/layout/No_Advertisements/functions.php:6 in /path/www/html/users.php on line 647

Warning: Cannot modify header information - headers already sent by (output started at /home/virtual/site128/fst/var/www/html/layout/No_Advertisements/functions.php:6 in /path/www/html/users.php on line 649"

Any idea what could be causing this and how it could be fixed? I'm taking the mod off the site until I can figure it out...

Status: offline

orfilms

Forum User
Regular Poster
Registered: 02/08/05
Posts: 70
Could anyone tell me how to fix this error?

Status: offline

Chalkhillian

Forum User
Chatty
Registered: 23/09/02
Posts: 67
You should do a search for 'headers already sent' - you will get a direct hit. Chances are that when you updated your php file, either you or your editor of choice placed some white space in the php file where it cannot be tolerated.

Status: offline

beewee

Forum User
Full Member
Registered: 05/08/03
Posts: 969
Location:The Netherlands, where else?
I want to use this nice trick, and just want to load a different CSS for each topic, would this work?

PHP Formatted Code
function style_emitCSS ()
{
    global $topic;

    switch ($topic) {
        case 'topic1':
            $style = 'style1.css';
            break;
                       
                        case 'topic2':
            $style = 'style2.css';
            break;

        default:
            $style = 'style.css';
            break;
    }

    $retval = '<link rel="stylesheet" type="text/css" href="/' . LB
               . '$style;' . LB
            . '"/>' . LB;

    return $retval;

}
 


and in the header this:

PHP Formatted Code
<?php print style_emitCSS (); ?>
 


I'm no developer, so I'm simply adapting excisting code without exactly knowing what I'm doing...
Dutch Geeklog sites about camping/hiking: www.kampeerzaken.nl | www.campersite.nl | www.caravans.nl | www.caravans.net

Status: offline

Remdotc

Forum User
Chatty
Registered: 12/06/02
Posts: 55
it would be better if the theme code was set per topic , or per page , as defined by admin

you could also define this on the topic out link in lib-common.php
you could also edit the index.php and add a case statement
or for better compatablity and easier upgrades you could add the code to functions.php in your theme, then call the function in the header template


Status: offline

beewee

Forum User
Full Member
Registered: 05/08/03
Posts: 969
Location:The Netherlands, where else?
Quote by Remdotc:for better compatablity and easier upgrades you could add the code to functions.php in your theme, then call the function in the header template


I believe that this thread started with this, so I already meant this.
Dutch Geeklog sites about camping/hiking: www.kampeerzaken.nl | www.campersite.nl | www.caravans.nl | www.caravans.net

Status: offline

stevelucky

Forum User
Junior
Registered: 25/05/05
Posts: 17
this code changes the color based on topic. but what about static pages? i have a bunch of static pages and still want the header to change (images though, instead of colors). any ideas?

Status: offline

Dirk

Site Admin
Admin
Registered: 12/01/02
Posts: 13073
Location:Stuttgart, Germany
Quote by stevelucky: this code changes the color based on topic. but what about static pages?

Same principle: Find out where on the site you are and emit CSS or HTML accordingly.

The PHP variable $_SERVER['PHP_SELF'], for example, contains .../staticpages/index.php when a static page is displayed.

bye, Dirk

All times are EDT. The time is now 01:24 pm.

  • Normal Topic
  • Sticky Topic
  • Locked Topic
  • New Post
  • Sticky Topic W/ New Post
  • Locked Topic W/ New Post
  •  View Anonymous Posts
  •  Able to post
  •  Filtered HTML Allowed
  •  Censored Content