'submit', 'js' => 'button', 'url' => 'button', ); /** * Defaults for the options. This array is used to fill missing options. * * @var array */ protected $_defaults = array( 'currentPage' => 1, 'pageCount' => 1, 'urlParam' => 'pageNr', 'baseUrl' => '', 'mode' => 'form', 'actions' => array( 'first' => '', 'prev' => '', 'next' => '', 'last' => '', 'change' => '', ), 'method' => 'post', 'enctype' => 'multipart/form-data', ); /** * Builds a paginator depending on the given options. * * * array( // JS code for the buttons in "js" mode and JS code for the text input field. * 'first', // The string ":PAGE:" will be replaced with the target page number. * 'prev', * 'next', * 'last', * 'change', // If you want to call a JS function with the new page number as parameter * ), // use "myFunc(this.value);". * 'method', // Value for "method" HTML attribute of the "form" tag. * 'enctype', // Value for "enctype" HTML attribute of the "form" tag. * ); * ?> * * * @param array $options Options for the paginator * * @return string HTML code for view script inclusion */ public function paginator(array $options) { $view = clone $this->view; $view->clearVars(); $options = array_merge($this->_defaults, $options); $buttons = $this->_getButtons($options); $onChange = $this->_getOnChange($options['mode'], $options['baseUrl'], $options['urlParam']); if ($options['mode'] == 'js') { $onChange = $this->_getOnChange($options['mode'], $options['actions']['change'], $options['urlParam']); } $viewData = array( 'currentPage' => $options['currentPage'], 'pageCount' => $options['pageCount'], 'urlParam' => $options['urlParam'], 'onChange' => $onChange, 'buttonType' => $this->_buttonTypes[$options['mode']], 'first' => $buttons['first'], 'prev' => $buttons['prev'], 'next' => $buttons['next'], 'last' => $buttons['last'], 'formEncType' => $options['enctype'], 'formAction' => $options['baseUrl'], 'formMethod' => $options['method'], ); $view->assign($viewData); return $view->render('helper/paginator.phtml'); } /** * Builds the information for the buttons (first page, previous page, next page and last page). * * @param array $options Button options * * @return array Information for the view script */ protected function _getButtons(array $options) { $buttons = array(); $buttons['first'] = $this->_getButtonInfo( (bool) ($options['currentPage'] <= 1) ); $buttons['first']['icon'] = 'First' . $buttons['first']['icon']; $buttons['first']['click'] = $this->_getButtonClick( $options['mode'], array( 'targetPage' => 1, 'onClick' => $options['actions']['first'], 'baseUrl' => $options['baseUrl'], 'urlParam' => $options['urlParam'], ) ); $buttons['prev'] = $this->_getButtonInfo( (bool) ($options['currentPage'] <= 1) ); $buttons['prev']['icon'] = 'Back' . $buttons['prev']['icon']; $buttons['prev']['click'] = $this->_getButtonClick( $options['mode'], array( 'targetPage' => $options['currentPage'] - 1, 'onClick' => $options['actions']['prev'], 'baseUrl' => $options['baseUrl'], 'urlParam' => $options['urlParam'], ) ); $buttons['next'] = $this->_getButtonInfo( (bool) ($options['currentPage'] >= $options['pageCount']) ); $buttons['next']['icon'] = 'Forward' . $buttons['next']['icon']; $buttons['next']['click'] = $this->_getButtonClick( $options['mode'], array( 'targetPage' => $options['currentPage'] + 1, 'onClick' => $options['actions']['next'], 'baseUrl' => $options['baseUrl'], 'urlParam' => $options['urlParam'], ) ); $buttons['last'] = $this->_getButtonInfo( (bool) ($options['currentPage'] >= $options['pageCount']) ); $buttons['last']['icon'] = 'Last' . $buttons['last']['icon']; $buttons['last']['click'] = $this->_getButtonClick( $options['mode'], array( 'targetPage' => $options['pageCount'], 'onClick' => $options['actions']['last'], 'baseUrl' => $options['baseUrl'], 'urlParam' => $options['urlParam'], ) ); return $buttons; } /** * Builds the basic info for a button (disabled status and disabled suffix for buttons icon) * * @param bool $disabled Status of the button * * @return array Basic info about the button */ protected function _getButtonInfo($disabled) { return array( 'disabled' => $disabled ? ' disabled="disabled"' : '', 'icon' => $disabled ? 'Disabled' : '', ); } /** * Builds the javascript code for the HTML attribute "onclick". * * @param string $mode Current paginator mode (can be "form", "url" or "js") * @param array $options Options for the "onclick" attribute * * @return string JS-Code for the "onclick" attribute */ protected function _getButtonClick($mode, array $options) { $onClick = ''; if ($mode == 'form') { $onClick = "$(this).parent().children('select').val(" . $options['targetPage'] . "); " . "$(this).parent().parent()[0].submit();"; } if ($mode == 'url') { $onClick = "window.location.href = '" . rtrim($options['baseUrl'], '/') . "/{$options['urlParam']}/{$options['targetPage']}/';"; } if ($mode == 'js') { $onClick = str_replace(':PAGE:', $options['targetPage'], $options['onClick']); } return $onClick; } /** * Builds the Javascript code for "onchange" HTML attribute. * This code is used for the combobox. * * @param string $mode Current paginator mode (can be "form", "url" or "js") * @param string $baseUrl Base URL or Javascript code for the event. * @param string $urlParam Name of the URL param. Its value will set to the entered page. * * @return string JS-Code for the "onchange" HTML attribute. */ protected function _getOnChange($mode, $baseUrl = '', $urlParam = '') { $onChange = ""; if ($mode == 'form') { $onChange = "$(this).parent().parent()[0].submit();"; } if ($mode == 'url') { $onChange = "window.location.href = '" . rtrim($baseUrl, '/') . "/$urlParam/' + this.value + '/';"; } if ($mode == 'js') { $onChange = "$baseUrl"; } return $onChange; } }