Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

visitante_php

classe de template

Recommended Posts

eu to tentando criar uma classe para templates, mas esta td fora do lugar

 

<?php

/**
 * @author in Luar
 * @copyright 2008
 * @email espiritodocoracao@hotmail.com
 */

class Modelo{
	var $dados = array();
	var $posicao;
	var $cabecalho;
	var $link;
	var $nome;
	
	function cabeca(){
		$cabecalho = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>

<head>
	<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
	<meta name="author" content="inLuar">

	<title>Untitled 2</title>
</head>
<style>
#geral{
	/*width: 700px;*/
	border: 1px solid black;
	margin:0px auto;
}

#cabecalho, #rodape{
	height:  70px;
	background: gray;
	clear:both;
}
#direita, #esquerda, #direita2, #direita3, #menu{
	width:  150px;
	border: 1px solid black;
}

#menu{
	float: '.$this->menuPosicao($posicao).';
}
#direita2{
	float: right;
	clear: both;
}
#direita3{
	float: right;
	clear: both;
}
#esquerda{
	float: left;
}
#meio{
	margin: 0px 160px;
	border: 1px solid black;
	}
</style>';
echo $cabecalho;
	}
	
	function menuPosicao($posicao){
		switch($posicao){
			case 0:
			$menu = 'right';
			 $this->menu;
			break;
			case 1:
			$menu = 'left';
			$this->cabecalho;
			break;
		}
		
	}
	function menuDados($dados){
	//$i = 0;
	//	do
		//{
			foreach($dados as $link => $nome){
			echo "<a href=".$nome.">".$link."</a><br>";
			}
		//	$i++;
		//}while($i<= count($dados));
	}
	function corpo(){
		$corpo = '<body>

<div id="geral">
<div id="cabecalho">cabecalhjo</div>
<div id="esquerda">esquerda</div>
<div id="menu">'.$this->menuDados($dados).'</div>
<div id="direita2">direita2</div>
<div id="direita3">direita2df fgdfgdfg dfg dfg dfg</div>
<div id="meio">
  <p>rodapeasjld gwsdulfsuodyftsuydfuyhdfsvhv vsdhfsh gvkh hksdhgkjh gsdjfjhgsd</p>
  <p> </p>
  <p> </p>
  <p> </p>
  <p> </p>
  <p> </p>
  <p> jfsgjdshdfshdj fsdfsdf</p>
</div>
<div id="rodape">rodape</div>

</div>


</body>
</html>';
		
	echo $corpo;
	}
	
	function mostrar(){
		echo $this->cabeca();
		echo $this->corpo();
	}
	
}

$html = new Modelo();
$html->menuPosicao('1');
$html->menuDados(array('home' => 'home.html', 'noticias' => 'noticias.html', 'comentarios' => 'comentarios.php'));
$html->mostrar();

?>

os links estao fora do lugar, a div menu nao aparece... no docigo fonte html a posicao do menu nao aparece...e ainda diz q tem argumento invalido para foreach na linha 82, q eh essa:

 

foreach($dados as $link => $nome){
			echo "<a href=".$nome.">".$link."</a><br>";
			}

 

 

kual o mais provavel erro..?

Compartilhar este post


Link para o post
Compartilhar em outros sites

o problema do foreach q esta dentro da função menuDados(), naum esta na chamada final:

$html->menuDados(array('home' => 'home.html', 'noticias' => 'noticias.html', 'comentarios' => 'comentarios.php'));

 

esta em:

<div id="menu">'.$this->menuDados($dados).'</div>

 

de onde veio esse $dados??

 

eu usei assim:

<div id="menu">'.$this->menuDados(array('home' => 'home.html', 'noticias' => 'noticias.html', 'comentarios' => 'comentarios.php')).'</div>

 

e tirei essa linha do final:

menuDados(array('home' => 'home.html', 'noticias' => 'noticias.html', 'comentarios' => 'comentarios.php'))

 

sei q continua sem formatação logica (ou agradavel)

