PageRenderTime 45ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/sgl/includes/qcubed/_core/base_controls/QPaginatedControl.class.php

http://logisticsouth.googlecode.com/
PHP | 327 lines | 228 code | 44 blank | 55 comment | 28 complexity | 0a990b6c121b1437b83780e6d999c98e MD5 | raw file
Possible License(s): LGPL-2.1, GPL-2.0
  1. <?php
  2. /**
  3. * This file contains the QPaginatedControl and QDataBindException class.
  4. *
  5. * @package Controls
  6. */
  7. /**
  8. * @package Controls
  9. *
  10. * @property string $Noun
  11. * @property string $NounPlural
  12. * @property QPaginatorBase $Paginator
  13. * @property QPaginatorBase $PaginatorAlternate
  14. * @property boolean $UseAjax
  15. * @property integer $ItemsPerPage is how many items you want to display per page when Pagination is enabled
  16. * @property integer $TotalItemCount is the total number of items in the ENTIRE recordset -- only used when Pagination is enabled
  17. * @property mixed $DataSource is an array of anything. THIS MUST BE SET EVERY TIME (DataSource does NOT persist from postback to postback
  18. * @property-read mixed $LimitClause
  19. * @property-read mixed $LimitInfo is what should be passed in to the LIMIT clause of the sql query that retrieves the array of items from the database
  20. * @property-read integer $ItemCount
  21. * @property integer $PageNumber is the current page number you are viewing
  22. * @property-read integer $PageCount
  23. */
  24. abstract class QPaginatedControl extends QControl {
  25. // APPEARANCE
  26. protected $strNoun;
  27. protected $strNounPlural;
  28. // BEHAVIOR
  29. protected $objPaginator = null;
  30. protected $objPaginatorAlternate = null;
  31. protected $blnUseAjax = false;
  32. // MISC
  33. protected $objDataSource;
  34. // SETUP
  35. protected $blnIsBlockElement = true;
  36. // DATABIND CALLBACK
  37. protected $strDataBindMethod;
  38. protected $objDataBindControl;
  39. public function __construct($objParentObject, $strControlId = null) {
  40. parent::__construct($objParentObject, $strControlId);
  41. $this->strNoun = QApplication::Translate('item');
  42. $this->strNounPlural = QApplication::Translate('items');
  43. }
  44. // This overriding function ensures that DataSource is set to null
  45. // before serializing the object to the __formstate
  46. // (Due to the potentially humungous size of some datasets, it is more efficient
  47. // to requery than to serialize and put as a hidden form element)
  48. public function __serialize() {
  49. $this->objDataSource = null;
  50. }
  51. // PaginatedControls should (in general) never have anything that ever needs to be validated -- so this always
  52. // returns true.
  53. public function Validate() {
  54. return true;
  55. }
  56. public function SetDataBinder($strMethodName, $objParentControl = null) {
  57. $this->strDataBindMethod = $strMethodName;
  58. $this->objDataBindControl = $objParentControl;
  59. }
  60. public function DataBind() {
  61. // Run the DataBinder (if applicable)
  62. if (($this->objDataSource === null) && ($this->strDataBindMethod) && (!$this->blnRendered))
  63. {
  64. try {
  65. $this->objForm->CallDataBinder($this->strDataBindMethod, $this, $this->objDataBindControl);
  66. } catch (QCallerException $objExc) {
  67. $objExc->IncrementOffset();
  68. throw $objExc;
  69. }
  70. if ($this->objPaginator && $this->PageNumber > $this->PageCount) {
  71. $this->PageNumber = max($this->PageCount,1);
  72. }
  73. }
  74. }
  75. /////////////////////////
  76. // Public Properties: GET
  77. /////////////////////////
  78. public function __get($strName) {
  79. switch ($strName) {
  80. // APPEARANCE
  81. case "Noun": return $this->strNoun;
  82. case "NounPlural": return $this->strNounPlural;
  83. // BEHAVIOR
  84. case "Paginator": return $this->objPaginator;
  85. case "PaginatorAlternate": return $this->objPaginatorAlternate;
  86. case "UseAjax": return $this->blnUseAjax;
  87. case "ItemsPerPage":
  88. if ($this->objPaginator)
  89. return $this->objPaginator->ItemsPerPage;
  90. else
  91. return null;
  92. case "ItemsOffset":
  93. if ($this->objPaginator)
  94. return ($this->objPaginator->PageNumber - 1) * $this->objPaginator->ItemsPerPage;
  95. else
  96. return null;
  97. case "TotalItemCount":
  98. if ($this->objPaginator)
  99. return $this->objPaginator->TotalItemCount;
  100. else
  101. return null;
  102. // MISC
  103. case "DataSource": return $this->objDataSource;
  104. case "LimitClause":
  105. if ($this->objPaginator) {
  106. // if ($this->objPaginator->TotalItemCount > 0) {
  107. $intOffset = $this->ItemsOffset;
  108. return QQ::LimitInfo($this->objPaginator->ItemsPerPage, $intOffset);
  109. // }
  110. }
  111. return null;
  112. case "LimitInfo":
  113. if ($this->objPaginator) {
  114. // if ($this->objPaginator->TotalItemCount > 0) {
  115. $intOffset = $this->ItemsOffset;
  116. return $intOffset . ',' . $this->objPaginator->ItemsPerPage;
  117. // }
  118. }
  119. return null;
  120. case "ItemCount": return count($this->objDataSource);
  121. case 'PageNumber':
  122. if ($this->objPaginator)
  123. return $this->objPaginator->PageNumber;
  124. else
  125. return null;
  126. case 'PageCount':
  127. if ($this->objPaginator)
  128. return $this->objPaginator->PageCount;
  129. else
  130. return null;
  131. default:
  132. try {
  133. return parent::__get($strName);
  134. } catch (QCallerException $objExc) {
  135. $objExc->IncrementOffset();
  136. throw $objExc;
  137. }
  138. }
  139. }
  140. /////////////////////////
  141. // Public Properties: SET
  142. /////////////////////////
  143. public function __set($strName, $mixValue) {
  144. $this->blnModified = true;
  145. switch ($strName) {
  146. // APPEARANCE
  147. case "Noun":
  148. try {
  149. return ($this->strNoun = QType::Cast($mixValue, QType::String));
  150. break;
  151. } catch (QInvalidCastException $objExc) {
  152. $objExc->IncrementOffset();
  153. throw $objExc;
  154. }
  155. case "NounPlural":
  156. try {
  157. return ($this->strNounPlural = QType::Cast($mixValue, QType::String));
  158. break;
  159. } catch (QInvalidCastException $objExc) {
  160. $objExc->IncrementOffset();
  161. throw $objExc;
  162. }
  163. // BEHAVIOR
  164. case "Paginator":
  165. try {
  166. $objToReturn = ($this->objPaginator = QType::Cast($mixValue, 'QPaginatorBase'));
  167. if ($this->objPaginator) {
  168. if ($this->objPaginator->Form->FormId != $this->Form->FormId)
  169. throw new QCallerException('The assigned paginator must belong to the same form that this control belongs to.');
  170. $objToReturn->SetPaginatedControl($this);
  171. }
  172. return $objToReturn;
  173. } catch (QInvalidCastException $objExc) {
  174. $objExc->IncrementOffset();
  175. throw $objExc;
  176. }
  177. case "PaginatorAlternate":
  178. try {
  179. $objToReturn = ($this->objPaginatorAlternate = QType::Cast($mixValue, 'QPaginatorBase'));
  180. if ($this->objPaginatorAlternate->Form->FormId != $this->Form->FormId)
  181. throw new QCallerException('The assigned paginator must belong to the same form that this control belongs to.');
  182. $objToReturn->SetPaginatedControl($this);
  183. return $objToReturn;
  184. } catch (QInvalidCastException $objExc) {
  185. $objExc->IncrementOffset();
  186. throw $objExc;
  187. }
  188. case "UseAjax":
  189. try {
  190. $objToReturn = ($this->blnUseAjax = QType::Cast($mixValue, QType::Boolean));
  191. if ($this->objPaginator)
  192. $this->objPaginator->UseAjax = $objToReturn;
  193. if ($this->objPaginatorAlternate)
  194. $this->objPaginatorAlternate->UseAjax = $objToReturn;
  195. return $objToReturn;
  196. } catch (QInvalidCastException $objExc) {
  197. $objExc->IncrementOffset();
  198. throw $objExc;
  199. }
  200. case "ItemsPerPage":
  201. if ($this->objPaginator) {
  202. try {
  203. $intToReturn = ($this->objPaginator->ItemsPerPage = $mixValue);
  204. if ($this->objPaginatorAlternate)
  205. ($this->objPaginatorAlternate->ItemsPerPage = $intToReturn);
  206. return $intToReturn;
  207. } catch (QCallerException $objExc) {
  208. $objExc->IncrementOffset();
  209. throw $objExc;
  210. }
  211. } else
  212. throw new QCallerException('Setting ItemsPerPage requires a Paginator to be set');
  213. case "TotalItemCount":
  214. if ($this->objPaginator) {
  215. try {
  216. $intToReturn = ($this->objPaginator->TotalItemCount = $mixValue);
  217. if ($this->objPaginatorAlternate)
  218. ($this->objPaginatorAlternate->TotalItemCount = $intToReturn);
  219. return $intToReturn;
  220. } catch (QCallerException $objExc) {
  221. $objExc->IncrementOffset();
  222. throw $objExc;
  223. }
  224. } else
  225. throw new QCallerException('Setting TotalItemCount requires a Paginator to be set');
  226. // MISC
  227. case "DataSource":
  228. return ($this->objDataSource = $mixValue);
  229. case "PageNumber":
  230. if ($this->objPaginator) {
  231. try {
  232. $intToReturn = ($this->objPaginator->PageNumber = $mixValue);
  233. if ($this->objPaginatorAlternate)
  234. ($this->objPaginatorAlternate->PageNumber = $intToReturn);
  235. return $intToReturn;
  236. } catch (QCallerException $objExc) {
  237. $objExc->IncrementOffset();
  238. throw $objExc;
  239. }
  240. } else
  241. throw new QCallerException('Setting PageNumber requires a Paginator to be set');
  242. default:
  243. try {
  244. parent::__set($strName, $mixValue);
  245. break;
  246. } catch (QCallerException $objExc) {
  247. $objExc->IncrementOffset();
  248. throw $objExc;
  249. }
  250. }
  251. }
  252. }
  253. /**
  254. * @property-read integer $Offset
  255. * @property-read mixed $BackTrace
  256. * @property-read string $Query
  257. */
  258. class QDataBindException extends Exception {
  259. private $intOffset;
  260. private $strTraceArray;
  261. private $strQuery;
  262. public function __construct(QCallerException $objExc) {
  263. parent::__construct($objExc->getMessage(), $objExc->getCode());
  264. $this->intOffset = $objExc->Offset;
  265. $this->strTraceArray = $objExc->TraceArray;
  266. if ($objExc instanceof QDatabaseExceptionBase)
  267. $this->strQuery = $objExc->Query;
  268. $this->file = $this->strTraceArray[$this->intOffset]['file'];
  269. $this->line = $this->strTraceArray[$this->intOffset]['line'];
  270. }
  271. public function __get($strName) {
  272. switch($strName) {
  273. case "Offset":
  274. return $this->intOffset;
  275. case "BackTrace":
  276. $objTraceArray = debug_backtrace();
  277. return (var_export($objTraceArray, true));
  278. case "Query":
  279. return $this->strQuery;
  280. }
  281. }
  282. }
  283. ?>