cb.pagination.php
上传用户:stephen_wu
上传日期:2008-07-05
资源大小:1757k
文件大小:16k
源码类别:

网络

开发平台:

Unix_Linux

  1. <?php
  2. /**
  3. * @version $Id: cb.pagination.php 344 2006-11-21 23:25:39Z beat $
  4. * @package Community Builder
  5. * @subpackage cb.pagination.php
  6. * @author Beat and various
  7. * @copyright (C) JoomlaJoe and Beat, www.joomlapolis.com
  8. * @license http://www.gnu.org/licenses/old-licenses/gpl-2.0.html GNU/GPL version 2
  9. */
  10. // no direct access
  11. if ( ! ( defined( '_VALID_CB' ) || defined( '_JEXEC' ) || defined( '_VALID_MOS' ) ) ) { die( 'Direct Access to this location is not allowed.' ); }
  12. /**
  13. * Page navigation support class
  14. */
  15. class cbPageNav {
  16. /** The record number to start dislpaying from 
  17.  *  @var int */
  18. var $limitstart  = null;
  19. /** Number of rows to display per page
  20.  * @var int */
  21. var $limit  = null;
  22. /** Total number of rows
  23.  * @var int */
  24. var $total  = null;
  25. /** returns input name for form
  26.  * @var function method($name) */
  27. var $_fieldNameFnct = null;
  28. /** CB Draw Controller for ordering feature
  29.  * @var cbDrawController */
  30. var $_controllerView;
  31. /** Number of rows displayed on the page
  32.  * @var int */
  33. var $_n  = null;
  34. /** Current index of row during display for ordering icons feature
  35.  * @var int */
  36. var $_i  = null;
  37. function cbPageNav( $total, $limitstart, $limit, $fieldNamingMethod=null ) {
  38. $this->total  = (int) $total;
  39. $this->limitstart  = (int) max( $limitstart, 0 );
  40. $this->limit  = (int) max( $limit, 1 );
  41. if ($this->limit > $this->total) {
  42. $this->limitstart = 0;
  43. }
  44. if (($this->limit-1)*$this->limitstart > $this->total) {
  45. $this->limitstart -= $this->limitstart % $this->limit;
  46. }
  47. if ( $fieldNamingMethod ) {
  48. $this->_fieldNameFnct = $fieldNamingMethod;
  49. } else {
  50. $this->_fieldNameFnct = array( &$this, '_defaultFieldNameFnct' );
  51. }
  52. }
  53. function _defaultFieldNameFnct( $name ) {
  54. return $name;
  55. }
  56. function _fieldName( $name ) {
  57. return call_user_func( $this->_fieldNameFnct, $name );
  58. }
  59. /**
  60.  * transforms a well-formed nested array : a[b[c[x]]] -> a['b']['c']['x'] (x optional)
  61.  *
  62.  * @param string $str
  63.  * @return string
  64.  */
  65. function _unnestArray( $str ) {
  66. if ( substr( $str, -1, 1 ) == ']' ) {
  67. $res = strtok( $str, '[]' );
  68. while ( false !== ( $token = strtok( '[]' ) ) ) {
  69. $res .= "['" . $token . "']";
  70. }
  71. if ( strpos( $str, '[]' ) !== false ) {
  72. $res .= '[]';
  73. }
  74. } else {
  75. $res = $str;
  76. }
  77. return $res;
  78. }
  79. function js_limitstart( $value ) {
  80. return "cbParentForm(this)." . "elements['".$this->_fieldName('limitstart') . "'].value=" . (int) $value . ";"
  81.  . "cbParentForm(this).submit();return false;";
  82. }
  83. /**
  84. * @return string The html for the limit # input box
  85. */
  86. function getLimitBox ( $showLimitBox = true ) {
  87. if ( $showLimitBox ) {
  88. $limits = array();
  89. foreach ( array(1,2,3,5,10,15,20,30,50,100) as $i ) {
  90. $limits[] = moscomprofilerHTML::makeOption( "$i" );
  91. }
  92. // build the html select list
  93. $html = moscomprofilerHTML::selectList( $limits, $this->_fieldName( 'limit' ), 'class="inputbox" size="1" onchange="' . $this->js_limitstart(0) . '"',
  94. 'value', 'text', $this->limit, 2 );
  95. } else {
  96. $html = "n<input type="hidden" name="" . $this->_fieldName( 'limit' ) . "" value="$this->limit" />";
  97. }
  98. $html .= "n<input type="hidden" name="" . $this->_fieldName( 'limitstart' ) . "" value="$this->limitstart" />";
  99. return $html;
  100. }
  101. /**
  102. * Writes the html limit # input box
  103. */
  104. function writeLimitBox () {
  105. echo $this->getLimitBox();
  106. }
  107. /**
  108. * Returns html for the pages counter, eg, Results 1-10 of x
  109. * @return string  HTML
  110. */
  111. function writePagesCounter() {
  112. echo $this->getPagesCounter();
  113. }
  114. /**
  115. * @return string  The html for the pages counter, eg, Results 1-10 of x
  116. */
  117. function getPagesCounter() {
  118. $html = '';
  119. $from_result = $this->limitstart+1;
  120. if ( $this->limitstart + $this->limit < $this->total ) {
  121. $to_result = $this->limitstart + $this->limit;
  122. } else {
  123. $to_result = $this->total;
  124. }
  125. if ($this->total > 0) {
  126. $html .= "n" . _UE_RESULTS . " <strong>" . $from_result . " - " . $to_result . "</strong> " . _UE_OF_TOTAL . " <strong>" . $this->total . "</strong>";
  127. } else {
  128. $html .= "n" . _UE_NO_RESULTS . ".";
  129. }
  130. return $html;
  131. }
  132. /**
  133. * Writes the html for the pages counter, eg, Results 1-10 of x
  134. */
  135. function writePagesLinks() {
  136. echo $this->getPagesLinks();
  137. }
  138. /**
  139. * @return string The html links for pages, eg, previous, next, 1 2 3 ... x
  140. */
  141. function getPagesLinks() {
  142. $limitstart = max( (int) $this->limitstart, 0 );
  143. $limit = max( (int) $this->limit, 1 );
  144. $total = (int) $this->total;
  145. $html  = '';
  146. $displayed_pages = 10; // set how many pages you want displayed in the menu (not including first&last, and ev. ... repl by single page number.
  147. $total_pages = ceil( $total / $limit );
  148. $this_page = ceil( ($limitstart+1) / $limit );
  149. // $start_loop  = (floor(($this_page-1)/$displayed_pages))*$displayed_pages+1;
  150. $start_loop = $this_page-floor($displayed_pages/2);
  151. if ($start_loop < 1) {
  152. $start_loop = 1;
  153. }
  154. if ($start_loop == 3) {
  155. $start_loop = 2;
  156. }
  157. if ( $start_loop + $displayed_pages - 1 < $total_pages - 2 ) {
  158. $stop_loop = $start_loop + $displayed_pages - 1;
  159. } else {
  160. $stop_loop = $total_pages;
  161. }
  162. if ($this_page > 1) {
  163. $page = ($this_page - 2) * $this->limit;
  164. $html .= "n<a href="#beg" class="pagenav" title="" . _UE_FIRST_PAGE . "" onclick="" . $this->js_limitstart(0) . "">&lt;&lt;&nbsp;" . _UE_FIRST_PAGE . "</a>";
  165. $html .= "n<a href="#prev" class="pagenav" title="" . _UE_PREV_PAGE . "" onclick="" . $this->js_limitstart( $page ) . "">&lt;&nbsp;" . _UE_PREV_PAGE . "</a>";
  166. if ($start_loop > 1) {
  167. $html .= "n<a href="#beg" class="pagenav" title="" . _UE_FIRST_PAGE . "" onclick="" . $this->js_limitstart(0) . "">&nbsp;1</a>";
  168. }
  169. if ($start_loop > 2) {
  170. $html .= "n<span class="pagenav"> <strong>...</strong> </span>";
  171. }
  172. } else {
  173. $html .= "n<span class="pagenav">&lt;&lt;&nbsp;" . _UE_FIRST_PAGE . "</span>";
  174. $html .= "n<span class="pagenav">&lt;&nbsp;" . _UE_PREV_PAGE . "</span>";
  175. }
  176. for ($i=$start_loop; $i <= $stop_loop; $i++) {
  177. $page = ($i - 1) * $this->limit;
  178. if ($i == $this_page) {
  179. $html .= "n<span class="pagenav"> $i </span>";
  180. } else {
  181. $html .= "n<a href="#$i" class="pagenav" onclick="" . $this->js_limitstart( $page ) . ""><strong>$i</strong></a>";
  182. }
  183. }
  184. if ($this_page < $total_pages) {
  185. $page = $this_page * $this->limit;
  186. $end_page = ($total_pages-1) * $this->limit;
  187. if ($stop_loop < $total_pages-1) {
  188. $html .= "n<span class="pagenav"> <strong>...</strong> </span>";
  189. }
  190. if ($stop_loop < $total_pages) {
  191. $html .= "n<a href="#end" class="pagenav" title="" . _UE_END_PAGE . "" onclick="" . $this->js_limitstart( $end_page ) . ""> <strong>" . $total_pages."</strong></a>";
  192. }
  193. $html .= "n<a href="#next" class="pagenav" title="" . _UE_NEXT_PAGE . "" onclick="" . $this->js_limitstart( $page ) . ""> " . _UE_NEXT_PAGE . "&nbsp;&gt;</a>";
  194. $html .= "n<a href="#end" class="pagenav" title="" . _UE_END_PAGE . "" onclick="" . $this->js_limitstart( $end_page ) . ""> " . _UE_END_PAGE . "&nbsp;&gt;&gt;</a>";
  195. } else {
  196. $html .= "n<span class="pagenav">Next&nbsp;&gt;</span>";
  197. $html .= "n<span class="pagenav">End&nbsp;&gt;&gt;</span>";
  198. }
  199. return $html;
  200. }
  201. /*
  202. function OLDgetListFooter( $showPageLinks = true, $showLimitBox = true, $showPagesCount = true ) {
  203. $html = '<table class="adminlist">';
  204. if ( $showPageLinks ) {
  205. $html .= '<tr>';
  206. if ( $showPagesCount && ! $showLimitBox ) {
  207. $html .= '<th colspan="1" style="text-align:center;">';
  208. $html .= $this->getPagesCounter();
  209. $html .= '</th>';
  210. }
  211. $cols = ( $showLimitBox ? 3 : ( $showPagesCount ? 2 : 3 ) );
  212. $html .= '<th colspan="' . $cols . '" style="text-align:center;">';
  213. $html .= $this->getPagesLinks();
  214. if ( ! $showLimitBox ) {
  215. $html .= $this->getLimitBox( $showLimitBox );
  216. }
  217. $html .= '</th></tr>';
  218. }
  219. if ( $showLimitBox ) {
  220. $html .= '<tr>';
  221. $html .= '<td nowrap="nowrap" width="48%" align="right">Display #</td>';
  222. $html .= '<td>' . $this->getLimitBox() . '</td>';
  223. $html .= '<td nowrap="nowrap" width="48%" align="left">';
  224. if ( $showPagesCount ) {
  225. $html .= $this->getPagesCounter();
  226. }
  227. $html .= ' </td></tr>';
  228. }
  229. $html .= '</table>';
  230.    return $html;
  231. }
  232. */
  233. function getListFooter( $showPageLinks = true, $showLimitBox = true, $showPagesCount = true ) {
  234. $html = '<div class="cbpagination">';
  235. if ( $showLimitBox ) {
  236. $html .= '<span class="cbpageslimit">Display # ';
  237. }
  238. $html .= $this->getLimitBox( $showLimitBox );
  239. if ( $showLimitBox ) {
  240. $html .= '</span>';
  241. }
  242. if ( $showPageLinks ) {
  243. $html .= '<span class="cbpageslinks">';
  244. $html .= $this->getPagesLinks();
  245. $html .= '</span>';
  246. }
  247. if ( $showPagesCount ) {
  248. $html .= '<span class="cbpagescounter">';
  249. $html .= $this->getPagesCounter();
  250. $html .= '</span>';
  251. }
  252. $html .= '</div>';
  253.    return $html;
  254. }
  255. /**
  256. * @param int The row index
  257. * @return int
  258. */
  259. function rowNumber( $i ) {
  260. return $i + 1 + $this->limitstart;
  261. }
  262. /**
  263. * @param int The row index
  264. * @param string The task to fire
  265. * @param string The alt text for the icon
  266. * @return string
  267. */
  268. function orderUpIcon( $i=null, $condition=true, $task='orderup', $alt="Move Up" ) {
  269. if ( $i === null ) {
  270. $i = $this->_i;
  271. }
  272. if ( ( $i > 0 || ( $i+$this->limitstart > 0 ) ) && $condition ) {
  273. return "<a href="#reorder" onclick="return cbListItemTask(this, '" . $this->_controllerView->taskName( false ). "','"
  274. . $this->_controllerView->subtaskName( false ). "','" . $this->_controllerView->subtaskValue( $task, false ) . "', '" 
  275. . $this->_controllerView->fieldId( 'id', null, false ) . "', " . $i . ')" title="'.$alt.'">'
  276. . '<img src="images/uparrow.png" width="12" height="12" border="0" alt="'.$alt.'" />'
  277. . '</a>';
  278.    } else {
  279.    return '&nbsp;';
  280. }
  281. }
  282. /**
  283. * @param int The row index
  284. * @param int The number of items in the list
  285. * @param string The task to fire
  286. * @param string The alt text for the icon
  287. * @return string
  288. */
  289. function orderDownIcon( $i=null, $n=null, $condition=true, $task='orderdown', $alt="Move Down" ) {
  290. if ( $i === null ) {
  291. $i = $this->_i;
  292. }
  293. if ( $n === null ) {
  294. $n = $this->_n;
  295. }
  296. if ( ( $i < $n-1 || $i+$this->limitstart < $this->total-1 ) && $condition ) {
  297. return "<a href="#reorder" onclick="return cbListItemTask(this, '" . $this->_controllerView->taskName( false ). "','" 
  298. . $this->_controllerView->subtaskName( false ). "','" . $this->_controllerView->subtaskValue( $task, false ) . "', '" 
  299. . $this->_controllerView->fieldId( 'id', null, false ) . "', " . $i . ')" title="'.$alt.'">'
  300.  . '<img src="images/downarrow.png" width="12" height="12" border="0" alt="'.$alt.'" />'
  301.  . '</a>';
  302.    } else {
  303.    return '&nbsp;';
  304. }
  305. }
  306. /**
  307. * @param string  $value  The current value
  308. * @param boolean $toggling  if it's toggling or just displaying icon
  309. * @param int     $i      The row index
  310. * @return string
  311. */
  312. function publishedToggle( $name, $value, $toggling, $i=null ) {
  313. global $_CB_framework;
  314. if ( $i === null ) {
  315. $i = $this->_i;
  316. }
  317. $imgpath = $_CB_framework->getCfg( 'live_site' ) . '/components/com_comprofiler/images/';
  318. $img = $value ? 'publish_g.png'  : 'publish_x.png';
  319. $task  = $value ? 'unpublish/' . $name : 'publish/' . $name;
  320. $alt  = $value ? 'Published' : 'Unpublished';
  321. $action = $value ? 'Unpublish Item' : 'Publish item';
  322. $html = '';
  323. if ( $toggling ) {
  324. $html .= '<a href="javascript: void(0);" onclick="return cbListItemTask(this, ' // cb
  325. . "'" . $this->_controllerView->taskName( false ). "','"  // task
  326. . $this->_controllerView->subtaskName( false ). "','"  // subtaskName
  327. . $this->_controllerView->subtaskValue( $task, false ) . "', '"  // subtaskValue
  328. . $this->_controllerView->fieldId( 'id', null, false ) . "', " // fldName
  329. . $i // id
  330. . ")" title="". $action .'">';
  331. }
  332. $html  .= '<img src="' . $imgpath . $img . '" width="16" height="16" border="0" alt="'. $alt . '" />';
  333. if ( $toggling ) {
  334. $html  .= '</a>';
  335. }
  336. return $html;
  337. }
  338. /**
  339. * @param string  $name      The field name (task to fire: enable_fieldname / disable_fieldname)
  340. * @param string  $value     The current value
  341. * @param boolean $toggling  if it's toggling or just displaying icon
  342. * @param int     $i         The row index
  343. * @return string
  344. */
  345. function checkMarkToggle( $name, $value, $toggling, $i=null ) {
  346. global $_CB_framework;
  347. if ( $i === null ) {
  348. $i = $this->_i;
  349. }
  350. $imgpath = $_CB_framework->getCfg( 'live_site' ) . '/components/com_comprofiler/images/';
  351. $img = $value ? 'tick.png'  : 'publish_x.png';
  352. $task  = $value ? 'disable/' . $name : 'enable/' . $name;
  353. $alt  = $value ? 'Yes' : 'No';
  354. $action = $value ? 'Disable Item' : 'Enable item';
  355. $html = '';
  356. if ( $toggling ) {
  357. $html .= '<a href="javascript: void(0);" onclick="return cbListItemTask(this, ' // cb
  358. . "'" . $this->_controllerView->taskName( false ). "','"  // task
  359. . $this->_controllerView->subtaskName( false ). "','"  // subtaskName
  360. . $this->_controllerView->subtaskValue( $task, false ) . "', '"  // subtaskValue
  361. . $this->_controllerView->fieldId( 'id', null, false ) . "', " // fldName
  362. . $i // id
  363. . ")" title="". $action .'">';
  364. }
  365. $html  .= '<img src="' . $imgpath . $img . '" width="16" height="16" border="0" alt="'. $alt . '" />';
  366. if ( $toggling ) {
  367. $html  .= '</a>';
  368. }
  369. return $html;
  370. }
  371. /**
  372.  * Set Current index of row during display for ordering icons feature
  373.  *
  374.  * @param cbDrawController $controllerView
  375.  */
  376. function setControllerView( &$controllerView ) {
  377. $this->_controllerView =& $controllerView;
  378. }
  379. /**
  380.  * Set Number of rows displayed on the page
  381.  *
  382.  * @param int $n
  383.  */
  384. function setN( $n ) {
  385. $this->_n = $n;
  386. }
  387. /**
  388.  * Set Current index of row during display for ordering icons feature
  389.  *
  390.  * @param unknown_type $i
  391.  */
  392. function setI( $i ) {
  393. $this->_i = $i;
  394. }
  395. //TBD: //FIXME pagination methods below are not yet adapted to CB:
  396. /**
  397.  * @param int The row index
  398.  * @param string The task to fire
  399.  * @param string The alt text for the icon
  400.  * @return string
  401.  */
  402. function orderUpIcon2( $id, $order, $condition=true, $task='orderup', $alt='#' ) {
  403. // handling of default value
  404. if ($alt == '#') {
  405. $alt = 'Move Up';
  406. }
  407. if ($order == 0) {
  408. $img = 'uparrow0.png';
  409. $show = true;
  410. } else if ($order < 0) {
  411. $img = 'uparrow-1.png';
  412. $show = true;
  413. } else {
  414. $img = 'uparrow.png';
  415. $show = true;
  416. };
  417. if ($show) {
  418. $output = '<a href="#ordering" onclick="listItemTask('cb'.$id.'','orderup')" title="'. $alt .'">';
  419. $output .= '<img src="images/' . $img . '" width="12" height="12" border="0" alt="'. $alt .'" title="'. $alt .'" /></a>';
  420. return $output;
  421.     } else {
  422.    return '&nbsp;';
  423. }
  424. }
  425. /**
  426.  * @param int The row index
  427.  * @param int The number of items in the list
  428.  * @param string The task to fire
  429.  * @param string The alt text for the icon
  430.  * @return string
  431.  */
  432. function orderDownIcon2( $id, $order, $condition=true, $task='orderdown', $alt='#' ) {
  433. // handling of default value
  434. if ($alt == '#') {
  435. $alt = 'Move Down';
  436. }
  437. if ($order == 0) {
  438. $img = 'downarrow0.png';
  439. $show = true;
  440. } else if ($order < 0) {
  441. $img = 'downarrow-1.png';
  442. $show = true;
  443. } else {
  444. $img = 'downarrow.png';
  445. $show = true;
  446. };
  447. if ($show) {
  448. $output = '<a href="#ordering" onclick="listItemTask('cb'.$id.'','orderdown')" title="'. $alt .'">';
  449. $output .= '<img src="images/' . $img . '" width="12" height="12" border="0" alt="'. $alt .'" title="'. $alt .'" /></a>';
  450. return $output;
  451.    } else {
  452.    return '&nbsp;';
  453. }
  454. }
  455. /**
  456.  * Sets the vars for the page navigation template
  457.  */
  458. function setTemplateVars( &$tmpl, $name = 'admin-list-footer' ) {
  459. $tmpl->addVar( $name, 'PAGE_LINKS', $this->getPagesLinks() );
  460. $tmpl->addVar( $name, 'PAGE_LIST_OPTIONS', $this->getLimitBox() );
  461. $tmpl->addVar( $name, 'PAGE_COUNTER', $this->getPagesCounter() );
  462. }
  463. }
  464. ?>