Respuesta.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace common\data;
  3. use common\rest\Serializer;
  4. use yii\data\ActiveDataProvider;
  5. class Respuesta {
  6. public $cuerpo = [];
  7. protected $atributosPermitidos = [
  8. 'resultado',
  9. 'mensaje',
  10. 'errores',
  11. 'detalle',
  12. 'paginacion'
  13. ];
  14. protected $parametros = [
  15. "total" => 0,
  16. "pagina" => 0,
  17. "limite" => 0,
  18. "ordenar" => false
  19. ];
  20. public function __set($nombre, $valor) {
  21. if(!in_array($nombre, $this->atributosPermitidos)) {
  22. return;
  23. }
  24. $this->cuerpo[$nombre] = $valor;
  25. }
  26. public function __get($nombre) {
  27. if(isset($this->cuerpo[$nombre])) {
  28. return $this->cuerpo[$nombre];
  29. }
  30. return null;
  31. }
  32. public function __construct($modelo = null, $limite = 20, $pagina = 1, $ordenar = false) {
  33. $this->parametros['limite'] = $limite;
  34. $this->parametros['pagina'] = $pagina;
  35. $this->parametros['ordenar'] = $ordenar;
  36. if($modelo !== null) {
  37. $this->modelo($modelo);
  38. }
  39. }
  40. public function modelo($modelo) {
  41. $this->esExitoso();
  42. if ($modelo instanceof \yii\db\ActiveRecord) {
  43. if ($modelo->hasErrors()) {
  44. $this->esError();
  45. $this->errores = $modelo->getFirstErrors();
  46. } else {
  47. $this->detalle($modelo->toArray());
  48. }
  49. } elseif ($modelo instanceof \yii\db\ActiveQuery || $modelo instanceof \yii\db\Query) {
  50. \Yii::$app->getResponse()->setStatusCode(200);
  51. $req = \Yii::$app->getRequest();
  52. $sql = intval($req->get("sql", "")) === 1;
  53. if ($sql) {
  54. \Yii::$app->getResponse()->format = \yii\web\Response::FORMAT_RAW;
  55. echo $modelo->createCommand()->getRawSql();
  56. exit(0);
  57. }
  58. $limite = intval($this->parametros['limite']);
  59. $pagina = intval($this->parametros['pagina']);
  60. $ordenar = $this->parametros['ordenar'];
  61. $total = $modelo->count();
  62. if($pagina <= 0) {
  63. $pagina = 1;
  64. }
  65. $offset = 0;
  66. if (($pagina - 1) >= 0) {
  67. $offset = $limite * ($pagina - 1);
  68. }
  69. if($offset > 0) {
  70. $modelo->offset($offset);
  71. }
  72. $modelo->limit($limite);
  73. if ($ordenar !== false && ($campo = trim($ordenar)) !== "") {
  74. $separar = explode(",", $ordenar);
  75. $ordenamiento = [];
  76. foreach ($separar as $segmento) {
  77. $exp = explode("-", trim($segmento));
  78. $desc = false;
  79. if (count($exp) > 1) {
  80. $campo = $exp[0];
  81. $desc = $exp[1] === 'desc';
  82. }
  83. $ordenamiento[$campo] = $desc ? SORT_DESC : SORT_ASC;
  84. }
  85. if (!empty($ordenamiento)) {
  86. $modelo->orderBy($ordenamiento);
  87. }
  88. }
  89. if ($limite > $total || $limite <= 0) {
  90. $limite = $total;
  91. }
  92. $this->paginacion = [
  93. "total" => (int)$total, # Total de elementos
  94. "pagina" => $pagina, # Página actual
  95. "limite" => $limite # Elementos por página
  96. ];
  97. $s = new Serializer();
  98. $this->resultado = $s->serialize(new ActiveDataProvider(["query" => $modelo, "pagination" => false]));
  99. } elseif(is_array($modelo) && isset($modelo[0])) {
  100. $total = count($modelo);
  101. $this->paginacion = [
  102. "total" => $total,
  103. "pagina" => 1,
  104. "limite" => $total
  105. ];
  106. $this->resultado = $modelo;
  107. } else {
  108. $this->paginacion = [
  109. "total" => 1,
  110. "pagina" => 1,
  111. "limite" => 1
  112. ];
  113. $this->resultado = [$modelo];
  114. }
  115. return $this;
  116. }
  117. public function esExitoso($codigo = 200) {
  118. \Yii::$app->getResponse()->setStatusCode($codigo);
  119. return $this;
  120. }
  121. public function esError($codigo = 400) {
  122. \Yii::$app->getResponse()->setStatusCode($codigo);
  123. return $this;
  124. }
  125. public function detalle($detalle) {
  126. $this->detalle = $detalle;
  127. return $this;
  128. }
  129. public function mensaje($mensaje) {
  130. $this->mensaje = $mensaje;
  131. return $this;
  132. }
  133. public function getParametros() {
  134. return $this->parametros;
  135. }
  136. }