[ Index ]

PHP Cross Reference of Akelos Framework

title

Body

[close]

/AkActionView/helpers/ -> pagination_helper.php (source)

   1  <?php
   2  /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
   3  
   4  // +----------------------------------------------------------------------+
   5  // | Akelos Framework - http://www.akelos.org                             |
   6  // +----------------------------------------------------------------------+
   7  // | Copyright (c) 2002-2006, Akelos Media, S.L.  & Bermi Ferrer Martinez |
   8  // | Released under the GNU Lesser General Public License, see LICENSE.txt|
   9  // +----------------------------------------------------------------------+
  10  
  11  /**
  12   * @package ActionView
  13   * @subpackage Helpers
  14   * @author Bermi Ferrer <bermi a.t akelos c.om>
  15   * @copyright Copyright (c) 2002-2006, Akelos Media, S.L. http://www.akelos.org
  16   * @license GNU Lesser General Public License <http://www.gnu.org/copyleft/lesser.html>
  17   */
  18  
  19  
  20  require_once (AK_LIB_DIR.DS.'AkActionView'.DS.'AkActionViewHelper.php');
  21  
  22              
  23  class PaginationHelper extends AkActionViewHelper
  24  {
  25      function sortable_link($column, $url_options = array(), $link_options = array())
  26      {
  27          $default_url_options = array(
  28          'sort'=>$column,
  29          'direction' => empty($this->_controller->params['sort']) ? 'desc' : ($this->_controller->params['sort'] == $column ? (empty($this->_controller->params['direction']) ? 'desc' : ($this->_controller->params['direction'] == 'desc' ? 'asc' : 'desc')) : 'desc'),);
  30  
  31          $page_var_on_url = empty($url_options['page_var_on_url']) ? 'page' : $url_options['page_var_on_url'];
  32          unset($url_options['page_var_on_url']);
  33  
  34          $url_options = array_merge($default_url_options, $url_options);
  35  
  36          $link_options['href'] = html_entity_decode($this->_controller->url_helper->modify_current_url($url_options,array($page_var_on_url)));
  37  
  38          if(empty($link_options['title'])){
  39              $link_options['title'] = $this->_controller->t("Sort by $column ({$url_options['direction']})");
  40          }
  41          if(!empty($link_options['link_text'])){
  42              $link_text = $link_options['link_text'];
  43              unset($link_options['link_text']);
  44          }else{
  45              $link_text =  $this->_controller->t(AkInflector::humanize($column));
  46          }
  47          return TagHelper::content_tag('a',$link_text,$link_options);
  48      }
  49  
  50  
  51  
  52      function getFindOptions(&$object)
  53      {
  54          $paginator_name = AkInflector::underscore($object->getModelName()).'_pages';
  55  
  56          $limit_and_offset = isset($this->$paginator_name) ? array('limit' =>  $this->$paginator_name->getItemsPerPage(),
  57          'offset' =>  $this->$paginator_name->getOffset()) : array();
  58  
  59          $find_options = array_merge($limit_and_offset,(!empty($this->_controller->params['sort']) &&
  60          $object->hasColumn($this->_controller->params['sort']) ? array('order'=>$this->_getOrderColumnFromCurrentModel($object, $paginator_name).$this->getSortDirection()) : array()));
  61  
  62          empty($find_options['sort']) ? ($this->_getOrderFromCustomDictionary($paginator_name, $find_options) ? null : $this->_getOrderFromAssociations($object, $paginator_name, $find_options)) : null;
  63  
  64          if(!empty($this->$paginator_name->_ak_options['include'])){
  65              $find_options['include'] = Ak::toArray($this->$paginator_name->_ak_options['include']);
  66          }
  67  
  68          return $find_options;
  69      }
  70  
  71      function _getOrderColumnFromCurrentModel(&$object, $paginator_name)
  72      {
  73          return empty($this->$paginator_name->_ak_options['include']) ? $this->_controller->params['sort'] :  'parent_'.$object->getModelName().'.'.$this->_controller->params['sort'];
  74      }
  75  
  76      function _getOrderFromCustomDictionary($paginator_name, &$find_options)
  77      {
  78          if(!empty($this->_controller->params['sort']) && !empty($this->$paginator_name->_ak_options['column_dictionary'][$this->_controller->params['sort']])){
  79              $find_options['order'] = $this->$paginator_name->_ak_options['column_dictionary'][$this->_controller->params['sort']].$this->getSortDirection();
  80              return true;
  81          }
  82          return false;
  83      }
  84  
  85      function _getOrderFromAssociations(&$object, $paginator_name, &$find_options)
  86      {
  87          if(!empty($this->_controller->params['sort']) && !empty($this->$paginator_name->_ak_options['include']) && $object->hasAssociations()){
  88              $included_models = Ak::toArray($this->$paginator_name->_ak_options['include']);
  89              foreach ($object->getAvailableAssociates() as $association_type=>$associated_models){
  90                  foreach ($associated_models as $associated_model){
  91                      if(in_array($this->_controller->params['sort'], array_keys($object->$associated_model->getAvailableAttributes()))){
  92                          $find_options['order'] = $association_type.'_'.$associated_model.'.'.$this->_controller->params['sort'].$this->getSortDirection();
  93                          return true;
  94                      }
  95                  }
  96              }
  97          }
  98          return false;
  99      }
 100  
 101      function getSortDirection()
 102      {
 103          return (empty($this->_controller->params['direction']) || $this->_controller->params['direction'] == 'asc' ? ' ASC' : ' DESC');
 104      }
 105  
 106  
 107      /**
 108       * Returns a paginator object
 109       *
 110       * Options:
 111       * 'items_per_page' => 15, // Number of items per page
 112       * 'page_var_on_url' => 'page', // This var will be passed thru the url for pointing to current page
 113       * 'count_method' => 'count' // This method will be called on selected model to get the total number of items.
 114       * 'count_conditions' => null // A string that will be passed as the first parameter (conditions) to the count method
 115       * 'count_joins' => null // A string that will be passed as the seccond parameter (join options) to the count method.
 116       * 'column_dictionary' => array() // In case you need to map the sort key from the url to the database column you must define an array pair
 117       * 'include' => array() // In case current sort column is not found on current model or in the column_dictionary this helper will look for the first associated model witrh a column named like given sort parameter.
 118       */
 119      function getPaginator(&$object, $options = array())
 120      {
 121          $default_options = array(
 122          'items_per_page' => 15,
 123          'page_var_on_url' => 'page',
 124          'count_method' => 'count',
 125          'count_conditions' => null,
 126          'count_joins' => null
 127          );
 128          $options = array_merge($default_options, $options);
 129          $paginator_name = AkInflector::underscore($object->getModelName()).'_pages';
 130          require_once (AK_LIB_DIR.DS.'AkActionController'.DS.'AkPaginator.php');
 131          $this->$paginator_name = new AkPaginator($this->_controller,
 132          $object->{$options['count_method']}($options['count_conditions'], $options['count_joins']),
 133          $options['items_per_page'], @$this->_controller->params[$options['page_var_on_url']]);
 134          $this->$paginator_name->_ak_options =& $options;
 135          return $this->$paginator_name;
 136      }
 137  }
 138  
 139  
 140  ?>


Generated: Mon Oct 27 12:43:49 2008 Cross-referenced by PHPXref 0.6