+ posta um modelo de layout q você quer q fique e eu posto uma classe pra você ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu to tentando criar essa classe para template justamente para ser bem maleavel...onde eu posso posicionar o menu onde eu kiser...onde eu possa posicionar qq elemento q eu kiser, eh para um sistema q eu estou criando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu acho q você devia criar uma classe pra gerar o corpo em HTML (pra você poder posicionar o menu onde você quiser), e outra classe pra gerar os menus, pode ate criar a classe q gera o corpo em HTML como filha da q vai gerar os menus pra facilitar ^^

 

Achei bagunçado sim! + tenho certeza q você vai melhorar ele depois xD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentou usar o Smarty?

É um excelente framework para separar o HTML do PHP, além de você poder também fazer tudo em uma IDE do tipo WYSIWYG.

 

@braços

Compartilhar este post


Link para o post
Compartilhar em outros sites

tipo... tente criar uma classe q gere o "layout" de acordo com os parametros da classe;

a classe q vai gerar o layout tem q ter, alem dos metodos para manipular o layout gerado, tem q ter metodos para a insersao de texto (ou conteudo HTML msm) dentro de determinadas areas do documento gerado pela classe filha...

 

PS: para você entender melhor, eu estou comparando com a linguagem OO utilizada em JAVA (usando Swing) e PHP-Gtk (usando GladeXML)...

Compartilhar este post


Link para o post
Compartilhar em outros sites

realmente a minha ideia naum é possivel da forma como eu falei...

o relacionamento entre classes pais e filhas sao diferentes do q no JAVA e no PHP-Gtk (que eu ja estava acostumado ao usar GladeXML como pai)

 

+ eu fiz de uma maneira um pouco diferente, cada classe é independente...

ainda estou desenvolvendo, vou postar a parte q ja esta pronta:

 

classe menu:

class menu {
	private $width, $height, $menulist, $horizontal, $align;
	function __construct($w,$h,$horizontal = true) {
		$this->width = $w;
		$this->height = $h;
		$this->horizontal = $horizontal;
	}
	
	function add($nome,$url) { $this->menulist[] = array("nome" => $nome, "url" => $url); }
	function setAlign($align) { $this->align = preg_match("/left|center|right/",$align) ? $align : ""; }
	
	function construir() {
		if ($this->horizontal) {
			$size = $this->width / count($this->menulist);
			$saida = "<table cellpadding='0' cellspacing='0' width='".$this->width."' height='".$this->height."'>\n  <tr>\n";
			foreach ($this->menulist as $menu) $saida .= 
				"<td width='".$size."' align='".$this->align."'><a href='".$menu["url"]."'>".$menu["nome"]."</a></td>\n";
			$saida .= "</tr></table>";
		} else {
			$saida = "<table cellpadding='0' cellspacing='0' width='".$this->width."'>\n";
			foreach ($this->menulist as $menu) $saida .= 
				"<tr><td height='".$this->height."' align='".$this->align."'><a href='".$menu["url"]."'>".$menu["nome"]."</a></td></tr>\n";
			$saida .= "</tr></table>";
		}
		return $saida;
	}
}

ultilização:

$menuHorizontal = new menu(300,30);
$menuHorizontal->setAlign("center");
$menuHorizontal->add("Home","home.html");
$menuHorizontal->add("Noticias","noticias.html");
$menuHorizontal->add("Comentarios","comentarios.html");
echo $menuHorizontal->construir();

classe layout:

class layout {
	private $banner, $menuPos, $barra, $barraStyle;
	function __construct() {
		$this->menuNome = $this->menuURL = array();
		$this->menuHorizontal = true;
		$this->banner["height"] = 100;
		$this->banner["contents"] = array();
	}
	
	function newBannerContent($conteudo,$w,$style = "") { $this->banner["contents"][] = array("conteudo" => $conteudo, "width" => $w, "style" => $style); }
	function setBannerHeight($h) { $this->banner["height"] = $h; }
	function setMenuPosition($pos) { $this->menuPos = $pos; }
	function addMenu($nome,$url) { $this->menuNome[] = $nome; $this->menuURL[] = $url; }
	function setMenuAlign($a) { $this->menuAlign = $a; }
	function setBarra($cont) { $this->barra = $cont; }
	function setBarraStyle($style) { $this->barraStyle = $style; }
	
