PEAR::Pager にaccesskey属性を追加する。

携帯電話でウェブをみる時に便利なのは、電話のキー番号と画面のリンクを対応させることが出来るってこと。
例えば、はてなダイアリーだと「4」を押せば「前日の日記」にジャンプして、「0」を押せば「はてなダイアリーのトップページ」にジャンプできる。
PEAR::Pagerを使っているときにも、同じようにナビゲーション出切ると便利だなと思って探してみたら、はてなダイアリーで言及されていた。

Pagerにはマニュアルに載ってないオプションが結構ある。
PEAR :: Manual :: Pager::factory
accesskeyとかおっと思うのですが、ページナンバーがそのままアクセスキーになる糞仕様。
10とかアクセスキーに設定しても意味ないじゃん。
nextAccesskey、firstAccesskeyとかいうオプション作ればいいのに。

PEAR::Pager - ぱんぴーまっしぐら typo-H

使ってみるとナルホドくそ仕様だ。でもやっぱり携帯電話のアクセスキーは便利なので、仕方ないからPEAR::Pager::Common.phpを直接改変してみた。

オプションを3つ追加した。

  • accesskeyNavi = boolean
    • "true" にすると番号キーで前のページ後のページの捜査が出来るようになります。
  • accesskeyPrev = string (as numerical)
    • 前のページに対応する番号キーを設定する。0〜9,*,#を設定できます。(ただし携帯電話端末によって異なる)
  • accesskeyNext = string (as numerical)
    • 後のページに対応する番号キーを設定する。0〜9,*,#を設定できます。(ただし携帯電話端末によって異なる)

PEARに取り込んでもらいたいとは思わないけど、プロポーザルってどうやるのかな?

diffファイルは次のとおり、これでパッチを当てればオケ。

*** /usr/local/lib/php/Pager/Common.php Thu Sep  4 13:30:36 2008
--- ./Common.php        Thu Jan  8 17:12:43 2009
***************
*** 196,201 ****
--- 196,225 ----
      var $_accesskey   = false;

      /**
+      * Add by k5959k@gmail.com
+      *
+      * @var boolean TRUE => show accesskey navigation on <a> tags
+      * @access private
+      */
+     var $_accesskeyNavi = false;
+
+     /**
+      * Add by k5959k@gmail.com
+      *
+      * @var string attribute accesskey navigation by phone key at previous page
+      * @access private
+      */
+     var $_accesskeyPrev = '4';
+
+     /**
+      * Add by k5959k@gmail.com
+      *
+      * @var string attribute accesskey navigation by phone key at next page
+      * @access private
+      */
+     var $_accesskeyNext = '6';
+
+     /**
       * @var string extra attributes for the <a> tag
       * @access private
       */
***************
*** 478,483 ****
--- 502,510 ----
          'nextImgEmpty',
          'expanded',
          'accesskey',
+       'accesskeyNavi',
+       'accesskeyPrev',
+       'accesskeyNext',
          'attributes',
          'onclick',
          'separator',
***************
*** 838,852 ****
              if (array_key_exists($this->_urlVar, $this->_linkData)) {
                  $onclick = str_replace('%d', $this->_linkData[$this->_urlVar], $this->_onclick);
              }
!             return sprintf('<a href="%s"%s%s%s%s title="%s">%s</a>',
!                            htmlentities($this->_url . $href, ENT_COMPAT, 'UTF-8'),
!                            empty($this->_classString) ? '' : ' '.$this->_classString,
!                            empty($this->_attributes)  ? '' : ' '.$this->_attributes,
!                            empty($this->_accesskey)   ? '' : ' accesskey="'.$this->_linkData[$this->_urlVar].'"',
!                            empty($onclick)            ? '' : ' onclick="'.$onclick.'"',
!                            $altText,
!                            $linkText
!             );
          } elseif ($this->_httpMethod == 'POST') {
              $href = $this->_url;
              if (!empty($_GET)) {
--- 865,895 ----
              if (array_key_exists($this->_urlVar, $this->_linkData)) {
                  $onclick = str_replace('%d', $this->_linkData[$this->_urlVar], $this->_onclick);
              }
!
!           $stmt = '<a href="';
!           $stmt .= htmlentities($this->_url.$href,
!                                 ENT_COMPAT,'UTF-8');
!           $stmt .= '"';
!           $stmt .= empty($this->_classString) ? '' : ' '.$this->_classString;
!           $stmt .= empty($this->_attributes)  ? '' : ' '.$this->_attributes;
!
!           if ( $altText == $this->_altPrev ) {
!               $stmt .= empty($this->_accesskeyNavi) ?
!                   '' : ' accesskey="'.$this->_accesskeyPrev.'"';
!           }
!           elseif ( $altText == $this->_altNext ) {
!               $stmt .= empty($this->_accesskeyNavi) ?
!                   '' : ' accesskey="'.$this->_accesskeyNext.'"';
!           }
!           else {
!               $stmt .= empty($this->_accesskey) ?
!                   '' : ' accesskey="'.$this->_linkData[$this->_urlVar].'"';
!           }
!           $stmt .= empty($onclick) ? '' : ' onclick="'.$onclick.'"';
!           $stmt .= ' title="'.$altText.'">'.$linkText.'</a>';
!
!           return $stmt;
!
          } elseif ($this->_httpMethod == 'POST') {
              $href = $this->_url;
              if (!empty($_GET)) {
***************
*** 1699,1702 ****

      // }}}
  }
! ?>
\ No newline at end of file
--- 1742,1745 ----

      // }}}
  }
! ?>