kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

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' => '&nbsp;&nbsp;', // 「前の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'    => '&nbsp;',       // 「先頭ページ」の後ろの空白
      'prevImgPre'        => '&nbsp;',            // 「前ページ」の前に付加する文字
//      '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'       => '&nbsp;',            // 「前ページ」の後ろに付加する文字
      'prevImgSpace'      => '&nbsp;&nbsp;', // 「前ページ」の後ろの空白
      'pagePre'           => '【',            // 「ページ番号」の前に付加する文字
      'currentPagePre'    => '<strong><font color="#FF6600">【', // 「現在のページ番号」の前に付加する文字
      'currentPagePost'   => '】</font></strong>', // 「現在のページ番号」の後ろに付加する文字
      'pagePost'          => '】',            // 「ページ番号」の後ろに付加する文字
      'nextImgSpace'      => '&nbsp;&nbsp;', // 「次ページ」の前の空白
      'nextImgPre'        => '&nbsp;',            // 「次ページ」の前に付加する文字
//      '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'       => '&nbsp;',             // 「次ページ」の後ろに付加する文字
      'lastPageSpace'     => '&nbsp;',       // 「最終ページ」の前の空白
      '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' => '&nbsp;&nbsp;', // 「次の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']), // ページ名


==<<ここまでがver0.1からの変更内容です。>>==


==<<ここからはうまく行かなかった例です>>==
'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はモジュール+コントローラ+アクションで決定する。この辺がphpZend 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/1298562575http://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パラメータを使わないようにした。)など。)の内容を反映した。