Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Smarty Clase constructor

Estas en el tema de Smarty Clase constructor en el foro de PHP en Foros del Web. En este código que es la clase plantilla para trabajar con Smarty 3, cómo defino mi clase constructor? Código PHP: <?php include_once  SMARTY_BASEFILE ; class  ...
  #1 (permalink)  
Antiguo 24/12/2013, 11:21
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Smarty Clase constructor

En este código que es la clase plantilla para trabajar con Smarty 3, cómo defino mi clase constructor?
Código PHP:
<?php

include_once SMARTY_BASEFILE;

class 
Plantilla extends Smarty {

   function 
Plantilla() {

        
$this->template_dir APP_BASEDIR .'/plantillas/templates/';
        
$this->compile_dir  APP_BASEDIR .'/plantillas/templates_c/';
        
$this->config_dir   APP_BASEDIR .'/plantillas/configs/';
        
$this->cache_dir    APP_BASEDIR .'/plantillas/cache/';
   }  
}
?>
Gracias.
__________________
Todos somos iguales. NO! a la violencia de género.
  #2 (permalink)  
Antiguo 24/12/2013, 11:27
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

No te basta con esto?

Código PHP:
Ver original
  1. include_once SMARTY_BASEFILE;
  2.  
  3. class Plantilla extends Smarty {
  4.  
  5.     public function __construct(){
  6.         //constructor
  7.     }
  8.    
  9.     function Plantilla() {
  10.  
  11.         $this->template_dir = APP_BASEDIR .'/plantillas/templates/';
  12.         $this->compile_dir  = APP_BASEDIR .'/plantillas/templates_c/';
  13.         $this->config_dir   = APP_BASEDIR .'/plantillas/configs/';
  14.         $this->cache_dir    = APP_BASEDIR .'/plantillas/cache/';
  15.    }  
  16. }

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #3 (permalink)  
Antiguo 24/12/2013, 11:36
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
No te basta con esto?

Código PHP:
Ver original
  1. include_once SMARTY_BASEFILE;
  2.  
  3. class Plantilla extends Smarty {
  4.  
  5.     public function __construct(){
  6.         //constructor
  7.     }
  8.    
  9.     function Plantilla() {
  10.  
  11.         $this->template_dir = APP_BASEDIR .'/plantillas/templates/';
  12.         $this->compile_dir  = APP_BASEDIR .'/plantillas/templates_c/';
  13.         $this->config_dir   = APP_BASEDIR .'/plantillas/configs/';
  14.         $this->cache_dir    = APP_BASEDIR .'/plantillas/cache/';
  15.    }  
  16. }

Saludos
Ya lo intenté y me sale error.
Encontré esto y no entiendo: http://stackoverflow.com/questions/1...n-a-non-object
__________________
Todos somos iguales. NO! a la violencia de género.
  #4 (permalink)  
Antiguo 24/12/2013, 12:54
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

Pues si esa es la "solución" debería ir algo así:

Código PHP:
Ver original
  1. include_once SMARTY_BASEFILE;
  2.  
  3. class Plantilla extends Smarty {
  4.  
  5.     function Plantilla() {
  6.         parent::__construct();
  7.     }
  8.    
  9.     function Plantilla() {
  10.  
  11.         $this->template_dir = APP_BASEDIR .'/plantillas/templates/';
  12.         $this->compile_dir  = APP_BASEDIR .'/plantillas/templates_c/';
  13.         $this->config_dir   = APP_BASEDIR .'/plantillas/configs/';
  14.         $this->cache_dir    = APP_BASEDIR .'/plantillas/cache/';
  15.    }  
  16. }

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #5 (permalink)  
Antiguo 26/12/2013, 08:50
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
Pues si esa es la "solución" debería ir algo así:

Código PHP:
Ver original
  1. include_once SMARTY_BASEFILE;
  2.  
  3. class Plantilla extends Smarty {
  4.  
  5.     function Plantilla() {
  6.         parent::__construct();
  7.     }
  8.    
  9.     function Plantilla() {
  10.  
  11.         $this->template_dir = APP_BASEDIR .'/plantillas/templates/';
  12.         $this->compile_dir  = APP_BASEDIR .'/plantillas/templates_c/';
  13.         $this->config_dir   = APP_BASEDIR .'/plantillas/configs/';
  14.         $this->cache_dir    = APP_BASEDIR .'/plantillas/cache/';
  15.    }  
  16. }

Saludos
Te agradecería que me expliques por qué se debe usar el parent? Si no hemos definido un constructor de la clase.
__________________
Todos somos iguales. NO! a la violencia de género.
  #6 (permalink)  
Antiguo 26/12/2013, 08:54
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

