123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- <?php
- namespace common\data;
- use common\rest\Serializer;
- use yii\data\ActiveDataProvider;
- class Respuesta {
- public $cuerpo = [];
- protected $atributosPermitidos = [
- 'resultado',
- 'mensaje',
- 'errores',
- 'detalle',
- 'paginacion'
- ];
- protected $parametros = [
- "total" => 0,
- "pagina" => 0,
- "limite" => 0,
- "ordenar" => false
- ];
- public function __set($nombre, $valor) {
- if(!in_array($nombre, $this->atributosPermitidos)) {
- return;
- }
- $this->cuerpo[$nombre] = $valor;
- }
- public function __get($nombre) {
- if(isset($this->cuerpo[$nombre])) {
- return $this->cuerpo[$nombre];
- }
- return null;
- }
- public function __construct($modelo = null, $limite = 20, $pagina = 1, $ordenar = false) {
- $this->parametros['limite'] = $limite;
- $this->parametros['pagina'] = $pagina;
- $this->parametros['ordenar'] = $ordenar;
- if($modelo !== null) {
- $this->modelo($modelo);
- }
- }
- public function modelo($modelo) {
- $this->esExitoso();
- if ($modelo instanceof \yii\db\ActiveRecord) {
- if ($modelo->hasErrors()) {
- $this->esError();
- $this->errores = $modelo->getFirstErrors();
- } else {
- $this->detalle($modelo->toArray());
- }
- } elseif ($modelo instanceof \yii\db\ActiveQuery || $modelo instanceof \yii\db\Query) {
- \Yii::$app->getResponse()->setStatusCode(200);
- $req = \Yii::$app->getRequest();
- $sql = intval($req->get("sql", "")) === 1;
- if ($sql) {
- \Yii::$app->getResponse()->format = \yii\web\Response::FORMAT_RAW;
- echo $modelo->createCommand()->getRawSql();
- exit(0);
- }
- $limite = intval($this->parametros['limite']);
- $pagina = intval($this->parametros['pagina']);
- $ordenar = $this->parametros['ordenar'];
- $total = $modelo->count();
- if($pagina <= 0) {
- $pagina = 1;
- }
- $offset = 0;
- if (($pagina - 1) >= 0) {
- $offset = $limite * ($pagina - 1);
- }
- if($offset > 0) {
- $modelo->offset($offset);
- }
- $modelo->limit($limite);
- if ($ordenar !== false && ($campo = trim($ordenar)) !== "") {
- $separar = explode(",", $ordenar);
- $ordenamiento = [];
- foreach ($separar as $segmento) {
- $exp = explode("-", trim($segmento));
- $desc = false;
- if (count($exp) > 1) {
- $campo = $exp[0];
- $desc = $exp[1] === 'desc';
- }
- $ordenamiento[$campo] = $desc ? SORT_DESC : SORT_ASC;
- }
- if (!empty($ordenamiento)) {
- $modelo->orderBy($ordenamiento);
- }
- }
- if ($limite > $total || $limite <= 0) {
- $limite = $total;
- }
- $this->paginacion = [
- "total" => (int)$total, # Total de elementos
- "pagina" => $pagina, # Página actual
- "limite" => $limite # Elementos por página
- ];
- $s = new Serializer();
- $this->resultado = $s->serialize(new ActiveDataProvider(["query" => $modelo, "pagination" => false]));
- } elseif(is_array($modelo) && isset($modelo[0])) {
- $total = count($modelo);
- $this->paginacion = [
- "total" => $total,
- "pagina" => 1,
- "limite" => $total
- ];
- $this->resultado = $modelo;
- } else {
- $this->paginacion = [
- "total" => 1,
- "pagina" => 1,
- "limite" => 1
- ];
- $this->resultado = [$modelo];
- }
- return $this;
- }
- public function esExitoso($codigo = 200) {
- \Yii::$app->getResponse()->setStatusCode($codigo);
- return $this;
- }
-
- public function esError($codigo = 400) {
- \Yii::$app->getResponse()->setStatusCode($codigo);
- return $this;
- }
- public function detalle($detalle) {
- $this->detalle = $detalle;
- return $this;
- }
- public function mensaje($mensaje) {
- $this->mensaje = $mensaje;
- return $this;
- }
- public function getParametros() {
- return $this->parametros;
- }
- }
|