	function construir() {
		if (count($this->banner["contents"]) > 1) {
			$banner = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='".$this->banner["height"]."'><tr>\n";
			foreach ($this->banner["contents"] as $content) $banner .= 
				"<td style='".$content["style"]."' width='".$content["width"]."'>".$content["conteudo"]."</td>";
			$banner .= "</tr></table>";
		} else {
			$bn = $this->banner["contents"][0];
			$banner = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='".$this->banner["height"]."'><tr>
			<td style='".$bn["style"]."'>".$bn["conteudo"]."</td></tr></table>";
		}
		
		$barra = "<div style='".$this->barraStyle."'>".$this->barra."</div>";
		
		$corpo = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='100%'>
		<tr><td>$LAYOUT_SPACE2</td></tr>
		<tr><td>$LAYOUT_SPACE3</td></tr>
		</table>";
		
		return $banner.$barra.$corpo;
	}
}

- A classe menu ja esta terminada, talvez eu naum implemente mudanças...

- A classe layout esta inacabada, o layout contera 3 setores distintios:

Barra: <div> logo abaixo do banner, equivalente a area do menu do usuario aqui do forum

Coluna e Corpo: a tabela principal seradividida em duas partes, uma sera a Coluna será a menor (o lado onde a coluna fica sera definida usando um metodo da classe layout), a outra coluna q resta sera o corpo

 

Uso da classe layout atualmente:

$style = "background: url(http://forum.imasters.com.br/style_images/10/tile_back.jpg)";
$bn_content = '<img src="http://forum.imasters.com.br/style_images/10/logo4.gif" width="318" height="90" border="0">';
$barra_style = "background: url(http://forum.imasters.com.br/style_images/10/bar2.jpg)";

$lt = new layout();
$lt->setBannerHeight(90);
$lt->newBannerContent($bn_content,"100%",$style);
$lt->setBarraStyle($barra_style);
echo $lt->construir();
isso vai gerar um banner semelhante ao do iMasters (com as mesmas imagens)...

 

se alguem tiver sugestoes ou correções, me avisem.

 

Igor.php se você naum tiver entendido ainda, naum se preocupe, é pq naum esta terminado, como eu disse q postaria ainda hoje eu estou mostrando q estou desenvolvendo a classe nas horas livres do trabalho...

desculpa pela demora...

Compartilhar este post


Link para o post
Compartilhar em outros sites

pow cara, ficou muito show, mas tipo, sem kerer ser exigente, o menu nao tem como alinhar ele a esquerda, direita ou centro da tela? você alinhou dentro da tabela dele e nao na tela...e aki no caso a classe menu eu usarei dentro do layout neh? como você citou acima e eu entendi como classes extendidas?eu tentei fazer isso td numa classe so e ainda por cima em tableless...obrigado pela ajuda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

o menu fica em cima do banner? na minha classe?!

estranho...

+ você tem + alguma dica pra dar pra ela?

 

PS: você tbm pode construir o menu na vertical:

$menuHorizontal = new menu(300,30,false);
$menuHorizontal->setAlign("center");
$menuHorizontal->add("Home","home.html");
$menuHorizontal->add("Noticias","noticias.html");
$menuHorizontal->add("Comentarios","comentarios.html");
echo $menuHorizontal->construir();

se quiser colocar os menus dentro do layout, faça assim:

$lt->setBarra($menuHorizontal->construir());
echo $lt->construir();

Compartilhar este post


Link para o post
Compartilhar em outros sites

agora q eu entendi oq você falou sobre o alinhamento do menu... ^^

a classe menu é responsavel apenas por gerar o menu em si, e alinhamento interno dentro de cada cedula...

 

+ eu fiz a modificação q você pediu...

class layout {
	private $banner, $menuPos, $barra, $barraStyle, $barraAlign;
	function __construct() {
		$this->menuNome = $this->menuURL = array();
		$this->menuHorizontal = true;
		$this->banner["height"] = 100;
		$this->banner["contents"] = array();
	}
	
	function newBannerContent($conteudo,$w,$style = "") { $this->banner["contents"][] = array("conteudo" => $conteudo, "width" => $w, "style" => $style); }
	function setBannerHeight($h) { $this->banner["height"] = $h; }
	function setMenuPosition($pos) { $this->menuPos = $pos; }
	function addMenu($nome,$url) { $this->menuNome[] = $nome; $this->menuURL[] = $url; }
	function setMenuAlign($a) { $this->menuAlign = $a; }
	function setBarra($cont) { $this->barra = $cont; }
	function setBarraStyle($style) { $this->barraStyle = $style; }
	function setBarraAlign($align) { $this->barraAlign = preg_match("/left|center|right/",$align) ? $align : ""; }
	
