RawQueryTableHelper.php 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom;
  3. use MGModule\DNSManager2\mgLibs\MySQL as mysql;
  4. class RawQueryTableHelper {
  5. private $items_per_page = 10;
  6. private $page = 1;
  7. private $count_all;
  8. private $count_filtered;
  9. private $pages_count;
  10. private $data = array();
  11. /**
  12. * Klasa ta pomga w generowaniu outputu dla DataTables za pomocą zwykłego query
  13. * @param string $query
  14. * @param array $input
  15. * @param array $columns - dla tych kolumn włączony będzie search oraz sortowanie
  16. */
  17. public function __construct($query, $input, $columns) {
  18. // $columns = array(); //NOT WORKING :(
  19. // foreach(mysql\query::query("SHOW COLUMNS FROM ($query) t")->fetchAll() as $column)
  20. // $columns[] = $column['Field'];
  21. $count_all = mysql\query::query("SELECT COUNT(*) FROM ($query) t")->fetchColumn();
  22. $items_per_page = $input['limit']?:$this->items_per_page;
  23. $page = floor($input['offset']/$items_per_page);
  24. $order_by = array();
  25. if(in_array($input['order']['column'], $columns)) {
  26. $order_by[$input['order']['column']] = $input['order']['dir'];
  27. }
  28. $filters = array();
  29. foreach($input['filter'] as $column => $value)
  30. if(!empty($value)) {
  31. $filters[$column] = $value;
  32. }
  33. if($input['search']) {
  34. $search = array();
  35. foreach($columns as $column) {
  36. $uid = $column.uniqid();
  37. $search[] = array(
  38. 'or' => true,
  39. 'customQuery' => "`$column` LIKE :$uid",
  40. 'params' => array(
  41. $uid => "%{$input['search']}%",
  42. ),
  43. );
  44. }
  45. $search = mysql\query::parseConditions($search, $values);
  46. $filters[] = array(
  47. 'customQuery' => '( ' . $search . ' ) ',
  48. 'params' => $values,
  49. );
  50. }
  51. $count_filtered = mysql\query::count('*', " ($query) t", $filters, $order_by);
  52. $pages_count = floor($count_filtered/$items_per_page) + 1;
  53. if($page > $pages_count)
  54. $page = $pages_count;
  55. $limit_offset = (int) $input['offset'];
  56. $this->data = mysql\query::select(array('*'), " ($query) t", $filters, $order_by, $items_per_page, $limit_offset);
  57. $this->page = $page;
  58. $this->count_all = $count_all;
  59. $this->count_filtered = $count_filtered;
  60. $this->items_per_page = $items_per_page;
  61. $this->pages_count = $pages_count;
  62. }
  63. public function get() {
  64. return $this->data->fetchAll();
  65. }
  66. public function getDataTableArray() {
  67. $out = array();
  68. $out['recordsTotal'] = $this->count_all;
  69. $out['recordsFiltered'] = $this->count_filtered;
  70. $out['data'] = array();
  71. return $out;
  72. }
  73. }