Hatena::ブログ(Diary)

KuniTsujiのPHP開発日記

 | 

2009-07-10

URLENCODEでのちょっとしたこと

| 16:40

CodeIgniterでURLの文字に日本語などを扱う場合、URL文字列の指定を変更しますが、

PHPでurlencodeをかけた場合、空白が+に置き換わります。

urlencode()

これだと、URLに+が通るようにCodeIgniterのconfigを変えないといけないのですが、

rawurlencode()を使うと対応可能となりました。

メモ

CodeIgniterのページングがあまり好きではないので

| 20:09

Paginationクラスを作成してみた。

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**
 * Pagination Class
 *
 * @package     MyNETS2
 * @subpackage  Libraries
 * @category    Pagination
 * @author      KUNIHARU Tsujioka 2009-07-10
 */
class MYNETS_Pagination {

    private $base_url           = ''; // リンクのベースになるURL
    private $total_rows         = ''; // トータルのレコード数
    private $per_page           = 10; // 1ページに表示する最大レコード数
    private $num_links          =  2; // リンクに表示させるページ番号数
    private $cur_page           =  1; // 初期ページ番号
    private $first_link         = '&lsaquo; 最初';
    private $next_link          = '&gt;';
    private $prev_link          = '&lt;';
    private $last_link          = '最後 &rsaquo;';
    private $uri_segment        = 3;  // URLセグメント内のページ番号の場所
    private $full_tag_open      = '';
    private $full_tag_close     = '';
    private $first_tag_open     = '';
    private $first_tag_close    = '&nbsp;';
    private $last_tag_open      = '&nbsp;';
    private $last_tag_close     = '';
    private $cur_tag_open       = '&nbsp;<strong>';  // 現在のページ番号での表示コントロール
    private $cur_tag_close      = '</strong>';
    private $next_tag_open      = '&nbsp;';
    private $next_tag_close     = '&nbsp;';
    private $prev_tag_open      = '&nbsp;';
    private $prev_tag_close     = '';
    private $num_tag_open       = '&nbsp;';
    private $num_tag_close      = '';
    private $page_query_string  = FALSE; // クエリーパラメータでページ番号を渡すかどうか
    private $query_string_segment = 'per_page'; // クエリーパラメータでページ番号を渡す際のパラメータ名

    private $jumpping           = FALSE; // リンク表示でのページをジャンプさせるかスライドさせるか
    private $num_pages          = 1;

    /**
     * Constructor
     *
     * @access  public
     * @param   array   initialization parameters
     */
    function __construct($params = array())
    {
        if (count($params) > 0)
        {
            $this->initialize($params);
        }

        //log_message('debug', "Pagination Class Initialized");
    }

    // --------------------------------------------------------------------

    /**
     * Initialize Preferences
     *
     * @access  public
     * @param   array   initialization parameters
     * @return  void
     */
    function initialize($params = array())
    {
        if (count($params) > 0)
        {
            foreach ($params as $key => $val)
            {
                if (isset($this->$key))
                {
                    $this->$key = $val;
                }
            }
        }
    }

    // --------------------------------------------------------------------

    /**
     * Generate the pagination links
     *
     * @access  public
     * @return  string
     */
    function create_links()
    {
        if ($this->total_rows == 0 OR $this->per_page == 0)
        {
           return '';
        }

        // トータルのページ数
        $this->num_pages = ceil($this->total_rows / $this->per_page);

        if ($this->num_pages == 1)
        {
            return '';
        }

        // セグメントまたはパラメータからページ番号を取得する
        $CI =& get_instance();

        if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
        {
            if ($CI->input->get($this->query_string_segment) != 0)
            {
                $this->cur_page = $CI->input->get($this->query_string_segment);

                $this->cur_page = (int) $this->cur_page;
            }
        }
        else
        {
            if ($CI->uri->segment($this->uri_segment) != 0)
            {
                $this->cur_page = $CI->uri->segment($this->uri_segment);

                $this->cur_page = (int) $this->cur_page;
            }
        }

        $this->num_links = (int)$this->num_links;

        // セグメントまたはパラメータのページ番号が数字じゃない場合は0ページとする
        if ( ! is_numeric($this->cur_page) OR $this->cur_page == 0)
        {
            $this->cur_page = 1;
        }

        // トータルレコード数より現在のページ番号が大きい場合
        // セグメントの値をページ番号にする
        if ($this->cur_page > $this->num_pages)
        {
            $this->cur_page = $this->num_pages;
        }

        // base url の生成
        if ($CI->config->item('enable_query_strings') === TRUE OR $this->page_query_string === TRUE)
        {
            $this->base_url = rtrim($this->base_url).'&amp;'.$this->query_string_segment.'=';
        }
        else
        {
            $this->base_url = rtrim($this->base_url, '/') .'/';
        }

        $output = '';

        // 表示ページ数が0の場合、次へ、前へのみのリンクとする
        // 携帯の場合に使う?
        if ($this->num_links < 1)
        {
            // 最初へのリンクを生成
            $output .= $this->_start_link();

            // 前へのリンクを生成
            $output .= $this->_prev_link();

            // 次へのリンクを生成
            $output .= $this->_next_link();

            // 最後へのリンクを生成
            $output .= $this->_last_link();
        }
        else
        {
            //最初のリンク
            $output .= $this->_start_link();

            // 前へのリンクを生成
            $output .= $this->_prev_link();

            // ページ番号リンクの生成
            $output .= $this->_generate_page_link();

            // 次へのリンクを生成
            $output .= $this->_next_link();

            // 最期のリンクを作成
            $output .= $this->_last_link();
        }

        $output = preg_replace("#([^:])//+#", "\\1/", $output);

        $output = $this->full_tag_open.$output.$this->full_tag_close;

        return $output;
    }