	function construir() {
		if (count($this->banner["contents"]) > 1) {
			$banner = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='".$this->banner["height"]."'><tr>\n";
			foreach ($this->banner["contents"] as $content) $banner .= 
				"<td style='".$content["style"]."' width='".$content["width"]."'>".$content["conteudo"]."</td>";
			$banner .= "</tr></table>";
		} else {
			$bn = $this->banner["contents"][0];
			$banner = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='".$this->banner["height"]."'><tr>
			<td style='".$bn["style"]."'>".$bn["conteudo"]."</td></tr></table>";
		}
		
		$barra = "<div align='".$this->barraAlign."' style='".$this->barraStyle."'>".$this->barra."</div>";
		
		$corpo = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='100%'>
		<tr><td>$LAYOUT_SPACE2</td></tr>
		<tr><td>$LAYOUT_SPACE3</td></tr>
		</table>";
		
		return $banner.$barra.$corpo;
	}
}

a classe menu permanece inalterada, e você pode usar esse codigo para testar:

$style = "background: url(http://forum.imasters.com.br/style_images/10/tile_back.jpg)";
$bn_content = '<img src="http://forum.imasters.com.br/style_images/10/logo4.gif" width="318" height="90" border="0">';
$barra_style = "background: url(http://forum.imasters.com.br/style_images/10/bar2.jpg)";

$lt = new layout();
$lt->setBannerHeight(90);
$lt->newBannerContent($bn_content,"100%",$style);
$lt->setBarraStyle($barra_style);

$menuHorizontal = new menu(300,30);
$menuHorizontal->setAlign("center");
$menuHorizontal->add("Home","home.html");
$menuHorizontal->add("Noticias","noticias.html");
$menuHorizontal->add("Comentarios","comentarios.html");

$lt->setBarraAlign("right");
$lt->setBarra($menuHorizontal->construir());
echo $lt->construir();

quanto ao restante do corpo eu devo terminar ainda hoje... ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

aqui esta todo o codigo q eu usei para teste...

esta meio simples, mas como era somente para explicar...

 

<style type="text/css">
a {
	text-decoration:none;
	font:11px Verdana, Arial, Helvetica, sans-serif;
	color:#CCCCCC;
	font-weight: bold;
}
a:hover {
	text-decoration:underline;
}
</style>
<body style="font:11px Verdana, Arial, Helvetica, sans-serif">
<?php
class menu {
	private $width, $height, $menulist, $horizontal, $align;
	function __construct($w,$h,$horizontal = true) {
		$this->width = $w;
		$this->height = $h;
		$this->horizontal = $horizontal;
	}
	
	function add($nome,$url) { $this->menulist[] = array("nome" => $nome, "url" => $url); }
	function setAlign($align) { $this->align = preg_match("/left|center|right/",$align) ? $align : ""; }
	
	function construir() {
		if ($this->horizontal) {
			$size = $this->width / count($this->menulist);
			$saida = "<table cellpadding='0' cellspacing='0' width='".$this->width."' height='".$this->height."'>\n  <tr>\n";
			foreach ($this->menulist as $menu) $saida .= 
				"<td width='".$size."' align='".$this->align."'><a href='".$menu["url"]."'>".$menu["nome"]."</a></td>\n";
			$saida .= "</tr></table>";
		} else {
			$saida = "<table cellpadding='0' cellspacing='0' width='".$this->width."'>\n";
			foreach ($this->menulist as $menu) $saida .= 
				"<tr><td height='".$this->height."' align='".$this->align."'><a href='".$menu["url"]."'>".$menu["nome"]."</a></td></tr>\n";
			$saida .= "</tr></table>";
		}
		return $saida;
	}
}

class layout {
	private $banner, $menuPos, $barra, $barraStyle, $barraAlign, $colLeft, $colStyle, $colWidth, $coluna, $corpo, $corpoStyle, $colAlign;
	function __construct() {
		$this->colWidth = "30%";
		$this->banner["height"] = 100;
		$this->banner["contents"] = array();
	}
	
