Foros del Web » Programando para Internet » PHP »

Ayuda con PHP orientado a objetos

Estas en el tema de Ayuda con PHP orientado a objetos en el foro de PHP en Foros del Web. ¡Hola foro! Necesito empezar a programar con PHP orientado a objetos, y la verdad no tengo nada claro. Asi que voy a explicar lo que ...
  #1 (permalink)  
Antiguo 03/10/2003, 15:47
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 15 años, 9 meses
Puntos: 54
Ayuda con PHP orientado a objetos

¡Hola foro!
Necesito empezar a programar con PHP orientado a objetos, y la verdad no tengo nada claro. Asi que voy a explicar lo que necesito de forma básica a ver si algún alma caritativa me puede dar un código de ejemplo o bien alguna indicación.
Se trata de realizar un web a partir de plantillas. Tengo una plantilla (llamemosla plantilla.php) con contenidos exclusivamente en HTML, nada de código PHP. Dicha plantilla tiene unos contenidos fijos, y otros variables. Donde van los contenidos variables meto un código con el fin de sustituir esos caracteres por el contenido real que ha de mostrarse (por ejemplo pongo {TITULO} y luego lo sustituyo por el título de la página, que obviamente variará según la página que llame a la plantilla). Ahora tengo otra página (pagina.php) que requiere el uso de dicha pantilla. Por tanto lo que necesito es saber cómo hacer esto:
- Desde la pagina.php hacer la llamada a la plantilla.
- Una vez cargada, sustituir el código entre llaves por lo que quiera poner.
- Mostrar la página.
Es algo parecido al uso de plantillas que se hace en los foros phpBB.
Sé hacerlo mediante includes y demás, pero me gustaría programarlo con objetos ya que según me han dicho, resulta más sencillo y manejable, pero de objetos no tengo ni idea.
Agradezco la ayuda.
Saludos
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #2 (permalink)  
Antiguo 04/10/2003, 03:34
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Bueno .. y .. ¿es necesario que reinventes la rueda? ..

Te lo digo por qué ya tienes implementados y probados muchooos "motores" de gestion de "templates" ..

Ejemplos ..
NokTemplate (de nuestro compañero de los foros Nok)
http://www.jpw.com.ar/?lugar=noktpl

Smarty (del grupo php.net)
http://smarty.php.net

Y si usas google y pones "template+php" seguro que saldrán muchos más ...

Sobre programación OOP (Orientada a Objetos) puedes encontrar vários artículos (en castellano) en

www.zonaphp.com

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 04/10/2003, 06:17
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 15 años, 9 meses
Puntos: 54
Gracias, aunque lo que busco es mucho más sencillo. Viendo los ejemplos conseguí hacer algo que funcionara, me gustaría que me critiquen el código.
Tenemos un archivo plantilla.php que será el archivo común a todas las páginas, y tiene dos zonas que variarán, {TITULO} y {CONTENIDO}
Después la clase está definida en el archivo class.php Tiene 3 funciones: la primera, para obtener el archivo de la plantilla, la segunda para introducir los datos variables y la tercera para mostrar la página.
Finalmente, pagina.php es el archivo que usa la plantilla.

--- plantilla.php ---

Código PHP:
<html>
<
head>
<
title>{TITULO}</title>
</
head>

<
body>
{
CONTENIDO}
</
body>
</
html
--- class.php ---

Código PHP:
<?
class Pagina {
    
// Cargamos la plantilla
    
function crear($plantilla){
        
ob_start();
        include(
$plantilla);
        
$this -> salida ob_get_contents();
        
ob_end_clean();
    }
    
// Cambiamos variables
    
function variable($tengo,$quiero){
        
$this -> salida str_replace$tengo $quiero $this -> salida );
    }
    
// Mostramos la página
    
function mostrar(){
        echo 
$this -> salida;
    }
}
?>
--- pagina.php ---

Código PHP:
<?
// Cogemos la clase "pagina"
include('class.php');

// Creamos la pagina, ponemos la plantilla, sustituimos variables
$salida = new Pagina;
$salida -> crear("plantilla.php");
$salida -> variable("{TITULO}","Este es el titulo");
$salida -> variable("{CONTENIDO}","Esto son los contenidos");

// Mostramos la página
$salida -> mostrar();
?>
Me gustaría que critiquen el código, especialmente la primera función de la clase, por si hay una forma más sencilla de obtener la plantilla. Lo hice con las funciones ob_ pero también había pensado en hacer un implode("",file("plantilla.php")); pero no sé cual es más beneficioso para el servidor, pues me interesa ante todo mantener el menor tiempo posible de ejecución del script.
Saludos
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.

Última edición por ferny; 04/10/2003 a las 06:22
  #4 (permalink)  
Antiguo 04/10/2003, 12:01
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años, 1 mes
Puntos: 68
Bueno Ferny, si bien la "idea" prncipal está bien, te cuento un pequeño "secreto" : el lenguaje PHP YA ES por si mismo, un motor de plantillas. Cómo es esto ? Bueno, simple, donde vos coloques en una plantilla algo como:
Código PHP:
<?=$contenido?>
PHP te lo va a reemplazar por el contenido de la variable "contenido".

