PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/application/helpers/DataTables.php

https://code.google.com/p/zfcore/
PHP | 98 lines | 62 code | 9 blank | 27 comment | 14 complexity | 61272fda177faa1676c94b4cb78679f0 MD5 | raw file
  1. <?php
  2. /**
  3. * Helper_DataTables
  4. */
  5. class Helper_DataTables
  6. extends Zend_Controller_Action_Helper_Abstract
  7. {
  8. /**
  9. * Get DataTable data
  10. *
  11. * @param Zend_Db_Table_Select $select
  12. * @param array|null $columns
  13. * @return array
  14. */
  15. public function direct(Zend_Db_Table_Select $select, $columns = null)
  16. {
  17. $table = $select->getTable();
  18. if (!$columns) {
  19. $columns = $table->info(Zend_Db_Table_Abstract::COLS);
  20. }
  21. $colCount = count($columns);
  22. $request = $this->getRequest();
  23. /*
  24. * Ordering
  25. */
  26. if (null !== $request->getParam('iSortCol_0', null)) {
  27. for ($i = 0, $l = $request->getParam('iSortingCols'); $i < $l; $i++) {
  28. if ($request->getParam('bSortable_'.(int)$request->getParam('iSortCol_'.$i))) {
  29. $select->order(
  30. $columns[(int)$request->getParam('iSortCol_'.$i)]
  31. . " " . $request->getParam('sSortDir_' . $i)
  32. );
  33. }
  34. }
  35. }
  36. /*
  37. * Filtering
  38. * NOTE this does not match the built-in DataTables filtering which does it
  39. * word by word on any field. It's possible to do here, but concerned about efficiency
  40. * on very large tables, and MySQL's regex functionality is very limited
  41. */
  42. if ($search = $request->getParam('sSearch')) {
  43. for ($i = 0; $i < $colCount; $i++) {
  44. $select->orHaving("{$columns[$i]} LIKE ?", '%' . $search . '%');
  45. }
  46. }
  47. /* Individual column filtering */
  48. for ($i = 0; $i < $colCount; $i++) {
  49. if ($request->getParam('bSearchable_' . $i) == "true") {
  50. if ($search = $request->getParam('sSearch_' . $i)) {
  51. $select->having("{$columns[$i]} LIKE ?", '%' . $search . '%');
  52. }
  53. }
  54. }
  55. //save current query for fetching data
  56. $query = clone $select;
  57. $tableName = $table->info(Zend_Db_Table::NAME);
  58. $expr = new Zend_Db_Expr('COUNT(*) as total');
  59. /* Data set length after filtering */
  60. if ($select->getPart(Zend_Db_Select::FROM)) {
  61. $select->columns($expr);
  62. } else {
  63. $select->from($tableName, $expr);
  64. }
  65. $iFilteredTotal = $table->fetchRow($select)->total;
  66. $query->limit(
  67. $request->getParam('iDisplayLength'),
  68. $request->getParam('iDisplayStart')
  69. );
  70. /*
  71. * SQL queries
  72. * Get data to display
  73. */
  74. if ($query->getPart(Zend_Db_Select::FROM)) {
  75. $query->columns($columns);
  76. } else {
  77. $query->from($tableName, $columns);
  78. }
  79. // Get total rows count
  80. $select = $table->select()->from($tableName, $expr);
  81. $iTotalRecords = $table->fetchRow($select)->total;
  82. return array(
  83. "sEcho" => (int) $request->getParam('sEcho'),
  84. "aaData" => $table->fetchAll($query)->toArray(),
  85. "iTotalRecords" => $iTotalRecords,
  86. "iTotalDisplayRecords" => $iFilteredTotal
  87. );
  88. }
  89. }