TOOL更新_「PageNavi.class.php」を精査した。Zend framework でPagerを動くようにした。
TOOL更新_「PageNavi.class.php」を精査した。Zend framework でPagerを動くようにした。
☆次期バージョンで使用する「PageNavi.php」を使っているプログラム。
■LogininfoAUtil.php PageNavi.phpを使っている箇所を抜粋 ・・・ // リストの編集 public function editList($db, &$o, $conditions, &$result) { $limit = 10; // 表示件数 $offset = ( intval($o['pageID']) -1) * $limit ; $offset = $offset < 0 ? 0 : $offset; $condstm = $conditions[ControllerBase::STM]; // ステートメント $valary = $conditions[ControllerBase::VAL_ARY]; // 値の配列 if ('' != $condstm) { $condstm = "WHERE ". $condstm; } $listOrder = ' ' . editDbItemName($o['sort_item_name']) . ' ' . ($o['sort_order']=='A' ? 'ASC' : 'DESC'); $sql = <<<__SQL__ SELECT -- ■--PGM<<004>> start-------------------------------------------- l.login_id, -- ログインID l.login_type, -- ログイン権限 l.pwd1, -- パスワード l.yuko_flg -- 有効フラグ -- ■--PGM<<004>> end-------------------------------------------- FROM m_logininfo l $condstm ORDER BY $listOrder LIMIT $offset, $limit __SQL__; $result = $db->getAll($sql, $valary); // 全件数 $sql = <<<__SQL__ SELECT count(*) FROM m_logininfo l $condstm __SQL__; $count = $db->getOne( $sql, $valary); $pageNavi =& new PageNavi(array( 'totalItems' => $count, 'perPage' => $limit, 'currentPage' => $o['pageID'], //'prevPageNaviText' => '', //'prevPageNaviSpace' => '', //'firstPageSpace' => '', //'prevImg' => '前へ', //'nextImg' => '次へ', //'lastPageSpace' => '', //'nextPageNaviSpace' => '', //'nextPageNaviText' => '', //'firstPageTextFlag' => '0', //'lastPageTextFlag' => '0', 'extraVars' => array() ),'0'); $pager = $pageNavi->getHTML(); $o['pager'] = $pager; }
☆次期バージョンで使用する「PageNavi.php」。
<?php // ============================================================= // 2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) Start // 修正BSDライセンス。 // ============================================================= require_once('Pager/Pager.php'); /* $pageNavi =& new PageNavi(array( // 'itemData' => $rows, 'totalItems' => 1001, // 'extraVars' => array('a'=>'b'), )); echo $pageNavi->getHTML(); */ class PageNavi { var $pager; var $options; /* * @param $options 設定オプションの配列 * @param $eleIdx '0'(日本語),'1'(英語)を指定する。 */ function PageNavi($options = array(), $eleIdx = '0') { $defaultOptions = array( 'mode' => 'Jumping', // PEAR::Pagerの動作モード [変更不可] 'perPage' => 10, // Pageあたりのアイテム数 'delta' => 10, // PageNaviに表示するページ数 'prevPageNaviText' => '', // 「前のPageNavigator」へのリンク文字 'prevPageNaviTextDisable' => '', // 「前のPageNavigator」へのリンク文字 'prevPageNaviSpace' => ' ', // 「前のPageNavigator」の後ろの空白 'firstPagePre' => '', // 「先頭ページ」へのリンクの前に付加する文字 // 'firstPageText' => $eleIdx == '0'? '最初':'firstPage', // 「先頭ページ」へのリンク文字 'firstPageText' => '<img src="/samples/kazBase/kaz/img/icon_page_1.gif" alt="" width="8" height="10" />', // 「先頭ページ」へのリンク文字 'firstPageTextDisable' => '<img src="/samples/kazBase/kaz/img/icon_page_1_disable.gif" alt="" width="8" height="10" />', // 「先頭ページ」へのリンク文字 'firstPagePost' => '', // 「先頭ページ」へのリンクの後ろに付加する文字 'firstPageSpace' => ' ', // 「先頭ページ」の後ろの空白 'prevImgPre' => ' ', // 「前ページ」の前に付加する文字 // 'prevImg' => $eleIdx == '0'? '前ページ':'prev', // 「前ページ」へのリンク文字 'prevImg' => '<img src="/samples/kazBase/kaz/img/icon_page_2.gif" alt=" width="7" height="10" />', // 「前ページ」へのリンク文字 'prevImgDisable' => '<img src="/samples/kazBase/kaz/img/icon_page_2_disable.gif" alt=" width="7" height="10" />', // 「前ページ」へのリンク文字 'prevImgPost' => ' ', // 「前ページ」の後ろに付加する文字 'prevImgSpace' => ' ', // 「前ページ」の後ろの空白 'pagePre' => '【', // 「ページ番号」の前に付加する文字 'currentPagePre' => '<strong><font color="#FF6600">【', // 「現在のページ番号」の前に付加する文字 'currentPagePost' => '】</font></strong>', // 「現在のページ番号」の後ろに付加する文字 'pagePost' => '】', // 「ページ番号」の後ろに付加する文字 'nextImgSpace' => ' ', // 「次ページ」の前の空白 'nextImgPre' => ' ', // 「次ページ」の前に付加する文字 // 'nextImg' => $eleIdx == '0'? '次ページ':'next', // 「次ページ」へのリンク文字 'nextImg' => '<img src="/samples/kazBase/kaz/img/icon_page_3.gif" alt="" width="7" height="10" />', // 「次ページ」へのリンク文字 'nextImgDisable' => '<img src="/samples/kazBase/kaz/img/icon_page_3_disable.gif" alt="" width="7" height="10" />', // 「次ページ」へのリンク文字 'nextImgPost' => ' ', // 「次ページ」の後ろに付加する文字 'lastPageSpace' => ' ', // 「最終ページ」の前の空白 'lastPagePre' => '', // 「最終ページ」へのリンクの前に付加する文字 // 'lastPageText' => $eleIdx == '0'? '最後':'lastPage', // 「最終ページ」へのリンク文字 'lastPageText' => '<img src="/samples/kazBase/kaz/img/icon_page_4.gif" alt="" width="8" height="10" />', // 「最終ページ」へのリンク文字 'lastPageTextDisable' => '<img src="/samples/kazBase/kaz/img/icon_page_4_disable.gif" alt="" width="8" height="10" />', // 「最終ページ」へのリンク文字 'lastPagePost' => '', // 「最終ページ」へのリンクの後ろに付加する文字 'nextPageNaviSpace' => ' ', // 「次のPageNavigator」の前の空白 'nextPageNaviText' => '', // 「次のPageNavigator」へのリンク文字 'nextPageNaviTextDisable' => '', // 「次のPageNavigator」へのリンク文字 'prevImgFlag' => '1', // 「前ページ」へのリンク文字の括弧有無 'altPrev' => '', // 「前ページ」へのリンクのaltテキスト 'nextImgFlag' => '1', // 「次ページ」へのリンク文字の括弧有無 'altNext' => '', // 「次ページ」へのリンクのaltテキスト 'firstPageTextFlag'=> '1', // 「先頭ページ」へのリンク文字有無 'altFirst' => '', // 「先頭ページ」へのリンクのaltテキスト 'lastPageTextFlag' => '1', // 「最終ページ」へのリンク文字有無 'altLast' => '', // 「最終ページ」へのリンクのaltテキスト // 'currentPage' => null, // 初期のページ番号 // 'separator' => '|', 'spacesBeforeSeparator' => 0, 'spacesAfterSeparator' => 0, 'path' => Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl(), 'append' => false, 'fileName' => Zend_Controller_Front::getInstance()->getRequest()->getModuleName() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getControllerName() . // '/' . Zend_Controller_Front::getInstance()->getRequest()->getActionName() . '/listback' . '?' . http_build_query($options['extraVars']) . ((is_array($options['extraVars']) && count($options['extraVars']) > 0) ? '&' : '') . 'pageID=%d', // ページ名 'fileName2' => Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getModuleName() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getControllerName() . // '/' . Zend_Controller_Front::getInstance()->getRequest()->getActionName(), // ページ名 '/listback', // 'fileName' => basename($_SERVER['PHP_SELF']), // ページ名 'urlVar' => 'pageID', // ページ番号を表すクエリ変数名 'importQuery' => false, // [変更不可] // 'itemData' => range(1, 1000), ); $options = (array)$options + $defaultOptions; foreach($options as $key => $val) { $this->{'_' . $key} = $val; } $this->pager =& Pager::factory($options); // print_r($this->pager->getLinks()); // print_r($this->pager->range); } /** * getLinkURL * * @param Array $formdata http_build_query()に渡すArray * @return linkURL */ function getLinkURL($formdata) { if(!is_array($formdata)) { $formdata = (array)$formdata; } // $formdata[$this->_urlVar] = $pageID; // if($_SERVER['REQUEST_METHOD'] == 'GET') // { // $formdata += $_GET; // keyが被ってる場合は $formdata が優先される // } // elseif($_SERVER['REQUEST_METHOD'] == 'POST') // { // $formdata += $_POST; // keyが被ってる場合は $formdata が優先される // } if(is_array($this->_extraVars) && count($this->_extraVars) > 0) { // extraVars が設定されているなら加える $formdata = array_merge($formdata, $this->_extraVars); // keyが被ってる場合は $this->_extraVars が優先される // $formdata += $this->_extraVars; } return $this->_fileName2 . '?' . http_build_query($formdata); } /** * getHTML * * @param void * @return String PageNavigaion の HTML */ function getHTML() //function getHTML($toEncoding = 'SJIS-win') { $links = $this->pager->getLinks(); $links['first'] = $links['first'] != '' ? $links['first'] : $this->_firstPageTextDisable ; $links['last'] = $links['last'] != '' ? $links['last'] : $this->_lastPageTextDisable; $links['next'] = $links['next'] != '' ? $links['next'] : $this->_nextImgDisable; $links['back'] = $links['back'] != '' ? $links['back'] : $this->_prevImgDisable; $links['prevPageNavi'] = $this->_prevPageNaviTextDisable; $links['nextPageNavi'] = $this->_nextPageNaviTextDisable; if ( $this->_firstPageTextFlag != 1 ) { $links['first'] = ''; } if ( $this->_lastPageTextFlag != 1 ) { $links['last'] = ''; } $range = $this->pager->range; if(count($range) == 0) { $range = array(1 => true); } $rangeMin = min(array_keys((array)$range)); $rangeMax = max(array_keys((array)$range)); if($rangeMin > 1) { if(($this->pager->getCurrentPageID() - $this->_delta) < 1) { $targetPageID = 1; } else { $targetPageID = $this->pager->getCurrentPageID() - $this->_delta; } $links['prevPageNavi'] = '<a href="' . $this->getLinkURL(array($this->_urlVar => $targetPageID)) . '">' . $links['prevPageNavi'] . '</a>'; } if($rangeMax < $this->pager->numPages()) { if(($this->pager->getCurrentPageID() + $this->_delta) > $this->pager->numPages()) { $targetPageID = $this->pager->numPages(); } else { $targetPageID = $this->pager->getCurrentPageID() + $this->_delta; } $links['nextPageNavi'] = '<a href="' . $this->getLinkURL(array($this->_urlVar => $targetPageID)) . '">' . $links['nextPageNavi'] . '</a>'; } $pages = array(); foreach((array)$range as $pageID => $isCurrent) { if($isCurrent == true) { $pages[] = $this->_currentPagePre . $pageID . $this->_currentPagePost; } else { $pages[] = $this->_pagePre . '<a href="' . $this->getLinkURL(array($this->_urlVar => $pageID)) . '">' . $pageID . '</a>' . $this->_pagePost; } } //mb_convert_variables($toEncoding, 'SJIS-win', $links); if ( !empty( $links['first'] ) && $this->_firstPageTextFlag == 1 ) { $links['first'] = ''. $links['first'] . ''; } if ( !empty( $links['back'] ) && $this->_prevImgFlag == 1 ) { $links['back'] = $this->_prevImgPre . $links['back'] . $this->_prevImgPost; } if ( !empty( $links['next'] ) && $this->_nextImgFlag == 1 ) { $links['next'] = $this->_nextImgPre . $links['next'] . $this->_nextImgPost; } if ( !empty( $links['last'] ) && $this->_lastPageTextFlag == 1 ) { $links['last'] = ''. $links['last'] . ''; } return $links['prevPageNavi'] . $this->_prevPageNaviSpace . $links['first'] . $this->_firstPageSpace . $links['back'] . $this->_prevImgSpace . join(' ', $pages) . $this->_nextImgSpace . $links['next'] . $this->_lastPageSpace . $links['last'] . $this->_nextPageNaviSpace . $links['nextPageNavi']; } } // ============================================================= // 2010 kaz PHP自動作成お助けTOOL.(http://kazpgm.ddo.jp/) End // 修正BSDライセンス。 // =============================================================
==<<ここからがver0.1からの変更内容です。>>==
1.「PageNavi.class.php」を「\common」の下に移動した。名前も「PageNavi.php」に変更した。
2.php5以上は『http_build_query』が用意されているので、メソッドをソース上から削除した。
■PageNavi.php <<削除>> if (!function_exists('http_build_query')) { function http_build_query($formdata, $numeric_prefix = null) ・・・ function __http_build_query ($array, $name) ・・・ return implode($separator, $tmp); } }
3.'fileName'(getLinkURLメソッドで使っている。getHTMLメソッドでgetLinkURLメソッドを使っている。)をZend framework用に変更した。具体的には、オプションに、path、append、fileNameを指定するようにした。($options['extraVars']には’mode=list_back’が渡ってくる。)今までfileNameとしていたものをfileName2にしてgetLinkURLメソッド専用にした。
■PageNavi.php function PageNavi($options = array(), $eleIdx = '0') { $defaultOptions = array( ・・・ <<修正>> 'path' => Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl(), 'append' => false, 'fileName' => Zend_Controller_Front::getInstance()->getRequest()->getModuleName() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getControllerName() . // '/' . Zend_Controller_Front::getInstance()->getRequest()->getActionName() . '/listback' . '?' . http_build_query($options['extraVars']) . ((is_array($options['extraVars']) && count($options['extraVars']) > 0) ? '&' : '') . 'pageID=%d', // ページ名 'fileName2' => Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getModuleName() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getControllerName() . // '/' . Zend_Controller_Front::getInstance()->getRequest()->getActionName(), // ページ名 '/listback', // 'fileName' => basename($_SERVER['PHP_SELF']), // ページ名
==<<ここからはうまく行かなかった例です>>==
'fileName'(getLinkURLメソッドで使っている。getHTMLメソッドでgetLinkURLメソッドを使っている。)をZend framework用に変更した。
■PageNavi.php function PageNavi($options = array(), $eleIdx = '0') { $defaultOptions = array( ・・・ <<修正>> 'fileName' => Zend_Controller_Front::getInstance()->getRequest()->getBaseUrl() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getModuleName() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getControllerName() . '/' . Zend_Controller_Front::getInstance()->getRequest()->getActionName(), // ページ名 // 'fileName' => basename($_SERVER['PHP_SELF']), // ページ名
・ページングで【1】、【2】のリンクはgetLinkURLメソッド使っているのでうまくURLが出来上がる。しかし、「次ページ】、「最後」などpagerのgetLinksメソッドはダメURLになる。・・・・何とかしないと。。。と思ったが、上記の方法でクリアした。
==<<ここまではうまく行かなかった例です>>==
6/16 20:30-3:00 $_SERVER['PHP_SELF']って”adminIndex.php”。・・・でも動いているのは”LogininfoAController.php”。そう。すべて”adminIndex.php”になる。URLはモジュール+コントローラ+アクションで決定する。この辺がphpとZend frameworkの違い。
補足: Zend_Controller_Front::getInstance()->getRequest()->getRequestUri()はダメだった。何度かやるとどんどんUrlが長くなっていく。
6/19 9:00-9:30 PageNavi.phpを全文載せた。使用しているプログラムも載せた。
2011/03/01 23:00-23:30 修正内容はhttp://d.hatena.ne.jp/kazpgm/20110224/1298562575とhttp://d.hatena.ne.jp/kazpgm/20110301/1298983178参照
2011/03/07 4:00-4:10 http://d.hatena.ne.jp/kazpgm/20110307/1299523681(TOOL更新_Ver0.1Zd(次期バージョン)の管理者側もすべてアクションで切り分けるように修正した。(modeパラメータを使わないようにした。)など。)の内容を反映した。