Así de simple, asi de directo. El tema que hay que recordar, o mejor dicho, tener en cuenta, es que separar la lógica de presentación de la lógica de negocio ( business logic ) NO IMPLICA tener que separar PHP del HTML.

Entonces, yo podría reescribir tus clases de esta manera :
----- plantilla.php ----
Código:
<html>
<head>
<title><?=$titulo?></title>
</head>
<body>
<?=$contenido?>
</body>
</html>
-------- template.php ----------
Código PHP:
<?php
class Template
{
    var 
$_variables = array();
    var 
$_contenido "";

    function 
asignar($variable$valor)
    {
        
$this->_variables[$variable] = $valor;
    }

    function 
limpiar()
    {
        unset(
$this->_variables);
    }

    function 
parsear($plantilla)
    {
        
extract($this->_variables);
        
ob_start();
        include(
$plantilla);
        
$this->_contenido ob_get_contents();
        
ob_end_clean();
    }

    function 
mostrar()
    {
        return 
$this->_contenido;
    }
}
?>
---------- Ejemplo.php -----------
Código PHP:
<?php
include('Template.php');

$tpl = new Template;
$tpl->asignar('titulo''Bienvenidos a la página de Ferny');
$tpl->asignar('contenido''Esta es mi página web');
$tpl->parsear('plantilla.php');
echo 
$tpl->mostrar();
?>
(Perdon por los posibles errores de sintaxis, pero se hace dificil escribir codigo al vuelo y bien))

Fin. The End. Simple y directo. Al grano.
Ventajas? Al ser PHP el que se encarga del trabajo, es él mismo el que utiliza el mejor método para leer el archivodel disco y reemplazar las variables, en vez de utilizar str_replace ( que si bien es una función rápida, en grandes cadenas de strings, se vuele menos eficiente).

Pero claro, este es un ejemplo básico básico. Podés extender tu clase de muchisimas maneras. Eso si, el consejo de Cluster no estuvo para nada de más, yo te recomiendo que leas un poco el código de NokTemplates y saques ideas de código, que está muy bien planteado. Es una buena clase de Templates, rápida.

Bueno, cualquier otro comentario que tengas, no dudes en preguntar
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com

Última edición por Webstudio; 09/10/2003 a las 09:07
  #5 (permalink)  
Antiguo 05/10/2003, 05:55
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 15 años, 9 meses
Puntos: 54
¡Hola!

Me sirvió perfectamente, de hecho el tiempo de ejecución se redujo drásticamente

Ahora me queda poder sustituir $contenido por el resultado de la ejecución de otro script php, o sea interpreto un script.php y el resultado lo introduzco en la template. Podría hacerlo con esto:

ob_start();
include('script_que_quiero_interpretar.php');
$resultado = ob_get_contents();
ob_end_clean();

Y luego sustituir el $contenido por $resultado.

$tpl->asignar('contenido', $resultado);

¿Habría otra forma, o esto es suficiente?

Muchas gracias
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #6 (permalink)  
Antiguo 05/10/2003, 19:45
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 16 años, 1 mes
Puntos: 68
Pues así como lo veo yo y como está planteada esta clase de ejemplo, con solo hacer:

Código PHP:
<?php
include('Template.php');

$tpl = new Template;
$tpl->asignar('titulo''Bienvenidos a la página de Ferny');
$tpl->parsear('script_que_genera_tu_contenido.php');
echo 
$tpl->mostrar;
?>
Sería la mejor manera de ahorrarte 1 archivo.php. Directamente hacés que el script que querés meter en "Contenido" tenga un par de variables dinámicas y listo. Sino, de otra manera, podrías modificar la clase para que te de un método que parsee un archivo, y lo guarde dentro del array de variables a sustituir.
Seria bastante útil.

Saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #7 (permalink)  
Antiguo 06/10/2003, 05:24
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 15 años, 9 meses
Puntos: 54
Cita:
Mensaje Original por Webstudio
Pues así como lo veo yo y como está planteada esta clase de ejemplo, con solo hacer:

Código PHP:
<?php
include('Template.php');

$tpl = new Template;
$tpl->asignar('titulo''Bienvenidos a la página de Ferny');
$tpl->parsear('script_que_genera_tu_contenido.php');
echo 
$tpl->mostrar;
?>
Sería la mejor manera de ahorrarte 1 archivo.php. Directamente hacés que el script que querés meter en "Contenido" tenga un par de variables dinámicas y listo. Sino, de otra manera, podrías modificar la clase para que te de un método que parsee un archivo, y lo guarde dentro del array de variables a sustituir.
Seria bastante útil.

Saludos.
Pues al final me decidí por usar el segundo método, ya que la plantilla es común, pero los contenidos unos son estáticos (no requieren parsear) y otros dinámicos (se generan con mysql entre otras cosas, y requieren el parsear).
Por tanto me construí una función dentro de la clase que toma y parsea el archivo del contenido, y lo guarda como variable. Luego al parsear la plantilla, se sustituyen todas las variables incluida la "contenido".
Ha quedado tremendo, incluso incluí un módulo de compresión GZIP y un contador de tiempo de creación para las páginas, y aun así en general no tarda más de 3 centésimas en crearse la página, una rapidez que era lo que yo buscaba.
Muchas gracias
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
  #8 (permalink)  
