Respuesta.php 4.1 KB

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