使用 Codeigniter 的 Pagination 且帶入不定長度查詢參數的方法

在官方的Pagination Class 中, 用 page 的參數來控制本頁目前的起始行數。但範例裡面使用的方法如下:

</p>
<p>$this-&gt;load-&gt;library('pagination');</p>
<p>$config['base_url'] = 'http://example.com/index.php/test/page/';<br />
$config['total_rows'] = 200;<br />
$config['per_page'] = 20;</p>
<p>$this-&gt;pagination-&gt;initialize($config);<br />

所以原始的方法所產生的 url 就是 http://example.com/index.php/test/page/{row number} 這種格式。在參數是固定長度下,你可以輕易的知道在第幾個位置是分頁的依據,即可以使用 $config['uri_segment'] 來指定位置。

但如果參數為不固定數量,哪怎麼辦?使用 uri_segment 就沒有作用了,因為你也不知道第幾個位置是起始行數,而且起始行數只會加在 url 的最後面。

下面提供一個方法可以 override 掉原先的目前所抓取的起始行數的方法。

<br />
$this-&gt;load-&gt;library('pagination');</p>
<p>// 中間可以加很多的東西,但 page 一定要放在最後面<br />
$config['base_url'] = 'http://example.com/index.php/test/'.blalbala.'/page/';<br />
$config['total_rows'] = 200;<br />
$config['per_page'] = 20;<br />
// 新增下面的程式。<br />
$config['uri_segment'] = 0; // 不指定 row 的 url 位置<br />
$q = $this-&gt;uri-&gt;uri_to_assoc(3); // 把目前的參數轉成array<br />
$config['cur_page'] = $q['page']; // override 目前的 row</p>
<p>$this-&gt;pagination-&gt;initialize($config);</p>
<p>echo $this-&gt;pagination-&gt;create_links();

這樣你的參數的長度就不需要固定了。這對於帶入參數的 search ,或是 list 的頁面,在使用上較為方便,也不用作什麼 dirty hack。

PHP 5.3 已經 deprecate zend_get_parameters_ex

這幾天在把一個程式作 PHP 5.2 轉換到 PHP 5.3 的環境下,發現以前有一個 zend_get_parameters_ex 已經被 deprecated 了。

Example:


zend_get_parameters_ex( 1 , &arg1 )

簡單一點的改法就是把他改使用 zend_parse_parameters 這個 method 。

Example :


zend_parse_parameters(  ZEND_NUM_ARGS() TSRMLS_CC , "sz" , &arg1, &arg1_len, &arg2)

這個 function 比較方便,也可以不用把 zval 轉成 c 所需要的型態,可以直接放入原有的參數型態,像使用 char or long 一些原生參數就方便多了。

Old Method Example:


zval **arg1;
std::string str;
zend_get_parameters_ex( 1 , &arg1 ) ;
convert_to_string_ex( arg1 );
str = Z_STRVAL_PP( arg1 );

New Method Example:


char *arg1;
int arg1_len;
std::string str;
zend_parse_parameters(  ZEND_NUM_ARGS() TSRMLS_CC , "s" , &arg1, &arg1_len);
str = string(arg1);