	function newBannerContent($conteudo,$w,$style = "") { $this->banner["contents"][] = array("conteudo" => $conteudo, "width" => $w, "style" => $style); }
	function setBannerHeight($h) { $this->banner["height"] = $h; }
	function setMenuPosition($pos) { $this->menuPos = $pos; }
	function addMenu($nome,$url) { $this->menuNome[] = $nome; $this->menuURL[] = $url; }
	function setMenuAlign($a) { $this->menuAlign = $a; }
	function setBarra($cont) { $this->barra = $cont; }
	function setBarraStyle($style) { $this->barraStyle = $style; }
	function setBarraAlign($align) { $this->barraAlign = preg_match("/left|center|right/",$align) ? $align : ""; }
	function setColunaLeft($bool) { $this->colLeft = $bool; }
	function setColunaStyle($style) { $this->colStyle = $style; }
	function setColunaWidth($w) { $this->colWidth = $w; }
	function setColuna($cont) { $this->coluna = $cont; }
	function setColunaAlign($align) { $this->colAlign = preg_match("/left|center|right/",$align) ? $align : ""; }
	function setCorpoStyle($style) { $this->corpoStyle = $style; }
	function setCorpo($cont) { $this->corpo = $cont; }
	
	function construir() {
		if (count($this->banner["contents"]) > 1) {
			$banner = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='".$this->banner["height"]."'><tr>\n";
			foreach ($this->banner["contents"] as $content) $banner .= 
				"<td style='".$content["style"]."' width='".$content["width"]."'>".$content["conteudo"]."</td>";
			$banner .= "</tr></table>";
		} else {
			$bn = $this->banner["contents"][0];
			$banner = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='".$this->banner["height"]."'><tr>
			<td style='".$bn["style"]."'>".$bn["conteudo"]."</td></tr></table>";
		}
		$barra = "<div align='".$this->barraAlign."' style='".$this->barraStyle."'>".$this->barra."</div>";
		$coluna = '<td valign="top" width="'.$this->colWidth.'"><div style="'.$this->colStyle.'" align="'.$this->colAlign.'">'.$this->coluna.'</div></td>';
		$corpo = '<td valign="top" style="'.$this->corpoStyle.'">'.$this->corpo.'</td>';
		$concat = $this->colLeft ? $coluna.$corpo : $corpo.$coluna;
		$corpo = "<table width='100%' border='0' cellspacing='0' cellpadding='0' height='100%'><tr>".$concat."</tr></table>";
		
		return $banner.$barra.$corpo;
	}
}

$style = "background: url(http://forum.imasters.com.br/style_images/10/tile_back.jpg)";
$bn_content = '<img src="http://forum.imasters.com.br/style_images/10/logo4.gif" width="318" height="90" border="0">';
$barra_style = "background: url(http://forum.imasters.com.br/style_images/10/bar2.jpg)";
$corpoStyle = "font: 11px Verdana; color: #AAAAAA";

$lt = new layout();
$lt->setBannerHeight(90);
$lt->newBannerContent($bn_content,"100%",$style);
$lt->setBarraStyle($barra_style);

$menuHorizontal = new menu(300,30);
$menuHorizontal->setAlign("center");
$menuHorizontal->add("Home","home.html");
$menuHorizontal->add("Noticias","noticias.html");
$menuHorizontal->add("Comentarios","comentarios.html");

$menuVertical = new menu(200,20,false);
$menuVertical->setAlign("center");
$menuVertical->add("Home","home.html");
$menuVertical->add("Noticias","noticias.html");
$menuVertical->add("Comentarios","comentarios.html");

$lt->setBarraAlign("right");
$lt->setBarra($menuHorizontal->construir());
$lt->setCorpo("Conteudo do corpo");
$lt->setCorpoStyle($corpoStyle);
$lt->setColunaLeft(true);
$lt->setColunaWidth(210);
$lt->setColunaAlign("right");
$lt->setColuna($menuVertical->construir());
echo $lt->construir();
?>
</body>

PS: tinha ate me esquecido desse topico, por isso a demora ^^

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.