    // 最初のリンクを生成
    private function _start_link()
    {
        if  ($this->cur_page > $this->num_links)
        {
            return $this->first_tag_open
                  .'<a href="'.$this->base_url.'">'.$this->first_link.'</a>'
                  .$this->first_tag_close;
        }
        return '';
    }

    // 最後のリンクを生成
    private function _last_link()
    {
        if (($this->cur_page + $this->num_links) < $this->num_pages)
        {
            return $this->last_tag_open
                  .'<a href="'.$this->base_url.$this->num_pages.'">'.$this->last_link.'</a>'
                  .$this->last_tag_close;
        }
        return '';
    }

    // 前へのリンクを生成
    private function _prev_link()
    {
        if  ($this->cur_page > 1)
        {
            $i = $this->cur_page - 1;
            if ($i == 0) $i = '';
            return $this->prev_tag_open
                  .'<a href="'.$this->base_url.$i.'">'.$this->prev_link.'</a>'
                  .$this->prev_tag_close;
        }
        return '';
    }

    // 次へのリンクを生成
    private function _next_link()
    {
        $tag = '';
        if ($this->cur_page < $this->num_pages)
        {
            $i = $this->cur_page + 1;
            $tag = $this->next_tag_open
                  .'<a href="'.$this->base_url.$i.'">'.$this->next_link.'</a>'
                  .$this->next_tag_close;
        }
        return $tag;
    }

    // ページ番号リンク生成時の最初の頁番号
    private function _start_page()
    {
        /*if ($this->jumpping)
        {
        }
        else
        {*/
            if (($this->cur_page - $this->num_links) > 0)
            {
                return $this->cur_page - $this->num_links;
            }
            else
            {
                return 1;
            }
        /*}*/
    }

    // ページ番号リンク生成時の最後の頁番号
    private function _end_page()
    {
        /*if ($this->jumpping)
        {

        }
        else
        {*/
            if (($this->cur_page + $this->num_links) < $this->num_pages)
            {
                return $this->cur_page + $this->num_links;
            }
            else
            {
                return $this->num_pages;
            }
        /*}*/
    }

    private function _generate_page_link()
    {
        $start = $this->_start_page();
        $end   = $this->_end_page();
        $tag   = '';

        // ページ番号リンクの生成
        for ($loop = $start; $loop <= $end; $loop++)
        {
            if ($this->cur_page == $loop)
            {
                // 現在のページの生成
                $tag .= $this->cur_tag_open.$loop.$this->cur_tag_close;
            }
            else
            {
                $tag .= $this->num_tag_open
                         . '<a href="'.$this->base_url.$loop.'">'.$loop.'</a>'
                         . $this->num_tag_close;
            }
        }
        return $tag;
    }
}
// END MYNETS_Pagination Class

/* End of file MYNETS_Pagination.php */
/* Location: ./system/mynets/libraries/MYNETS_Pagination.php */

あまりちがいはないですが、CIのページネーションと同じよびだしかた、パラメータで動きます。

ひとつ違うところは、携帯の場合ページ番号を並べるリンクだと、へたしたら数百ページの場合

たいへんなことになるので、

表示するページの前後をいくつにするか、

$num_links

を0にしたら、エラーで戻すのではなく、次へ、前へ、のみを表示し、ページ番号のリンクを生成しないようにしました。

TO DO

JUMP表示を取り入れる。PEARにはあったと思いますが、表示固定でそのページを超えるまではリンクは変わらないってやつです。

いらないかなw

携帯向けに、ページ総数、総レコード数などを見えるようにする、現在のページ番号を取得で来るようにする、というのは入れたいな。

 | 
Connection: close