Publicidade 

Folha de estilo em PHP


Esta semana tive que resolver um problema em um site que eu estava codificando, que apresentava três particularidades, na folha de estilos:

  1. O CSS para 2 navegadores, bem diferentes uma da outra.
  2. Grande quantidade de código que deveria ser aplicado apenas em algumas páginas.
  3. Parte da formatação era condicional, dependendo de algumas variáveis passadas pelo sistema.

A primeira solução imaginada foi uma única folha de estilos com algumas centenas de Kbytes, o que seria muito complicado para conexões discadas, imagine aguardar vários segundos, só para carregar a folha de estilos...

Ao me lembrar de dois artigos que li nos últimos dias (Evitando caching quando (e só quando) o arquivo CSS for atualizado e CSS Modular - Breve explicação), me veio uma idéia interessante que poderia resolver meu problema.

Por que não fazer a folha de estilos dinâmica?

Isso seria maravilhoso, se não fosse o problema do CSS não ser dinâmico.

Resolvi tentar fazer a folha de estilos em PHP.

O resultado foi ótimo e me abriu um enorme leque de possibilidades.

Segue o detalhamento de como fiz isso:

Inicialmente foi necessário pegar todas as variáveis que eu precisava para determinar como montar a folha de estilos para o navegador.

Para atingir a meta, eu precisaria das seguintes informações:

  • Navegador do usuário.
  • Seção do site que eu estava.
  • O valor das condições.

Para facilitar, decidi que passaria pelo método GET as informações de seção e condição, o navegador seria simples de se obter.

Então o início do arquivo, seria:


<?php
$sec = stripslashes($_GET['sec']);
$cond = stripslashes($_GET['cond']);
$is_ie = strpos($_SERVER['HTTP_USER_AGENT'],'MSIE') && !strpos($_SERVER['HTTP_USER_AGENT'],'Opera');
?>

Mesmo quando o Opera se identifica como IE, aparece a palavra Opera na assinatura do cabeçalho

Agora que já sei todos os dados que preciso, basta montar a folha de estilos dinamicamente:


<?php
 if ($sec=='Cad') {
    include ('cad_sec.php');
    if ($is_ie) {
        include ('cad_sec_ie.php');
    } else {
        include ('cad_sec_ot.php');
    }
}
if ($is_ie) {
    include ('ie.php');
} else {
    include ('ot.php');
}
include ('com.php');
switch ($cond) {
         case 'a':
            include ('cond_a.php');
            break;
         case 'b':
            include ('cond_b.php');
            break;
         default:
                include ('cond_def.php');
}
?>

    Onde:

  • cad_sec.php - CSS para seção Cad
  • cad_sec_ie.php - CSS para o IE na seção Cad
  • cad_sec_ot.php - CSS para os demais navegadores na seção Cad
  • ie.php - CSS para o IE
  • ot.php - CSS para os demais navegadores
  • com.php - CSS Geral
  • cond_a.php - CSS para condição a
  • cond_b.php - CSS para condição b
  • cond_def.php - CSS para as demais condições

Comecei a chamar o arquivo css.php no navegador e tudo estava funcionando como planejada, feliz da vida, anexei a folha de estilos � página que eu ia testar e...

Nada feito, não funcionou, parecia que não havia nenhuma folha de estilos associada a página.

A solução para este problema foi bem simples, por padrão o PHP gera arquivos do tipo text/html e a folha de estilos deveria ser do tipo text/css.

Basta inserir na primeira linha do arquivo css.php

<?php
header('Content-type: text/css');
?>

Agora, nosso arquivo está com o tipo correto e tudo estará funcionando como desejamos.

Compare Preços de: Site, Design, CSS, PHP, layout

[tags]Site,Design,CSS,PHP,layout[/tags]

Compartilhe e Guarde: Esses links facilitam a inclusão deste artigo nas redes sociais. Compartilhe.
  • Rec6
  • StumbleUpon
  • ueba
  • linkk
  • dihitt
  • linkloko
  • websapiens
  • linkto
  • Technorati
  • Simpy
  • del.icio.us
  • Blue Dot

Artigos relacionados







10 Comentários »

Comentário por THPS
2006-07-17 22:21:13

Bruno, se for possível, passe la no HG.
Obrigado!

 
Comentário por Thalis Valle
2006-07-18 12:03:43

Bem pensado Bruno. Parabéns!

 
Comentário por Bruno Alves
2006-07-18 14:39:25

@THPS, só poderei resolver questões da HG na sexta-feira, verifique se algum outro admin pode lhe ajudar.

@Thalis, obrigado.

Abraços

 
Comentário por Felipe Ranieri
2006-07-18 17:56:20

Putz, nada a ver com o artigo, mas o beeeem melhor esse layout mais clean hehehe

Falows!

 
Comentário por Bruno Alves
2006-07-18 18:12:21

Dei uma limpada, estava achando o outro muito poluido.

Só não sei até quando ficarei com este ;)

Abraço

 
Comentário por Roberto M.
2006-07-19 23:01:28

Legal, agora que tal uma sujestão pro próximo post: Querida, Descobri a América. Cara, essa é velha.

 
Comentário por Bruno Alves
2006-07-20 00:13:44

Sem problemas, pode deixar que farei um relatório completo sobre a descoberta da América.

Abraço

 
Comentário por Bruno Torres
2006-07-24 18:11:45

Mas, gerando o CSS com PHP o resultado não vai ficar em cache, porque nem o apache nem o PHP vão enviar last-modified nem etag. Ou você cuidou disso também e não falou? hehe

Eu já mexi com isso, mas em arquivos de feeds, mas o processo é mais ou menos parecido e pode ser adaptado pra esse caso sem problemas. Dá uma olhada: http://brunotorres.net/2005/01/26/caching-feeds

 
Comentário por Bruno Alves
2006-07-24 21:25:10

Para falar a verdade, nem pensei nisto, pois como estava em um servidor que já faz caching de arquivos, com o mm_cache, não havia porque me preocupar com caching.

Bem interessante a solução que você demonstrou, mês que vem devo começar o projeto de um portal e terei que usar esta técnica de montagem do CSS, mas não poderei contar com caching de arquivos, vou estudar sua solução para ver como aplicar.

Inclusive, muito interessante a idéia de usar o GZip, posso economizar um bocado de transferência com isso.

Obrigado.

Abraço

 
Comentário por rafael
2008-03-14 17:42:18

valeu de mais o negocio do css

 
Nome
Email
Site
Seu Comentário (menor | maior)
Você pode usar: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> e [CODE] [/CODE] em seu comentário.