Antiguo 06/10/2003, 05:52
Avatar de epplestun  
Fecha de Ingreso: octubre-2001
Mensajes: 1.621
Antigüedad: 16 años, 1 mes
Puntos: 5
jeej bueno pos a ver si nos das la posivilidad de ver tu obra maestra, yo por lo menos estoy ansioso por verlo
__________________
Usuario registrado de Linux #288725
  #9 (permalink)  
Antiguo 06/10/2003, 16:18
Avatar de ferny
Il capo della mafia
 
Fecha de Ingreso: febrero-2002
Ubicación: Al final del cable
Mensajes: 10.080
Antigüedad: 15 años, 9 meses
Puntos: 54
Hola:
No es tanto como una obra maestra, pero funciona, que es lo importante
Poner todo aquí sería muy largo, asi que sólo voy a poner el archivo de la clase y el archivo al que llamamos por URL. Luego vereis una serie de constantes e includes de otros archivos que contienen datos, variables, funciones, constantes... pero no los pongo pq necesitaría varios posts

class.php
Código PHP:
<?
class Template {
    var 
$_variables = array();
    var 
$_contenido "";

    
// Función útil para asignar variables determinadas
    
function asignar($variable,$valor){
        
$this -> _variables[$variable] = $valor;
     }

    
// Asignamos todas aquellas variables comunes a todos los archivos (plantillas y contenidos)
    
function rellenar(){
        
$this -> asignar('server',SERVER); # Servidor
        
$this -> asignar('foro',FORO); # Dirección del foro
        
$this -> asignar('email_admin',EMAIL_ADMIN); # Email administrativo
        
$this -> asignar('usuarios_activos',U_ACTIVOS); # Usuarios activos
        
$this -> asignar('fecha',fecha()); # Fecha actual

        
$gzip_activado = (GZIP_ON_OFF) ? "activada" "desactivada";
        
$this -> asignar('gzip_on_off',$gzip_activado); # Compresión GZIP
    
}

    
// Añadimos contenidos a partir del fichero $file y lo asignamos a $variable
    
function archivo($variable,$file) {
        
$this -> archivo = new Template# Creamos un objeto para los contenidos
        
$this -> archivo -> rellenar(); # Definimos variables comunes a todo
        
extract($this -> archivo -> _variables); # Asignamos variables comunes
        
$this -> archivo -> parsear($file); # Sustituimos variables comunes
        
$this -> archivo -> limpiar(); # Eliminamos variables temporales
        
$this -> asignar($variable,$this -> archivo -> _contenido); # Asignamos la variable buscada
    
}

    
// Sustituimos las variables en determinado archivo
    
function parsear($file) {
        
$this -> asignar('tiempo_creacion',tiempo()); # Asignamos variable de tiempo de creación
        
$this -> rellenar(); # Definimos variables comunes
        
extract($this -> _variables); # Asignamos variables comunes
        
ob_start(); # Iniciamos buffer para poder coger los contenidos
        
include($file); # Metemos la plantilla, ya con variables sustituidas
        
$this -> _contenido ob_get_contents(); # Cogemos el contenido
        
ob_end_clean(); # Eliminamos buffer
        
$this -> limpiar(); # Eliminamos variables temporales
    
}

    
// Borramos las variables temporales
    
function limpiar(){
        unset(
$this -> _variables);
    }

    
// Mostramos la página, en función de si tenemos compresión GZIP o no
    
function mostrar($gzip) {
        if (
$gzip) {
            
ob_start();
            include(
PATH.'includes/gzip.php');
            echo 
$this -> _contenido;
            new 
gzip();
        } else {
            echo 
$this -> _contenido;
        }
    }
}
?>
pagina.php
Código PHP:
<?
// Definimos PATH y metemos archivo de configuración
define(PATH,"./");
include(
PATH.'includes/config.inc.php');

// Creamos la página
$tpl = new Template;

// Asignamos título de la página
$tpl -> asignar('titulo','Esto es el título');

// Asignamos contenidos desde archivo
$tpl -> archivo('contenido','contenido.php');
$tpl -> archivo('scroll',PATH.'includes/scroll.php');

// Sustituimos variables en la plantilla
$tpl -> parsear(PATH.'includes/plantilla.php');

// Mostramos variables
$tpl -> mostrar(GZIP_ON_OFF);
?>
Como podeis suponer, faltan muchísimas cosas pero no puedo poner todo aquí... Ah, por cierto, la clase GZIP definida en gzip.php es la clase de compresión que se encuentra en xergio.net
__________________
www.mundodivx.com || www.mundodivx.org

Pon tu mano en un horno caliente durante un minuto y te parecerá una hora.
Siéntate junto a una chica preciosa durante una hora y te parecerá un minuto.
Eso es la relatividad.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:46.