parent hace referencia a la clase que se extiende (en este caso Smarty)

Como la clase Plantilla es hija de la clase Smarty nosotros podemos llamar a funciones de la clase padre de esa manera (hay otra manera y es usando $this). Como la clase Smarty si tiene __construct lo único que hacemos es llamarlo y de esa manera instanciamos correctamente la clase.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #7 (permalink)  
Antiguo 26/12/2013, 09:19
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
parent hace referencia a la clase que se extiende (en este caso Smarty)

Como la clase Plantilla es hija de la clase Smarty nosotros podemos llamar a funciones de la clase padre de esa manera (hay otra manera y es usando $this). Como la clase Smarty si tiene __construct lo único que hacemos es llamarlo y de esa manera instanciamos correctamente la clase.

Saludos
Ahora obtengo este error:
Código PHP:
Fatal errorCannot redeclare Plantilla::Plantilla() in C:wwwpruebaclasesutilPlantilla.class.php on line 11 
La línea 11 es donde se define:
Código PHP:
function Plantilla() { 
__________________
Todos somos iguales. NO! a la violencia de género.
  #8 (permalink)  
Antiguo 26/12/2013, 09:23
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

Bueno el error es simple ya que fue un error mio.

Código PHP:
Ver original
  1. include_once SMARTY_BASEFILE;
  2.  
  3. class Plantilla extends Smarty {
  4.     function Plantilla() {
  5.         parent::__construct();
  6.         $this->template_dir = APP_BASEDIR .'/plantillas/templates/';
  7.         $this->compile_dir  = APP_BASEDIR .'/plantillas/templates_c/';
  8.         $this->config_dir   = APP_BASEDIR .'/plantillas/configs/';
  9.         $this->cache_dir    = APP_BASEDIR .'/plantillas/cache/';
  10.    }  
  11. }

Si eso no te funciona debes de decirnos los errores que te dan.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #9 (permalink)  
Antiguo 26/12/2013, 10:07
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Smarty Clase constructor

Me sale este error:
Código PHP:
Fatal errorCall to a member function Execute() on a non-object in "C:\www\prueba\clases\dao\ProductoDAO.class.php on line 10" 
Este es el archivo ProductoDAO.class.php:
Código PHP:
<?php
class ProductoDAO {

    function 
__construct(){
    }

    function 
listar(){
       
$query "SELECT id_producto, id_categoria, nombre, descripcion, precio, stock, importancia, imagen FROM producto order by id_producto";
       
$BD = new ConexionDB();
       
$recordSet $BD->dbLink->Execute($query);
       if (!
$recordSet){
         
Debug::println("No se pudo ejecutar la consulta listar: " $query);
         return 
false;
       }
       
$productos = array();
       while(
$fila=$recordSet->FetchRow()) {
          
$productos[] = new ProductoVO($fila['id_producto'], $fila['id_categoria'], $fila['nombre'],
                                      
$fila['descripcion'], $fila['precio'], $fila['stock'], $fila['importancia'],
                                      
$fila['imagen']);
       }
      return 
$productos;
    }


    function 
__destruct(){
    }

}
?>
La línea de error:
Código PHP:
$BD = new ConexionDB();
$recordSet $BD->dbLink->Execute($query); 
Hace referencia a esta clase: ConexionDB.class.php
Código PHP:
<?php
require_once ADODB_BASEFILE;
class 
ConexionDB {

    public 
$dbLink;

    function 
__construct(){
    }

    function 
ConexionDB(){
        
$this->dbLink ADONewConnection(DB_TYPE);
        
$this->dbLink->SetFetchMode(ADODB_FETCH_ASSOC);
        
$dbconnected $this->dbLink->PConnect(DB_HOSTDB_USERDB_KEYDB_DATA);
        if (!
$dbconnected){
            
Debug::println('No se pudo conectar a la Base de Datos');
            exit(
0);
        }            
    }

    function 
__destruct(){
    }
}
?>
Tal vez es un problema similiar con el constructor, no lo tenía, ya lo puse pero sale lo mismo.
__________________
Todos somos iguales. NO! a la violencia de género.
  #10 (permalink)  
Antiguo 26/12/2013, 10:41
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

Pues bueno si ya eso es otra cosa

No tengo la mas remota idea de como funcionan esas clases

Si el error te lo tira aquí

Código PHP:
Ver original
  1. $recordSet = $BD->dbLink->Execute($query);

Y te dice que

Cita:
Call to a member function Execute() on a non-object
Significa que dbLink es nulo o no es un objeto. Adivinando y sospechando el error creo que tu error esta en ConexionDB.class.php

Prueba esto:

Código PHP:
Ver original
  1. <?php
  2. require_once ADODB_BASEFILE;
  3. class ConexionDB {
  4.  
  5.     public $dbLink;
  6.  
  7.     function __construct(){
  8.        
  9.     }
  10.  
  11.     function ConexionDB(){
  12.         $dbLink = ADONewConnection(DB_TYPE);
  13.         $dbLink->SetFetchMode(ADODB_FETCH_ASSOC);
  14.         $dbconnected = $dbLink->PConnect(DB_HOST, DB_USER, DB_KEY, DB_DATA);
  15.         if (!$dbconnected){
  16.             Debug::println('No se pudo conectar a la Base de Datos');
  17.             exit(0);
  18.         } else {
  19.             $this->dbLink = $dbconnected;
  20.         }
  21.     }
  22.     function __destruct(){
  23.        
  24.     }
  25. }
  26. ?>

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #11 (permalink)  
Antiguo 26/12/2013, 11:28
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
Pues bueno si ya eso es otra cosa

No tengo la mas remota idea de como funcionan esas clases

Si el error te lo tira aquí

Código PHP:
Ver original
  1. $recordSet = $BD->dbLink->Execute($query);

Y te dice que



Significa que dbLink es nulo o no es un objeto. Adivinando y sospechando el error creo que tu error esta en ConexionDB.class.php

Prueba esto:

Código PHP:
Ver original
  1. <?php
  2. require_once ADODB_BASEFILE;
  3. class ConexionDB {
  4.  
  5.     public $dbLink;
  6.  
  7.     function __construct(){
  8.        
  9.     }
  10.  
  11.     function ConexionDB(){
  12.         $dbLink = ADONewConnection(DB_TYPE);
  13.         $dbLink->SetFetchMode(ADODB_FETCH_ASSOC);
  14.         $dbconnected = $dbLink->PConnect(DB_HOST, DB_USER, DB_KEY, DB_DATA);
  15.         if (!$dbconnected){
  16.             Debug::println('No se pudo conectar a la Base de Datos');
  17.             exit(0);
  18.         } else {
  19.             $this->dbLink = $dbconnected;
  20.         }
  21.     }
  22.     function __destruct(){
  23.        
  24.     }
  25. }
  26. ?>

Saludos
Sale lo mismo, cambiaste algo en la clase? creo que no.
Te explico un poco mi código:
La clase que inicio este post es la que define la estructura del proyecto que utilizará plantillas Smarty3 (Solo funciona con PHP5).
La clase productoDAO llama a la clase ConexionDB para conectarse a la base de datos (utiliza ADOdb) y luego mostrar los valores en un array, tengo una clase VO que tiene la estructura de la tabla a usar.
Todo esto funciona bien con Smarty 2.x y PHP4.x pero al migrar al Smarty3 aparecen los errores.
Espero comentarios.
Gracias.
__________________
Todos somos iguales. NO! a la violencia de género.
  #12 (permalink)  
Antiguo 30/12/2013, 08:24
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

Hola, no sé si esto te funcione (la de pasar variables por referencia es sacado de la documentación)

ConexionDB.class.php (se cambia el modo invocar el constructor)
Código PHP:
Ver original
  1. <?php
  2. require_once ADODB_BASEFILE;
  3. class ConexionDB {
  4.  
  5.     public $dbLink;
  6.  
  7.     public function __construct(){
  8.         $this->dbLink = &ADONewConnection(DB_TYPE); //Se pasa por referencia
  9.         $this->dbLink->SetFetchMode(ADODB_FETCH_ASSOC);
  10.         $dbconnected = $this->dbLink->PConnect(DB_HOST, DB_USER, DB_KEY, DB_DATA);
  11.         if (!$dbconnected){
  12.             Debug::println('No se pudo conectar a la Base de Datos');
  13.             exit(0);
  14.         }
  15.     }
  16.  
  17.     function __destruct(){
  18.        
  19.     }
  20. }
  21. ?>

ProductoDAO.class.php
Código PHP:
Ver original
  1. <?php
  2. class ProductoDAO {
  3.  
  4.     public function __construct(){
  5.     }  
  6.  
  7.     function listar(){
  8.         $query = "SELECT id_producto, id_categoria, nombre, descripcion, precio, stock, importancia, imagen FROM producto order by id_producto";
  9.         $BD = new ConexionDB();
  10.         $recordSet = &$BD->dbLink->Execute($query); //Se pasa por referencia
  11.         if (!$recordSet){
  12.             Debug::println("No se pudo ejecutar la consulta listar: " . $query);
  13.             return false;
  14.         }
  15.         $productos = array();
  16.         while($fila=$recordSet->FetchRow()) {
  17.             $productos[] = new ProductoVO($fila['id_producto'], $fila['id_categoria'], $fila['nombre'],
  18.                                       $fila['descripcion'], $fila['precio'], $fila['stock'], $fila['importancia'],
  19.                                       $fila['imagen']);
  20.         }
  21.         return $productos;
  22.     }
  23.  
  24.     function __destruct(){
  25.        
  26.     }
  27. }
  28. ?>

Pruebalo y nos comentas como te fue

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #13 (permalink)  
Antiguo 30/12/2013, 11:41
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Pregunta Respuesta: Smarty Clase constructor

Muestra los siguientes mensajes:

Código PHP:
Strict StandardsOnly variables should be assigned by reference in C:wwwprueba_resumenclasesutilConexionDB.class.php on line 8 
Código PHP:
Strict StandardsOnly variables should be assigned by reference in C:wwwprueba_resumenclasesdaoProductoDAO.class.php on line 10 
Pero si en ProductoDAO no modifico nada, no aparece el segundo error.
Y luego muestra los registros.
__________________
Todos somos iguales. NO! a la violencia de género.
  #14 (permalink)  
Antiguo 30/12/2013, 11:49
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

Bueno, entonces es una buena señal, quita los & de los dos archivos y has la pruebas.

PD: Mensaje 1000!!!

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #15 (permalink)  
Antiguo 30/12/2013, 11:57
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Sonrisa Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
Bueno, entonces es una buena señal, quita los & de los dos archivos y has la pruebas.

PD: Mensaje 1000!!!

Saludos
SIIIIIIIIIIIIII!!!!!!!!!!!!!!! ahora funciona.
hhmm.... claro que no me quedó muy claro qué hemos hecho con las clases... te agradeceré me expliques.
Y Ya vi que tienes 1000 mensajes WOW!!!
Muchas Gracias!!!!!
__________________
Todos somos iguales. NO! a la violencia de género.
  #16 (permalink)  
Antiguo 30/12/2013, 12:02
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

De nada y con mucho gusto

En pocas palabras, tomé como referencia de este error:

Cita:
Call to a member function Execute() on a non-object
Después de analizar bien el código y revisar la documentación de ADODB, me dí cuenta de que el código esta bien, pero el asunto era de que $BD->dbLink no tenía valor (la conexión a la base de datos), así que no se estaba ejecutando correctamente el código, la razón era que lo que había antes en el método ConexionDB había que pasarlo al constructor de la clase para que inmediatamente se instancie ConexionDB, dbLink tenga el valor correcto.

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #17 (permalink)  
Antiguo 30/12/2013, 12:11
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
De acuerdo Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
De nada y con mucho gusto

En pocas palabras, tomé como referencia de este error:



Después de analizar bien el código y revisar la documentación de ADODB, me dí cuenta de que el código esta bien, pero el asunto era de que $BD->dbLink no tenía valor (la conexión a la base de datos), así que no se estaba ejecutando correctamente el código, la razón era que lo que había antes en el método ConexionDB había que pasarlo al constructor de la clase para que inmediatamente se instancie ConexionDB, dbLink tenga el valor correcto.

Saludos
Bueno, con el smarty 2.x funciona normal. Pero al cambiar a Smarty 3 se necesita cambiar todo a PHP5 y parece que el manejo orientado a objetos de las clases se vuelve un dolor de cabeza . Y eso todavía no entiendo muy bien.
No he encontrado mucha documentación sobre php5 y manejo de clases. pero si esta base funciona, entonces ya lo demás debe ir funcionando.
__________________
Todos somos iguales. NO! a la violencia de género.
  #18 (permalink)  
Antiguo 30/12/2013, 12:25
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Smarty Clase constructor

Pues en la web hay mucha información de POO y de PHP5 la verdad no es nada complejo. Lo único que cambia es, por decirlo así, es el nivel de abstracción que debes de tener a la hora de realizar una clase para saber hasta que punto estas re usando código.

Esta pagina te puede dar una guía básica de lo que puedes hacer con POO

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #19 (permalink)  
Antiguo 30/12/2013, 13:56
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Respuesta: Smarty Clase constructor

Cita:
Iniciado por jonni09lo Ver Mensaje
Pues en la web hay mucha información de POO y de PHP5 la verdad no es nada complejo. Lo único que cambia es, por decirlo así, es el nivel de abstracción que debes de tener a la hora de realizar una clase para saber hasta que punto estas re usando código.

Esta pagina te puede dar una guía básica de lo que puedes hacer con POO

Saludos
Tengo que revisar mucho. Ya estaré posteando algún otro problema con php5 o de la estructura que hemos visto.
Gracias nuevamente.
__________________
Todos somos iguales. NO! a la violencia de género.

Etiquetas: clase, constructor, smarty
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 18:34.