Diferencia entre revisiones de «Como Programar Consultas Paginadas en KumbiaPHP»

De KumbiaPHP Framework Wiki
 
(No se muestran 6 ediciones intermedias de 2 usuarios)
Línea 9: Línea 9:
  
 
<source lang='sql'>
 
<source lang='sql'>
CREATE TABLE Pais
+
CREATE SCHEMA geo;
 +
 
 +
CREATE TABLE geo.Pais
 
(
 
(
 
   Id serial,
 
   Id serial,
Línea 15: Línea 17:
 
   Codigo char(2) UNIQUE NOT NULL,
 
   Codigo char(2) UNIQUE NOT NULL,
 
   Nombre character varying(100) NOT NULL,
 
   Nombre character varying(100) NOT NULL,
 +
  Bandera bytea,
 
   Activ boolean DEFAULT true
 
   Activ boolean DEFAULT true
 
);
 
);
  
CREATE TABLE Departamento
+
CREATE TABLE geo.Departamento
 
(
 
(
 
   Id serial,
 
   Id serial,
Línea 28: Línea 31:
 
);
 
);
  
CREATE TABLE Ciudad
+
CREATE TABLE geo.Ciudad
 
(
 
(
 
   Id bigserial,
 
   Id bigserial,
Línea 47: Línea 50:
 
<?php
 
<?php
 
class Pais extends ActiveRecord {
 
class Pais extends ActiveRecord {
public $schema = 'geo';
+
protected $schema = 'geo';
 
public function getPaises($page, $ppage=25)
 
public function getPaises($page, $ppage=25)
 
{
 
{
Línea 66: Línea 69:
 
<?php
 
<?php
 
class Departamento extends ActiveRecord {
 
class Departamento extends ActiveRecord {
public $schema = 'geo';
+
protected $schema = 'geo';
 
public function getDepartamentosPais($page, $paisid, $ppage=25)
 
public function getDepartamentosPais($page, $paisid, $ppage=25)
 
{
 
{
Línea 89: Línea 92:
 
<?php
 
<?php
 
class Ciudad extends ActiveRecord {
 
class Ciudad extends ActiveRecord {
public $schema = 'geo';
+
protected $schema = 'geo';
 
public function getCiudadesPais($page, $paisid, $ppage=25)
 
public function getCiudadesPais($page, $paisid, $ppage=25)
 
{
 
{
Línea 108: Línea 111:
  
  
'''Controlador: pais_controller.php'''
+
'''Controlador: ../geo/pais_controller.php'''
  
 
<source lang='php'>
 
<source lang='php'>
 
<?php
 
<?php
 
Load::models('ciudad', 'pais');
 
Load::models('ciudad', 'pais');
class PaisController extends ApplicationController {
+
class PaisController extends AppController {
public function index($page=1)
+
  public function index($page=1)
{
+
  {
$pais = new Pais();
+
    $pais = new Pais();
$this->listPaises = $pais->getPaises($page);
+
    $this->listPaises = $pais->getPaises($page);
}
+
  }
 
   
 
   
public function pageCiudades($page=1, $paisid=48)
+
  public function pageCiudades($page=1, $paisid=48)
{
+
  {
$paises = new Pais();
+
    $paises = new Pais();
$this->nombredelpais = $paises->getNombre($paisid);
+
    $this->nombredelpais = $paises->getNombre($paisid);
$ciudadespais = new Ciudad();
+
    $ciudadespais = new Ciudad();
$this->listCiudadesPais = $ciudadespais->getCiudadesPais($page, $paisid);
+
    $this->listCiudadesPais = $ciudadespais->getCiudadesPais($page, $paisid);
}
+
  }
 
}
 
}
 +
?>
 
</source>
 
</source>
  
  
''' Vista: views/pais/index.phtml '''
+
''' Vista: ../geo/pais/index.phtml '''
  
 
<source lang='php'>
 
<source lang='php'>
 
<div class="content">
 
<div class="content">
<?php echo View::content();?>
+
  <?php echo View::content();?>
<h3>Paises</h3>
+
  <h3>Paises</h3>
<ul>
+
  <ul>
<?php foreach ($listPaises->items as $item):?>
+
  <?php foreach ($listPaises->items as $item):?>
<li>
+
  <li>
<?php if ($item->id == 48) echo Html::link("departamento/index/1/$item->id", $item->codigo); else echo Html::link("pais/pageCiudades/1/$item->id", $item->codigo);?> - <?php echo $item->nombre?>
+
    <?php if ($item->id == 48) echo Html::link("geo/departamento/index/1/$item->id", $item->codigo); else echo Html::linkAction("pageCiudades/1/$item->id", $item->codigo);?> - <?php echo $item->nombre?> - <?php echo Html::img('banderas/' . 'flag_' . $item->codigo . '.gif', "$item->nombre")?>
</li>
+
  </li>
<?php endforeach;?>
+
  <?php endforeach;?>
</ul>
+
  </ul>
<?php if($listPaises->prev) echo Html::linkAction("index/$listPaises->prev/", '<< Anterior |');?>
+
  <?php if($listPaises->prev) echo Html::linkAction("index/$listPaises->prev/", '<< Anterior |');?>
<?php if($listPaises->next) echo Html::linkAction("index/$listPaises->next/", 'Próximo >>');?>
+
  <?php if($listPaises->next) echo Html::linkAction("index/$listPaises->next/", 'Próximo >>');?>
 
</div>
 
</div>
 
</source>
 
</source>
  
  
''' Vista: views/pais/pageCiudades.phtml'''
+
''' Vista: ../geo/pais/pageCiudades.phtml'''
  
 
<source lang='php'>
 
<source lang='php'>
 
<div class="content">
 
<div class="content">
<?php echo View::content();?>
+
  <?php echo View::content();?>
<h3>Ciudades de <?php echo $nombredelpais;?></h3>
+
  <h3>Ciudades de <?php echo $nombredelpais;?></h3>
<ul>
+
  <ul>
<?php foreach ($listCiudadesPais->items as $item):?>
+
  <?php foreach ($listCiudadesPais->items as $item):?>
<li>
+
  <li>
<?php if ($item->codigo == "  ") echo "ZZZ"; else echo $item->codigo;?> - <?php echo $item->nombre;?>
+
    <?php if ($item->codigo == "  ") echo "S/C"; else echo $item->codigo;?> - <?php echo $item->nombre;?>
</li>
+
  </li>
<?php endforeach;?>
+
  <?php endforeach;?>
</ul>
+
  </ul>
<?php if($listCiudadesPais->prev) echo Html::linkAction("pageCiudades/$listCiudadesPais->prev/$item->pais_id/", '<< Anterior |');?>
+
  <?php if($listCiudadesPais->prev) echo Html::linkAction("pageCiudades/$listCiudadesPais->prev/$item->pais_id/", '<< Anterior |');?>
<?php if($listCiudadesPais->next) echo Html::linkAction("pageCiudades/$listCiudadesPais->next/$item->pais_id/", 'Próximo >>');?>
+
  <?php if($listCiudadesPais->next) echo Html::linkAction("pageCiudades/$listCiudadesPais->next/$item->pais_id/", 'Próximo >>');?>
 
</div>
 
</div>
 
</source>
 
</source>
  
  
''' Controlador: departamento_controller.php '''
+
''' Controlador: ../geo/departamento_controller.php '''
  
 
<source lang='php'>
 
<source lang='php'>
Línea 175: Línea 179:
 
Load::models('ciudad', 'departamento', 'pais');
 
Load::models('ciudad', 'departamento', 'pais');
 
class DepartamentoController extends ApplicationController {
 
class DepartamentoController extends ApplicationController {
public function index($page=1, $paisid=48)
+
  public function index($page=1, $paisid=48)
{
+
  {
$paises = new Pais();
+
    $paises = new Pais();
$this->nombredelpais = $paises->getNombre($paisid);
+
    $this->nombredelpais = $paises->getNombre($paisid);
$departamentospais = new Departamento();
+
    $departamentospais = new Departamento();
$this->listDepartamentosPais = $departamentospais->getDepartamentosPais($page, $paisid);
+
    $this->listDepartamentosPais = $departamentospais->getDepartamentosPais($page, $paisid);
}
+
  }
public function pageCiudades($page=1, $departamentoid=15)
+
  public function pageCiudades($page=1, $departamentoid=15)
{
+
  {
$departamentos = new Departamento();
+
    $departamentos = new Departamento();
$this->nombredeldepartamento = $departamentos->getNombre($departamentoid);
+
    $this->nombredeldepartamento = $departamentos->getNombre($departamentoid);
$this->idpais = $departamentos->getIdPais($departamentoid);
+
    $this->idpais = $departamentos->getIdPais($departamentoid);
$paises = new Pais();
+
    $paises = new Pais();
$this->nombredelpais = $paises->getNombre($this->idpais);
+
    $this->nombredelpais = $paises->getNombre($this->idpais);
$ciudadesdepartamento = new Ciudad();
+
    $ciudadesdepartamento = new Ciudad();
$this->listCiudadesDepartamento = $ciudadesdepartamento->getCiudadesDepartamento($page, $departamentoid);
+
    $this->listCiudadesDepartamento = $ciudadesdepartamento->getCiudadesDepartamento($page, $departamentoid);
}
+
  }
 
}
 
}
 
?>
 
?>
Línea 197: Línea 201:
  
  
''' Vista: views/departamento/index.phtml '''
+
''' Vista: ../geo/departamento/index.phtml '''
  
 
<source lang='php'>
 
<source lang='php'>
 
<div class="content">
 
<div class="content">
<?php echo View::content();?>
+
  <?php echo View::content();?>
<h3>Departamentos de <?php echo $nombredelpais;?></h3>
+
  <h3>Departamentos de <?php echo $nombredelpais;?></h3>
<ul>
+
  <ul>
<?php foreach ($listDepartamentosPais->items as $item):?>
+
  <?php foreach ($listDepartamentosPais->items as $item):?>
<li>
+
  <li>
<?php echo Html::link("departamento/pageCiudades/1/$item->id", str_pad($item->codigonumerico, 2, "0", STR_PAD_LEFT));?> - <?php echo $item->nombre;?>
+
    <?php echo Html::linkAction("pageCiudades/1/$item->id", str_pad($item->codigonumerico, 2, "0", STR_PAD_LEFT));?> - <?php echo $item->nombre;?>
</li>
+
  </li>
<?php endforeach;?>
+
  <?php endforeach;?>
</ul>
+
  </ul>
<?php if($listDepartamentosPais->prev) echo Html::linkAction("index/$listDepartamentosPais->prev/$item->pais_id/", '<< Anterior |');?>
+
  <?php if($listDepartamentosPais->prev) echo Html::linkAction("index/$listDepartamentosPais->prev/$item->pais_id/", '<< Anterior |');?>
<?php if($listDepartamentosPais->next) echo Html::linkAction("index/$listDepartamentosPais->next/$item->pais_id/", 'Próximo >>');?>
+
  <?php if($listDepartamentosPais->next) echo Html::linkAction("index/$listDepartamentosPais->next/$item->pais_id/", 'Próximo >>');?>
</div></source>
+
</div>
 +
</source>
  
  
''' Vista: views/departamento/pageCiudades.phtml'''
+
''' Vista: ../geo/departamento/pageCiudades.phtml'''
  
 
<source lang='php'>
 
<source lang='php'>
 
<div class="content">
 
<div class="content">
<?php echo View::content();?>
+
  <?php echo View::content();?>
<h3>Ciudades de <?php echo $nombredeldepartamento;?> - <?php echo $nombredelpais;?></h3>
+
  <h3>Ciudades de <?php echo $nombredeldepartamento;?> - <?php echo $nombredelpais;?></h3>
<ul>
+
  <ul>
<?php foreach ($listCiudadesDepartamento->items as $item):?>
+
  <?php foreach ($listCiudadesDepartamento->items as $item):?>
<li>
+
  <li>
<?php if ($item->codigo == "  ") echo "ZZZ"; else echo $item->codigo;?> - <?php echo str_pad($item->codigonumerico, 3, "0", STR_PAD_LEFT);?> - <?php echo $item->nombre;?>
+
    <?php if ($item->codigo == "  ") echo "S/C"; else echo $item->codigo;?> - <?php echo str_pad($item->codigonumerico, 3, "0", STR_PAD_LEFT);?> - <?php echo $item->nombre;?>
</li>
+
  </li>
<?php endforeach;?>
+
  <?php endforeach;?>
</ul>
+
  </ul>
<?php if($listCiudadesDepartamento->prev) echo Html::linkAction("pageCiudades/$listCiudadesDepartamento->prev/$item->departamento_id/", '<< Anterior |');?>
+
  <?php if($listCiudadesDepartamento->prev) echo Html::linkAction("pageCiudades/$listCiudadesDepartamento->prev/$item->departamento_id/", '<< Anterior |');?>
<?php if($listCiudadesDepartamento->next) echo Html::linkAction("pageCiudades/$listCiudadesDepartamento->next/$item->departamento_id/", 'Próximo >>');?>
+
  <?php if($listCiudadesDepartamento->next) echo Html::linkAction("pageCiudades/$listCiudadesDepartamento->next/$item->departamento_id/", 'Próximo >>');?>
 
</div>
 
</div>
 
</source>
 
</source>

Revisión actual del 02:28 27 may 2012

Tomado del ejemplo: Como Programar Consultas Paginadas en KUMBIAPHP


Diagrama de Clases

Geo.png

DDL para PostgreSQL

CREATE SCHEMA geo;

CREATE TABLE geo.Pais
(
  Id serial,
  PRIMARY KEY (Id),
  Codigo char(2) UNIQUE NOT NULL,
  Nombre character varying(100) NOT NULL,
  Bandera bytea,
  Activ boolean DEFAULT true
);

CREATE TABLE geo.Departamento
(
  Id serial,
  PRIMARY KEY (Id),
  Nombre character varying(100) NOT NULL,
  Pais_Id integer REFERENCES Pais(Id) NOT NULL,
  CodigoNumerico integer,
  Activ boolean DEFAULT true
);

CREATE TABLE geo.Ciudad
(
  Id bigserial,
  PRIMARY KEY (Id),
  Nombre character varying(100) NOT NULL,
  Pais_Id integer REFERENCES Pais(Id) NOT NULL,
  Departamento_Id integer REFERENCES Departamento(Id),
  Codigo char(3) DEFAULT '   ',
  CodigoNumerico integer,
  Activ boolean DEFAULT true
);


Modelo: pais.php

<?php
class Pais extends ActiveRecord {
	protected $schema = 'geo';
	public function getPaises($page, $ppage=25)
	{
		return $this->paginate("page: $page", "per_page: $ppage", 'order: nombre asc');
	}
	public function getNombre($id)
	{
		return $this->find($id)->nombre;
	}
}
?>


Modelo: departamento.php

<?php
class Departamento extends ActiveRecord {
	protected $schema = 'geo';
	public function getDepartamentosPais($page, $paisid, $ppage=25)
	{
		return $this->paginate("page: $page", "pais_id = $paisid", "per_page: $ppage", 'order: nombre asc');
	}
	public function getNombre($id)
	{
		return $this->find($id)->nombre;
	}
	public function getIdPais($id)
	{
		return $this->find($id)->pais_id;
	}
}
?>


Modelo: ciudad.php

<?php
class Ciudad extends ActiveRecord {
	protected $schema = 'geo';
	public function getCiudadesPais($page, $paisid, $ppage=25)
	{
		return $this->paginate("page: $page", "pais_id = $paisid", "per_page: $ppage", 'order: nombre asc');
	}
	public function getCiudadesDepartamento($page, $departamentoid, $ppage=25)
	{
		return $this->paginate("page: $page", "departamento_id = $departamentoid", "per_page: $ppage", 'order: nombre asc');
	}
}
?>


Diagrama de Secuencia

ConsultaGeo.png


Controlador: ../geo/pais_controller.php

<?php
Load::models('ciudad', 'pais');
class PaisController extends AppController {
  public function index($page=1)
  {
    $pais = new Pais();
    $this->listPaises = $pais->getPaises($page);
  }
 
  public function pageCiudades($page=1, $paisid=48)
  {
    $paises = new Pais();
    $this->nombredelpais = $paises->getNombre($paisid);
    $ciudadespais = new Ciudad();
    $this->listCiudadesPais = $ciudadespais->getCiudadesPais($page, $paisid);
  }
}
?>


Vista: ../geo/pais/index.phtml

<div class="content">
  <?php echo View::content();?>
  <h3>Paises</h3>
  <ul>
  <?php foreach ($listPaises->items as $item):?>
  <li>
    <?php if ($item->id == 48) echo Html::link("geo/departamento/index/1/$item->id", $item->codigo); else echo Html::linkAction("pageCiudades/1/$item->id", $item->codigo);?> - <?php echo $item->nombre?> - <?php echo Html::img('banderas/' . 'flag_' . $item->codigo . '.gif', "$item->nombre")?>
  </li>
  <?php endforeach;?>
  </ul>
  <?php if($listPaises->prev) echo Html::linkAction("index/$listPaises->prev/", '<< Anterior |');?>
  <?php if($listPaises->next) echo Html::linkAction("index/$listPaises->next/", 'Próximo >>');?>
</div>


Vista: ../geo/pais/pageCiudades.phtml

<div class="content">
  <?php echo View::content();?>
  <h3>Ciudades de <?php echo $nombredelpais;?></h3>
  <ul>
  <?php foreach ($listCiudadesPais->items as $item):?>
  <li>
    <?php if ($item->codigo == "   ") echo "S/C"; else echo $item->codigo;?> - <?php echo $item->nombre;?>
  </li>
  <?php endforeach;?>
  </ul>
  <?php if($listCiudadesPais->prev) echo Html::linkAction("pageCiudades/$listCiudadesPais->prev/$item->pais_id/", '<< Anterior |');?>
  <?php if($listCiudadesPais->next) echo Html::linkAction("pageCiudades/$listCiudadesPais->next/$item->pais_id/", 'Próximo >>');?>
</div>


Controlador: ../geo/departamento_controller.php

<?php
Load::models('ciudad', 'departamento', 'pais');
class DepartamentoController extends ApplicationController {
  public function index($page=1, $paisid=48)
  {
    $paises = new Pais();
    $this->nombredelpais = $paises->getNombre($paisid);
    $departamentospais = new Departamento();
    $this->listDepartamentosPais = $departamentospais->getDepartamentosPais($page, $paisid);
  }
  public function pageCiudades($page=1, $departamentoid=15)
  {
    $departamentos = new Departamento();
    $this->nombredeldepartamento = $departamentos->getNombre($departamentoid);
    $this->idpais = $departamentos->getIdPais($departamentoid);
    $paises = new Pais();
    $this->nombredelpais = $paises->getNombre($this->idpais);
    $ciudadesdepartamento = new Ciudad();
    $this->listCiudadesDepartamento = $ciudadesdepartamento->getCiudadesDepartamento($page, $departamentoid);
  }
}
?>


Vista: ../geo/departamento/index.phtml

<div class="content">
  <?php echo View::content();?>
  <h3>Departamentos de <?php echo $nombredelpais;?></h3>
  <ul>
  <?php foreach ($listDepartamentosPais->items as $item):?>
  <li>
    <?php echo Html::linkAction("pageCiudades/1/$item->id", str_pad($item->codigonumerico, 2, "0", STR_PAD_LEFT));?> - <?php echo $item->nombre;?>
  </li>
  <?php endforeach;?>
  </ul>
  <?php if($listDepartamentosPais->prev) echo Html::linkAction("index/$listDepartamentosPais->prev/$item->pais_id/", '<< Anterior |');?>
  <?php if($listDepartamentosPais->next) echo Html::linkAction("index/$listDepartamentosPais->next/$item->pais_id/", 'Próximo >>');?>
</div>


Vista: ../geo/departamento/pageCiudades.phtml

<div class="content">
  <?php echo View::content();?>
  <h3>Ciudades de <?php echo $nombredeldepartamento;?> - <?php echo $nombredelpais;?></h3>
  <ul>
  <?php foreach ($listCiudadesDepartamento->items as $item):?>
  <li>
    <?php if ($item->codigo == "   ") echo "S/C"; else echo $item->codigo;?> - <?php echo str_pad($item->codigonumerico, 3, "0", STR_PAD_LEFT);?> - <?php echo $item->nombre;?>
  </li>
  <?php endforeach;?>
  </ul>
  <?php if($listCiudadesDepartamento->prev) echo Html::linkAction("pageCiudades/$listCiudadesDepartamento->prev/$item->departamento_id/", '<< Anterior |');?>
  <?php if($listCiudadesDepartamento->next) echo Html::linkAction("pageCiudades/$listCiudadesDepartamento->next/$item->departamento_id/", 'Próximo >>');?>
</div>

--Cbeltranv 02:56 2 nov 2010 (UTC) --Henry.stivens 12:00 2 nov 2010 (UTC)