Foros del Web » Programando para Internet » PHP » Symfony »

Filtrar datos con objeto criteria

Estas en el tema de Filtrar datos con objeto criteria en el foro de Symfony en Foros del Web. Estoy algo perdido con un modelo que tiene que filtrar los datos según dos menús, uno de categorías y otro de modelos. A ver si ...
  #1 (permalink)  
Antiguo 13/06/2013, 07:02
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 1 mes
Puntos: 0
Filtrar datos con objeto criteria

Estoy algo perdido con un modelo que tiene que filtrar los datos según dos menús, uno de categorías y otro de modelos. A ver si me podeis echar una manita

actions.class
Código:
  public function executeShow(sfWebRequest $request)
  {
        //Ordena menú categorías
  	$this->rogasanz_cat_accesorios_list = RogasanzCatAccesoriosPeer::ordenarMenu(); 
  	//Lista menú coches
  	$this->rogasanz_modelos_list = RogasanzModelosPeer::doSelect(new Criteria());
  	//Listado de artículos
   	$this->rogasanz_accesorios_list = RogasanzAccesoriosPeer::doSelect(new Criteria());  	
  	
   	//Recoge categoria y modelo seleccionado
  	$this->categoria = RogasanzCatAccesoriosPeer::retrieveByPk($request->getParameter('id'));
  	$this->modelo = RogasanzModelosPeer::retrieveByPk($request->getParameter('modelo_id'));
  	
    //$this->forward404Unless($this->categoria);
  }
La última línea del forward la he tenido que comentar por que me daba error de ob_start no se porqué.

showsucces.php
Código:
//Recojo las variables
<?php $cat = $categoria->getId() ?>
<?php $mod = $modelo->getId() ?>


//Muestra el menú de categorías
<div id="cabecera">
  <h1><?php echo $categoria->getNombre() ?></h1>
</div>

<div id="marco">
  <div id="menu">
    <?php foreach ($rogasanz_cat_accesorios_list as $i => $menu): ?>
    <ul>
      <li><a href="<?php echo url_for('accesorios/show?id='.$menu->getId()) ?>"><?php echo $menu->getNombre() ?></a></li>
     </ul>
     <?php endforeach; ?>
  </div>
</div>


//Muestra el menú de artículos
<div id="marco">
  <div id="cuerpo_articulos">
  <?php foreach ($rogasanz_accesorios_list as $accesorios): ?>

//Aqui viene la chapuza, solo cojo los articulos que sean igual a la variable del request
  <?php if($accesorios->getCategoriaId() == $cat AND $accesorios->getModeloId() == $mod ) : ?>

    <div id="articulos">   

      <div id="descripcion">
        <p class="nombre"><?php echo $accesorios->getNombre() ?></p> 
        <?php foreach ($rogasanz_modelos_list as $modelo): ?>
  	    <?php if($accesorios->getModeloId() == $modelo->getId()): echo "<p class='nombre'>".$modelo->getNombre()."</p>" ?><?php endif ?>
  	    <?php endforeach; ?>
        <p class="tipo"><?php echo $accesorios->getTipo() ?></p>
        <?php if($accesorios->getPrecio() <> null):?>
          <p class="precio"><?php echo quitaDecimal::quita_decimal($accesorios->getPrecio()) ?> €</p>
        <?php endif ?>
        <?php if($accesorios->getRef() <> null): echo "<p class='ref'>Ref:".$accesorios->getRef()."</p>" ?><?php endif ?>
      </div>
      
      <div id="foto">
        <?php if($accesorios->getFoto() <> null):?>
          <img src="/uploads/accesorios/<?php echo $accesorios->getFoto() ?>" alt="Accesorio">
        <?php endif;?>
      </div>

    </div>
  <?php endif; ?>
  <?php endforeach; ?>
  </div>
</div>


//Muestra el menú de modelos de coche
<div id="marco">
  <div id="filtro_modelos">
    <?php foreach ($rogasanz_modelos_list as $modelo): ?>
    <ul>
      <li>
      <a href="<?php echo url_for('accesorios/show?id='.$cat.'&modelo_id='.$modelo->getId()) ?>">
        <img src="/uploads/modelos/<?php echo $modelo->getFoto() ?>"></a><p><?php echo $modelo->getNombre() ?></p></li>
     </ul>
     <?php endforeach; ?>
  </div>
</div>

Con la chapuza esta de meter un IF en los articulos sale al paso, pero no me filtra bien los modelos de coche, por eso creo que tiene que haber alguna forma de establecer el objeto criteria de propel para poder recoger los datos según la categoria y el modelo escogido.

Esta hecho con symfony 1.4

Última edición por Delek; 13/06/2013 a las 10:11
  #2 (permalink)  
Antiguo 17/06/2013, 05:31
Avatar de Delek  
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 1 mes
Puntos: 0
Respuesta: Filtrar datos con objeto criteria

Parece que ya lo he solucionado, el problema parece ser que el retrieveByPk no funciona bien al recoger la cadena de request múltiple, por eso he recogido el modelo por un request normal. El problema viene ahora, que no se como refactorizar el código, que está en el action.class

Código:
  public function executeShow(sfWebRequest $request)
  {
    //Ordena menú categorías
  	$this->rogasanz_cat_accesorios_list = RogasanzCatAccesoriosPeer::ordenarMenu(); 
  	//Lista menú coches
  	$this->rogasanz_modelos_list = RogasanzModelosPeer::doSelect(new Criteria());

  	//Listado de artículos
	$this->modelo = $this->getRequestParameter('mod', null);
	$criteria = new Criteria();
	$this->categoria = RogasanzCatAccesoriosPeer::retrieveByPk($request->getParameter('id'));
    $criteria->add(RogasanzAccesoriosPeer::CATEGORIA_ID, $this->categoria->getId(), Criteria::EQUAL);
    if($this->modelo == !null)
    {
      $criteria->add(RogasanzAccesoriosPeer::MODELO_ID, $this->modelo, Criteria::EQUAL);
    }  
    $this->rogasanz_accesorios_list = RogasanzAccesoriosPeer::doSelect($criteria);

    $this->forward404Unless($this->categoria);
  }
Por ejemplo, al crear la función filtrarModelos para refactorizarla, no se donde heredar para que me reconozca la funcion getRequestParameter()

Código:
class RogasanzAccesoriosPeer extends BaseRogasanzAccesoriosPeer {
  
  public function __toString()
  {
    return $this->getNombre();
  }
  
  static public function ordenarMenu()
  {
  	  $criteria = new Criteria();
      $criteria->add(self::NOMBRE, null, Criteria::ISNOTNULL);
      $criteria->addAscendingOrderByColumn(self::NOMBRE);
      return self::doSelect($criteria);
  }

  static public function filtraModelos()
  {
	$this->modelo = $this->getRequestParameter('mod', null);

        etc...
        etc...
        etc...
  }

Etiquetas: criteria, filtrar, objeto
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:26.