Ver Mensaje Individual
  #6 (permalink)  
Antiguo 28/03/2008, 03:26
xberni
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona (España)
Mensajes: 134
Antigüedad: 19 años, 4 meses
Puntos: 0
Re: Usar método de una superclase

Gracias por la ayuda GatorV,

Antes que nada te comento que estoy usando Symfony, no se si conoces un poco el funcionamiento, pero se crean unas clases base (PizzaBase, IngredientBase y CompositionBase) que contienen todos los setters, getters, metodos save, delete, etc etc), y luego en tus clases (Pizza, Ingredient y composition) que heredan de las clases base, añades o redefines los métodos que quieras / necesites. Además, los métodos save() ya son lo suficientemente inteligentes para hacer un insert o un update segun sea la necesidad, así como de grabar los elementos asociados (por ejemplo grabar los ingredientes si grabas la pizza)

El método composition save(), que redefine al método de su superclase es este:

Código PHP:
public function save($con null)
    {
        
$con Propel::getConnection();
          try
          {
            
$con->begin();
            
            
$orden $this->getSiguienteOrden();
            
            
$this->setOrden($orden);
             
$ret parent::save($con);
             
            
$con->commit();
 
            return 
$ret;
        }
          catch (
Exception $e)
          {
            
$con->rollback();
            throw 
$e;
          }
    } 
Básicamente asigna un orden al ingrediente y llama al save() de su superclase. Este método usa Creole como abstracción de la base de datos:
Código PHP:
protected function getSiguienteOrden()
    {
        
$idPizza $this->getPizzaId();
        
        
$conexion Propel::getConnection();
        
$consulta 'SELECT MAX(%s) AS max FROM %s WHERE %s = %s';
        
$consulta sprintf($consultaCompositionPeer::ORDENCompositionPeer::TABLE_NAMECompositionPeer::PIZZA_ID$idPizza);
        
$sentencia $conexion->prepareStatement($consulta);
        
        
$resultset $sentencia->executeQuery();
        
$resultset->next();
        
$max $resultset->getInt('max');
        
        return 
$max+1;    

    } 
El método pizza->reordenaIngredientes() es así de simple:

Código PHP:
protected function reordenaIngredientes()
    {
        
$compositions $this->getCompositions();
        
        foreach (
$compositions as $composition)
        {
            
$orden 1;
            
$composition->setOrden($orden);
            
$orden++;
        }
    } 
Cuando elimino un ingrediente es cuando tengo que reordenar los ingredientes y grabar todo. Redefino el delete() de la superclase de composition:

Código PHP:
public function delete($con null)
    {
    
$con Propel::getConnection();
          try
          {
            
$con->begin();
            
             
$ret parent::delete($con);
             
$this->getPizza($con)->reordenaIngredientes();
             
             
$this->getPizza($con)->save();

            
$con->commit();
 
            return 
$ret;
        }
          catch (
Exception $e)
          {
            
$con->rollback();
            throw 
$e;
          }
    } 
Pero claro, al hacer pizza->save(), cuando ejecuta composition->save(), pues eso, que vuelve a llamar a getSiguienteOrden()...

Última edición por xberni; 28/03/2008 a las 05:33