Foros del Web » Programando para Internet » PHP »

Problema con clases

Estas en el tema de Problema con clases en el foro de PHP en Foros del Web. Registracion.php Código: <? require('includes/setup.inc'); $smarty = new Smarty_PcDb; $smarty->assign('template_dir', 'templates/default'); if($_GET['action'] == "failed") { $smarty->display('templates/default/regist/failed.tpl'); } else if($_GET['action'] == "new") { $smarty->display('templates/default/regist/new.tpl'); } else if($_GET['action'] ...
  #1 (permalink)  
Antiguo 26/06/2004, 22:21
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Problema con clases

Registracion.php
Código:
<?
require('includes/setup.inc');

$smarty = new Smarty_PcDb;
$smarty->assign('template_dir', 'templates/default');

if($_GET['action'] == "failed") {
	$smarty->display('templates/default/regist/failed.tpl');
	}
	
else if($_GET['action'] == "new") {
	$smarty->display('templates/default/regist/new.tpl');
	}
	
else if($_GET['action'] == "forget") {
	$smarty->display('templates/default/regist/forget.tpl');
	}

else if($_GET['action'] == "save") {
	if(!empty($_POST['enviarReg'])) {
		$hayEmail = $pcdb_sql->query($db, "SELECT `email` FROM $db[prefix]_users WHERE `email` = '".$_POST['regEmail']."'", 4);
		if ($hayEmail[0] == $_POST['regEmail']) {
			class errors {
			function setError($id) {
				$smarty->assign('error_titulo','2');
			}
			}		
			$errors = new errors;
			$errors->setError(0);
			$smarty->display('templates/default/error.tpl');
		}
		else {
			$smarty->display('templates/default/regist/done.tpl');
			
			$pcdb_sql->query($db, "INSERT INTO $db[prefix]_users VALUES('','".$_POST['regUser']."','".$_POST['regPass']."',
			'".$_POST['regNombre']."','".$_POST['regDireccion']."','".$_POST['regCP']."','".$_POST['regCuit']."',
			'".$_POST['regTelefono']."','".$_POST['regEmail']."','".$_POST['regEmpresa']."','2000-11-15','0')", 0);
		}
	}
	
	else {
		$smarty->display('templates/default/index.tpl');
	}
}	

else if(empty($_GET['action'])) {
	$smarty->display('templates/default/index.tpl');
	}
	

?>
Setup.inc
Código:
<?
require('db.inc');
require('Smarty/Smarty.class.php');

$pcdb_sql->connect($db);

class Smarty_PcDb extends Smarty {
function Smarty_PcDb()
      {
	    // Constructor de la clase
          $this->Smarty();
          $this->template_dir = '/www/vhosts/myscene/smarty/tpl/';
          $this->compile_dir = '/www/vhosts/myscene/smarty/tpl_c/';
          $this->config_dir = '/www/vhosts/myscene/smarty/configs/';
          $this->cache_dir = '/www/vhosts/myscene/smarty/cache/';
          $this->assign('app_name','PcDb');
	}
}

?>

Paso a explicar:
Yo utilizo el sistema de templates Smarty. El error lo obtengo al tratar de hacer una clase que cuando alguien intenta registrarse, si por ejemplo el email ya existe, me facilite algunas cosas.

Código:
	class errors {
			function setError($id) {
				$smarty->assign('error_titulo','titulo lindo');
			}
			}
La clase es más larga, pero ahi sinteticé lo que me da error.
El error que obtengo es

[Sat Jun 26 21:11:04 2004] [error] PHP Fatal error: Call to a member function on a non-object in /www/vhosts/myscene/registracion.php on line 25

Si no usaron smarty no se preocupen, aca el error es mas conceptual, algo de las clases que estoy ignorando
Muchas gracias de antemano

Última edición por Appletalk; 26/06/2004 a las 22:30
  #2 (permalink)  
Antiguo 27/06/2004, 12:12
Avatar de sism82  
Fecha de Ingreso: octubre-2003
Ubicación: Guadalajara
Mensajes: 865
Antigüedad: 14 años, 1 mes
Puntos: 1
el código que indicas se ve correcto por si solo, pero los errores a veces se arrastran desde muchas lineas atrás.
No parece que estes instanciando $smarty antes de usarlo. Por eso te dice que estas intentando usar una funcion de una variable que no es un objeto. O estas seguro de que $smarty ya es un objeto en el momento que lo llamas dentro de tu clase error??
  #3 (permalink)  
Antiguo 27/06/2004, 15:05
 
Fecha de Ingreso: junio-2004
Mensajes: 84
Antigüedad: 13 años, 5 meses
Puntos: 0
Estimado Appletalk:
Creo que tu problema esta aqui.
$pcdb_sql->query
El objeto $pcdb_sql no se instancia en ningun momento, debido a eso el php te dice lo que dice.
__________________
Repositorio de funciones utiles para programadores y administradores
http://www.particle.com.ar
  #4 (permalink)  
Antiguo 27/06/2004, 16:32
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Voy a probar...
Con respecto a lo que decis eqsoftware, el objeto $pcdb_sql lo estoy instanciando en db.inc, con una clase que cree para la base de datos.
Y anda perfecta porque me conecto bien, pero me parece que estoy metiendo la pata con la clase smarty...

Muchas gracias
  #5 (permalink)  
Antiguo 27/06/2004, 23:27
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Creo el tema está en el scope de las variables.
Estás declarando una clase errors y utilizas la variable $smarty dentro de ella... pero la clase sólo "conoce" las variables que se crean dentro de ella, o que se le pasen como parámetro o las que sean globales.
Lo que puedes hacer es definirle un constructor al que le pases como parámetro el objeto $smarty
Código PHP:
class errors {
   var 
$_smarty;
   function 
errors(&$smrt){
      
$this->_smarty = &$smrt;
   }
   function 
setError($id) {
      
$this->_smarty->assign('error_titulo','titulo lindo');
   }

Algo así puede ser.
Saludos
  #6 (permalink)  
Antiguo 27/06/2004, 23:32
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
No sé si lo que pusearriba estará bien... pero estoy seguro de que el error es el que te te menciono (de scope - ámbito) de la variable... sería bueno que leas en el manual, ahí está todo más claro:
http://www.php.net/variables.scope

Saludos
  #7 (permalink)  
Antiguo 28/06/2004, 06:49
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Tenes toda la razon en el concepto, la clase errors no conoce $smarty.
Voy a ver como soluciono eso

Muchas gracias jpinedo
  #8 (permalink)  
Antiguo 28/06/2004, 19:48
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Use globales, ya esta, es inseguro pero bueno.
Si alguien me explica una forma alternativa para no usar globales se lo agradezco. O mejor aun, me pasa algun link
  #9 (permalink)  
Antiguo 28/06/2004, 20:18
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Probaste con la alternativa que te dí?
En el caso que te puse, le estás enviando $smarty como parámetro al constructor de la clase errors en lugar de hacerlo global.

Código PHP:
class errors 
   var 
$_smarty;

   
//Constructor
   
function errors(&$smrt){ 
      
$this->_smarty = &$smrt
   } 
   function 
setError($id) { 
      
$this->_smarty->assign('error_titulo','titulo lindo'); 
   } 

Luego cuando vas a crear una instancia de errors le pasas el $smarty algo así:
Código PHP:
$errors = &new errors($smarty); 
Ojalá te sirva
Saludos
  #10 (permalink)  
Antiguo 28/06/2004, 23:16
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Ah!
Una pregunta.. que significa el operador & que pusiste antes del new?
  #11 (permalink)  
Antiguo 29/06/2004, 00:44
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Puedes encontrar sobre "referencias" en el manual:
http://www.php.net/manual/es/language.references.php

También puedes ver en sitepoint:
http://www.sitepoint.com/article/object-oriented-php
El la página 5 de este excelente capítulo se hace una explicación bastante buena de las referencias.

Saludos

Última edición por jpinedo; 29/06/2004 a las 00:52
  #12 (permalink)  
Antiguo 29/06/2004, 01:04
 
Fecha de Ingreso: febrero-2004
Mensajes: 221
Antigüedad: 13 años, 10 meses
Puntos: 0
Gracias pinedito
En C++ también son referencias con el &, pero son como los punteros, salvo que no pueden ser reasignados

Ahora veo que utilidad tienen en PHP
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 23:12.