Jump to content

Buffer HTML em PHP


lordfokas
 Share

Recommended Posts

Como informático / programador, sou tipicamente preguiçoso...

Recentemente envolvi-me num trabalho, em que me comprometi a fazer um website em php...

Acontece que estava a ter imensos problemas com os headers e as sessões, pois uma vez enviada uma tag HTML que seja, deixamos de poder iniciar sessões ou usar o header para redireccionar o utilizador para uma nova página... acontece também que eu gosto imenso de usar o Header para lidar com os erros, e estava farto de andar as voltas por não o poder usar.

Eis a solução que encontrei, e que deixo aqui para quem partilhar dos meus sentimentos 😁

Criar um buffer (basicamente uma variavel) para todos os dados HTML...

no meu caso:

<?php
include("./def.php");
include("./func.php");
$__HTML_BUFFER__ = $DEF_DocType . "\n\n"; // Escrever o DocType
$__HTML_BUFFER__ .= "<html>\n"; // Abrir HTML
/* HEAD */
$__HTML_BUFFER__ .= "<head>\n"; // Abrir Head
$__HTML_BUFFER__ .= "\t<title>" . $DEF_Servidor . "</title>\n"; // Titulo
$__HTML_BUFFER__ .= "\t<link rel=\"shortcut icon\" type=\"image/x-icon\" href=\"" . $DEF_Favicon . "\" />\n"; // Favicon
$__HTML_BUFFER__ .= "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"./css/index.css\" />\n"; // CSS
$__HTML_BUFFER__ .= "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"./css/comum.css\" />\n"; // CSS
$__HTML_BUFFER__ .= "\t<link rel=\"stylesheet\" type=\"text/css\" href=\"./css/menu.css\" />\n"; // CSS
$__HTML_BUFFER__ .= "</head>\n\n"; // Fechar Head
/* BODY */
$__HTML_BUFFER__ .= "<body>\n"; // Abrir Body
$__HTML_BUFFER__ .= "<center>\n"; // Abrir CENTER
$__HTML_BUFFER__ .= "<table id=\"index-esqueleto\">\n"; // Abrir a tabela do esqueleto
$__HTML_BUFFER__ .= "<tr>\n"; // Abrir TR Logo
$__HTML_BUFFER__ .= "<td id=\"index-logo\" colspan=\"5\">\n"; // Abrir TD Logo
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD Logo
$__HTML_BUFFER__ .= "</tr>\n"; // Fechar TR Logo
$__HTML_BUFFER__ .= "<tr>\n"; // Abrir TR Logo Esp
$__HTML_BUFFER__ .= "<td id=\"index-hor-esp\" colspan=\"5\">\n"; // Abrir TD Logo Esp
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD Logo Esp
$__HTML_BUFFER__ .= "</tr>\n"; // Fechar TR Logo Esp
$__HTML_BUFFER__ .= "<tr>\n"; // Abrir TR Principal
$__HTML_BUFFER__ .= "<td id=\"index-vbar\">\n"; // Abrir TD VBar 1
include("./vbar1.php");
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD VBar 1
$__HTML_BUFFER__ .= "<td id=\"index-ver-esp\">\n"; // Abrir TD VBar E1
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD VBar E1
$__HTML_BUFFER__ .= "<td id=\"index-corpo\">\n"; // Abrir TD VBar B
include("./bloco.php");
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD VBar B
$__HTML_BUFFER__ .= "<td id=\"index-ver-esp\">\n"; // Abrir TD VBar E2
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD VBar E2
$__HTML_BUFFER__ .= "<td id=\"index-vbar\">\n"; // Abrir TD VBar 2
include("./vbar2.php");
$__HTML_BUFFER__ .= "</td>\n"; // Fechar TD VBar 2
$__HTML_BUFFER__ .= "</tr>\n"; // Fechar TR Principal
$__HTML_BUFFER__ .= "</table>\n"; // Fechar a tabela do esqueleto
$__HTML_BUFFER__ .= "</center>\n"; // Fechar CENTER
$__HTML_BUFFER__ .= "</body>\n"; // Fechar Body
$__HTML_BUFFER__ .= "</html>"; // Fechar HTML
echo $__HTML_BUFFER__; // Descarregar o Buffer
?>

Eu podia ter feito quase tudo isso numa unica linha, mas se eu olhar para o código fonte e não parecer bonito a primeira não consigo trabalhar bem. 😛

(A verdade é que não sou assim tão picuinhas, mas facilita se precisar de mudar uma linha de sitio ou algo que o valha).

Neste caso, $__HTML_BUFFER__ é o meu buffer... todos os dados vão parar lá, em vez de fazer echo ou escrever fora das tags do PHP.

No final basta fazer Echo $__HTML_BUFFER__; e sai tudo limpinho.

desta forma, como o HTML só é enviado depois de o script PHP ter terminado, posso usufruir das sessões e dos headers á vontadinha ^^

Link to comment
Share on other sites

Existe uma forma mais simples de concretizar a tua ideia: usares as funções ob_* do PHP:

http://php.net/ob_start

http://php.net/ob_end_flush

Assim não precisas de colocar o HTML dentro de strings em PHP.

Mas a minha opinião pessoal é que as sessões e alteração de cabeçalhos HTTP deve ocorrer antes de começarmos a tratar conteúdos. Por exemplo, se o interesse for redireccionar, podemos evitar estar a carregar um buffer para depois não ser utilizado.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Link to comment
Share on other sites

Como informático / programador, sou tipicamente preguiçoso...

És preguiçoso e fizeste esse código todo? Incremental strings linha a linha, comentários linha a linha, backslashes e "\n" linha a linha... calma...

Então eu ainda sou mais preguiçoso que tu  😁 (sem ofensa).

Link to comment
Share on other sites

Pelo menos fico contente por ter arranjado uma solução pessoal ao nivel das funções do nucleo do PHP  😁

pelo menos inverter o processo vai ser fácil (Ver código-fonte da página » Copy » Paste) ^^

muito obrigado softclean.

@taviroquai :: eu fiz sites inteiros em notepad, não me importo de escrever... so mexi em Dreamweaver uma vez e foi pk m obrigaram...

Embora actualmente use o notepad++ ...é um upgrade valente para o programador.

@sofclean mesmo assim eu não podia usar isso porque as paginas que eu estava a programar estavam incluidas dentro de celulas de tabelas.

EDIT:

@sofclean, isso tem um problema.

Acontece que a partir do momento do primeiro Echo, mesmo usando os OB's, os headers são enviados para o browser.

O que os OB's fazem é manter o output da pagina no servidor, mas os headers (tipo flags / codigos de erro / whatever) são enviados a mesma.

Derivado dessa situação, os OB's não solucionam o meu problema.

Desde já obrigado pela ajuda.

Atenciosamente,

LordFokas

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.