自定義標簽無法分頁問題對于很多朋友來講是一個無法解決的問題了,但今天小編看到一篇比較好的處理辦法,下面整理給各位參考。
PHPCMS提供了很多標簽方便調用數據,但是在二次開發中,有時要自己寫PHPCMS標簽,但是遇到分頁的時候無法顯示分頁,本人介紹開發PHPCMS標簽分頁的正確解決方案。
比如PHPCMS的lists標簽,代碼如下:
{pc:content action=”lists” catid=”2″ where=”thumb!=” AND status=99″ order=”id DESC” num=”4″}
通過自帶的lists標簽,可以很方便調用某個類別的列表,在模板中調用,顯示分頁直接用{$pages}即可,在/modules/content/classes/content_tag.class.php中自定義了一個PHPCMS列表標簽,但是自定義的列表標簽,調用{$pages},分頁是出不來的,那么如何進行分頁呢?代碼如下:
- if (isset($page)) {
- $str .= '$pagesize = '.$num.';';
- $str .= '$page = intval('.$page.') ? intval('.$page.') : 1;if($page<=0){$page=1;}';
- $str .= '$offset = ($page - 1) * $pagesize;';
- $datas['limit'] = '$offset.",".$pagesize';
- $datas['action'] = $action;
- $str .= '$'.$op.'_total = $'.$op.'_tag->count('.self::arr_to_html($datas).');';
- $str .= '$pages = pages($'.$op.'_total, $page, $pagesize, $urlrule);';
- }
我們要了解PHPCMS標簽的原理就明白了,在/libs/classes/template_cache.class.php中定義了模板標簽解析類,原來lists標簽能夠分頁,調用了pages函數,我們注意第8行,有個_tag->count()的方法,這個方法返回的參數作為pages的第一個參數,也就是總頁數,而自定義列表標簽,并沒有count這個方法.
在/modules/content/classes/content_tag.class.php中,有個count方法,代碼如下:
- /**
- * 分頁統計
- * @param $data
- */
- public function count($data) {
- if($data['action'] == 'lists') {
- $catid = intval($data['catid']);
- if(!$this->set_modelid($catid)) return false;
- if(isset($data['where'])) {
- $sql = $data['where'];
- } else { //開源軟件:Vevb.com
- if($this->category[$catid]['child']) {
- $catids_str = $this->category[$catid]['arrchildid'];
- $pos = strpos($catids_str,',')+1;
- $catids_str = substr($catids_str, $pos);
- $sql = "status=99 AND catid IN ($catids_str)";
- } else {
- $sql = "status=99 AND catid='$catid'";
- }
- }
- return $this->db->count($sql);
- }
看到第6行,當標簽動作是lists時,進行一系列操作獲取總數,因此我們自定義的列表標簽,也應該加一個這樣的判斷,當$data[‘action’]==’自定義的動作名稱’時,計算查詢條件的總數,代碼如下:
- elseif ($data['action'] == 'c_lists') {
- list($catid,$language,$size,$page) = explode('-', $data['search']);
- //$catid = intval($data['catid']);
- $catid = $catid+1;
- $language_setting = getcache('language_setting', 'commons');
- $size_setting = array(
- 1=>' unit="MB" and size<=10',
- ' unit="MB" and size>=10 and size<=50',
- ' unit="MB" and size>=50 and size<=100',
- ' unit="MB" and size>=100 and size<=200',
- ' unit="MB" and size>=200 and size<=500',
- ' unit="MB" and size>=500 and size<1000',
- ' unit="GB" and size>=1 and size<=2',
- ' unit="GB" and size>=2 and size<=4',
- ' unit="GB" and size>=4',
- );
- if(!$this->set_modelid($catid)) return false;
- if(isset($data['where'])) {
- $sql = $data['where'];
- } else {
- $thumb = intval($data['thumb']) ? " AND thumb != ''" : '';
- if($this->category[$catid]['child']) {
- $catids_str = $this->category[$catid]['arrchildid'];
- $pos = strpos($catids_str,',')+1;
- $catids_str = substr($catids_str, $pos);
- $sql = "status=99 AND catid IN ($catids_str)".$thumb;
- } else {
- $sql = "status=99 AND catid='$catid'".$thumb;
- }
- if ($language) {
- $sql .= " AND language = '".$language_setting[$language]."'";
- }
- if ($size) {
- $sql .= " AND".$size_setting[$size];
- }
- }
- return $this->db->count($sql);
- }
代碼緊接著上面的,這樣,PHPCMS自定義的列表標簽也可以使用{$pages}正常顯示分頁.
PHPCMS不修改程序自定義分頁格式,請看源代碼:
- {if $pages}
- <div class="pages">
- <select name="select_pages" onchange="location.href=this.options[this.selectedIndex].value;">
- {str_replace("a href", "option value", str_replace("..", "", str_replace("</a", "</option", str_replace("a class", "option class", str_replace("</span>", "頁</option>", str_replace("<span>", "<option selected>第", str_replace("> ", ">", $pages)))))))}</select>{/pc}
- </div>
- {/if}
這里用到了PHP的替換函數str_replace,可以任意的替換默認生成代碼,從而實現PHPCMS不修改程序自定義分頁格式.
新聞熱點
疑難解答