Como Programar Consultas Paginadas en KumbiaPHP
De KumbiaPHP Framework Wiki
Tomado del ejemplo: Como Programar Consultas Paginadas en KUMBIAPHP
Diagrama de Clases
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
Controlador: ../geo/pais_controller.php
<?php Load::models('ciudad', 'pais'); class PaisController extends ApplicationController { 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)



