• Main navigation
登入區塊
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站資訊區塊
站務管理者

kiang
 

tokimeki
 

sam0228
 

morris
 

shiang
 

SoltyRain
 

廣告



(1) 2 3 4 ... 8 »


[分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
###############################################
# 資料來源 : bbs.ecstart.com
# 作者 : FIEND
# 轉貼請註明出處
###############################################

最近太無聊了 花了一星期玩了一下 cakephp ^^bb

果然是一套有趣的大玩具 .

雖然功能很弱看起來還沒有很成熟 .

不過蠻適合做小專案的 , create 程式的速度超快 ^^

官方並沒有出 cake php 的換頁和排序 method .

而 1.2 版有出 但好像也不怎麼好用.

放棄~~~

所以後來想想還是自己寫 比較好用..

1.2 以下的使用者 苦腦怎麼實現 換頁 排序 功能的 或是覺得官方預設的不夠強 .

可以抄小弟寫好的 回家用 下星期有空我再加上 搜尋功能

^^

cakephp 換頁 排序 (第一版) :

1. create tests table :

CREATE TABLE 
IF NOT EXISTS `ecstart_tests` (
  `
idint(10unsigned NOT NULL auto_increment,
  `
titlevarchar(50) default NULL,
  `
bodytext,
  `
createddatetime default NULL,
  `
modifieddatetime default NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=35 ;
2. vim cake/app_controller.php << 你也可以將其放在 app/controllers/components :

首先將 這些寫好的 method 放進 app_controler class 內 .

function ecstart_record_page($p $max_page ,$max_range $rows){

                if(!isset(
$p)){$p "" ;}
                if(
trim($p)=="" or $p 1){$p 1  ; }
                
$lastpage ceil($rows/$max_page);
                if(
$p $lastpage){ $p=;}
                
$rec_start= ($p-1)*$max_page +1;
                
$rec_end  $rec_start $max_page -1;
                
$ploops   floor(($p-1)/$max_range)*$max_range ;
                
$ploope   $ploops $max_range -1;
                if(
$ploope >= $lastpage){ $ploope=$lastpage;}
                
$ppg      $p ;
                
$npg      $p ;
                if(
$ppg<= 0$ppg=$lastpage;
                if(
$npg $lastpage$npg=1;
                if(
$rec_end $rows$rec_end=$rows;

                
$ecstart_page["rec_start"]       = $rec_start ;
                
$ecstart_page["rec_end"]         = $rec_end ;
                
$ecstart_page["firstpage"]       = ;
                
$ecstart_page["lastpage"]        = $lastpage ;
                
$ecstart_page["previousrange"]   = $ploops $max_range ;
                
$ecstart_page["nextrange"]       = $ploops $max_range ;
                
$ecstart_page["previouspage"]    = $ppg ;
                
$ecstart_page["nextpage"]        = $npg ;
                
$ecstart_page["thispage"]        = $p ;
                
$ecstart_page["total"]           = $rows ;
                
$ecstart_page["loop"]            = $lastpage+;
                for(
$i=$ploops;$i <= $ploope;$i++){
                        
$ecstart_page["item"][]["p"] = $i ;
                }
                return 
$ecstart_page;
        }


        function 
ecstart_show_me_the_var($ecstart){
                echo 
"<pre>";
                
print_r($ecstart);
                exit ;
        }




        function 
ecstart_show_me_the_obj(){
                echo 
"<pre>";
                
print_r($this);
                exit ;
        }



        function 
ecstart_record_sort($field_arr){
                
//echo "<pre>"; echo $field_list; print_r($field_arr); exit;
                
foreach($field_arr as $fv){

                        
$fvs explode('.',$fv);
                        if(isset(
$this->params["url"]["sort_".str_replace('`','',$fvs[1])])){
                                
//print_r($this->params["url"]["sort_id"]);
                                
$sort["subquery"]  = $fv." ".$this->params["url"]["sort_".str_replace('`','',$fvs[1])];
                                
$sort["status"]["path"]["sort"] = '&sort_'.str_replace('`','',$fvs[1]).'='.$this->params["url"]["sort_".str_replace('`','',$fvs[1])]  ;
                                
$sort["status"]["sort"][str_replace('`','',$fvs[1])] = $this->params["url"]["sort_".str_replace('`','',$fvs[1])];
                        }

                }
                if(isset(
$sort)){
                        return  
$sort ;
                }
        }


        function 
ecstart_get_page_record($CALL,$funname){



                if(!isset(
$this->params["url"]["p"])){
                        
$this->params["url"]["p"] = "1";
                }
                
$ecstart["params"] = $this->params ;

                
$fields_arr $CALL->getColumnTypes() ;

                if(
is_array($fields_arr)){
                        foreach(
$fields_arr as $fk => $fv){
                                
$fields[$fk] = "`".$funname."`.`".$fk."`" ;
                        }
                }



                
$ecstart["sort"] = $this->ecstart_record_sort($fields);
                
$ecstart["record"] =
                                   
$CALL->findAll(
                                                        
$conditions null,
                                                        
$fields null,
                                                        
$order $ecstart["sort"]["subquery"],
                                                        
$limit MAX_RECORD,
                                                        
$page $this->params["url"]["p"],
                                                        
$recursive null
                                   
);
                
$num $CALL->findCount() ;

                
$ecstart["page"] = $this->ecstart_record_page($this->params["url"]["p"],MAX_RECORD,MAX_RANGE,$num) ;

                
$ecstart["status"]["funname"] = $funname ;

                if(isset(
$this->params["url"]["show_me_the_var"])){
                        
$this->ecstart_show_me_the_var($ecstart) ;
                }

                if(isset(
$this->params["url"]["show_me_the_obj"])){
                        
$this->ecstart_show_me_the_obj() ;
                }


                
$this->set('ecstart'$ecstart);
        }
3. 呼叫 ecstart_get_page_record method :

app/controllers/test_controller.php

class TestController extends AppController {

   var 
$name 'Test';

   var 
$helpers = array('Html','Ecstartsort');  // << 這是 排序的 helper 版型邏輯 未來要給 標題使用的 稍後再跟大家介紹 helper 相信己玩過 cakephp的人不漠生 .

   
function index() {
                
$this->ecstart_get_page_record($this->Test,$this->name);  // << 呼叫先前寫好的 換頁和 排序 邏輯 .
   
}

   function 
add()
   {

        if (!empty(
$this->data))
        {
            if (
$this->Test->save($this->data))
            {
                
$this->flash('Your post has been saved.','/test');
                
//$this->redirect('/test');
            
}
        }

   }

   function 
edit($id null)
   {
       if (empty(
$this->data))
       {
           
$this->Test->id $id;
           
$this->data $this->Test->read();
       }
       else
       {
           
//print_r($this->data);        exit ;
           
if ($this->Test->save($this->data['Test']))
           {
               
$this->flash('Your post has been updated.','/test');
           }
       }
   }


   function 
delete($id)
   {
        
$this->Test->del($id);
        
$this->flash('The post with id: '.$id.' has been deleted.''/test');
   }



}
4. SORTHELPER :

這是 要給所有版型 可以呼叫用的 helper method , 您可以參考 3. 小弟 的註解

主要的功能是使標題的排序 .

vim app/views/helpers/ecstartsort.php
<?php
class EcstartsortHelper extends Helper {

    var 
$helpers = array('Html');

    function 
fieldsort($name,$field,$url,$ecstart)
    {
        
// Use the HTML helper to output
        // formatted data:
        
if(@$ecstart["sort"]["status"]["sort"][$field] == "desc"){
                
$url .= "&sort_".$field."=asc" ;
        }
        else{
                
$url .= "&sort_".$field."=desc" ;
        }


        if(@
$ecstart["sort"]["status"]["sort"][$field] == "desc"){
                
$image_path "<img src='/images/s_desc.png'>" ;
        }
        elseif(@
$ecstart["sort"]["status"]["sort"][$field] == "asc"){
                
$image_path "<img src='/images/s_asc.png'>" ;

        }
        else{
                
$image_path "" ;
        }
        
$url .= "&p=".$ecstart["page"]["thispage"] ;
        
//echo "<pre>";         print_r($ecstart["page"]["thispage"]);  exit ;
        
unset($ecstart);


        return 
$this->output("<a href=".$url." class="editOuter">".$name."</a> ".$image_path);
    }
}
?>
5. 換頁區塊 :

因為換頁的區塊一般都長一樣 , 所以小弟將換頁 做成 區塊讓所有的版型可以去呼叫它

vim app/views/elements/ecstart_record_page.thtml
<table>
<tr>
 <td>

<?php
echo $html->link('最前頁''/test&p='.$ecstart["page"]["firstpage"].$ecstart["sort"]["status"]["path"]["sort"]);echo " | ";
echo 
$html->link('上一頁''/test&p='.$ecstart["page"]["previouspage"].$ecstart["sort"]["status"]["path"]["sort"]);echo " | ";
if(
is_array($ecstart["page"]["item"])){
        foreach(
$ecstart["page"]["item"] as $pv){
                if(
$ecstart["params"]["url"]["p"] == $pv['p']){
                        echo 
"<b>[ ".$pv['p']." ]</b>";
                        echo 
" " ;
                        echo 
" " ;
                }
                else{
                        echo 
"".$html->link($pv['p'], '/test&p='.$pv['p'].$ecstart["sort"]["status"]["path"]["sort"])."";
                        echo 
" " ;
                        echo 
" " ;
                }
        }
}
echo 
" | ";
echo 
$html->link('下一頁''/test&p='.$ecstart["page"]["nextpage"].$ecstart["sort"]["status"]["path"]["sort"]);echo " | ";
echo 
$html->link('最終頁''/test&p='.$ecstart["page"]["lastpage"].$ecstart["sort"]["status"]["path"]["sort"]);
?>

 </td>
</tr>
</table>
6. record 頁的 換頁 排序 版型 :
<table>
    <tr>
        <th>No</th>
        <th>
        <?= $ecstartsort->fieldsort("ID","id","/test",$ecstart);?>  <!-- 利用 helper 寫好的 展示層排序邏輯 直接呼叫 method 即可組合 連結 -->
        </th>
        <th>
        <?= $ecstartsort->fieldsort("標題","title","/test",$ecstart);?>
        </th>
        <th>
        <?= $ecstartsort->fieldsort("新增時間","created","/test",$ecstart);?>
        </th>
        <th>Update</th>
        <th>Delete</th>
    </tr>

   <!-- Here's where we loop through our $posts array, printing out post info -->

    <?PHP //echo "<pre>";       print_r($test);         exit ; ?>
    <?php foreach ($ecstart["record"] as $rid => $record): ?> <!-- // 由 test_controler 去呼叫 ecstart_get_page_record 的 record 陣列再由這裡去 做 foreach -->
    <tr>
        <td><?php echo $rid+1?></td>
        <td><?php echo $record[$ecstart["status"]['funname']]["id"]; ?></td>
        <td>
            <?php echo $html->link($record[$ecstart["status"]['funname']]['title'], '/test/view/'.$record[$ecstart["status"]['funname']]['id']);?>
        </td>
        <td><?php echo $record[$ecstart["status"]['funname']]['created']; ?></td>
        <td>
                <?php echo $html->link('Edit''/test/edit/'.$record[$ecstart["status"]['funname']]['id']);?>
        </td>
        <td>
            <?php echo $html->link(
                
'Delete',
                
"/test/delete/{$record[$ecstart["status"]['funname']]['id']}",
                
null,
                
'Are you sure?'
            
)?>
        </td>

    </tr>
    <?php endforeach; ?>

</table>
<?php echo $this->renderElement('ecstart_record_page'); ?>   <!-- // 這裡就是將 5. 做好的 區塊版型抓進來用   -->

<p><?php echo $html->link('Add Post''/test/add'); ?></p>
對了這裡是完成的 程式 範例 用我家的 vmware 架的 linux 有時會連不上請多包含:

[url]http://fiend.no-ip.biz/test/[/url]


^^ po 完了 大家慢慢消化吧 .

fiend 上

發表日期:2007/12/31 1:06
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
網站管理員
註冊日期:
2004/3/23 17:40
來自 Taipei, Taiwan
文章: 6189
感謝提供,我本身都是使用 1.2 版預設的元件進行,1.1 版就是以你不喜歡的那個元件處理( http://phorum.study-area.org/index.php/topic,49746.0.html ) :)

我想 CakePHP 並不非常卓越的程式架構,但是在 CakePHP 社群中樂於分享的人們讓它比起一般程式架構來的平易近人。

發表日期:2007/12/31 20:43
_________________
****************************************************
Finjon Kiang / 江明宗
Just This Computer Studio / 就這間電腦工作室
Website: http://olc.tw
****************************************************
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
個人見解

也許主觀了點 , 但是 cakephp 我覺得不過是好玩的玩具.

在 嚴厲的環境下使用 它將會是一個讓人後悔使用的垃圾 .


而 CAKEPHP 的架構 是很漂亮的 畢竟也是抄 ruby 的架構 .

雖然只做到三層式架構 將 :

資料邏輯層 和 頁面邏輯層 清礎的切開運用 .

最好玩的是 它在繼承 物件的 分配上真的很方便 .

做到 完美的一致性和延展性的運用 .

架構怎麼會不漂亮呢 ?

如果要進行小專案或是後台及快速開發的專案.

它真的是一個不錯的選擇 .

#############################

但是 運用在 大型 website 上 .

final 元件的人 觀念不足 寫出來東西 看不清 問題所在 .

導致 維護上的彈性不易.

再則 架構面雖然很漂亮 但是 許多元件在效能上並不理想 .

是效能和有效率的開發的取捨.


就 1.2 而言 , 老實說 它有不少原件 放在 大型 website 上.

會造成蠻大的 loding

例如 :

1.2 換頁那個 元件 , query 做了二次才能做到 換頁效果 .

在過萬人的 site 上一定會被打槍的 .

原則上 這篇文章的換頁功能

我寫的也這樣設計 ^^!!

因為我繼承了 model 的物件 來用 , 而且我只想運用在後台的開發 .

所以小弟 覺得 cakephp 如果要浮上枱面使用 ,

在破千人上線環境下 我是絕對不會選擇使用它的.

發表日期:2008/1/1 19:45
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
網站管理員
註冊日期:
2004/3/23 17:40
來自 Taipei, Taiwan
文章: 6189
CakePHP 的效能確實沒有很好的表現,不過相較於 RoR 或是其他 PHP 程式架構,它應該還有中上的水平;效能表現更差的 symfony ,開發人員有提過,程式架構一般都是用來發展雛型,沒有經過調校就貿然上線,問題是出在程式設計人員,而非採用程式架構的決定。

發表日期:2008/1/2 8:54
_________________
****************************************************
Finjon Kiang / 江明宗
Just This Computer Studio / 就這間電腦工作室
Website: http://olc.tw
****************************************************
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
我們拿開 共同開發 造成 CAKEPHP 有許多預設原件的設計很粗糙不談.


如果說要拿來發展大型專案的 雛型 .

要講架構 小弟覺得 CAKE PHP 不夠活 .

MVC 架構 小弟覺得 只能算是因為"簡單"所以 "平易近人" .

所以 ROR 架構才會紅 ,

若是要做小專案或是後台 CAKEPHP 確實是不錯的選擇 .

因為它就像初學者入門的玩具一樣 .

但是要給 資深一點的設計師使用 .

老實說 架構的切割上 還稍嫌 不夠細膩精緻 .

說它是 平易近人 的 玩具 相信許多高手大大們都覺得很貼切.

純討論 , 請多包含 .

發表日期:2008/1/3 10:22
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
網站管理員
註冊日期:
2005/8/27 9:29
文章: 289
恩~
FIEND是指MVC架構不夠細膩還是說CakePHP這個框架不夠細膩?

發表日期:2008/1/3 11:02
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
SORRY 表達能力太差 .

MVC .

發表日期:2008/1/3 15:18
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
網站管理員
註冊日期:
2004/3/23 17:40
來自 Taipei, Taiwan
文章: 6189
對我而言,採用 MVC 架構可以讓專案的成員間更容易溝通,相較於過去單打獨鬥的開發方式,我想這已經很值得一試了。執行效能不佳、元件設計粗糙,要從負面思考總是有抱怨不完的細節,也許可以將焦點放在積極些的地方,帶著大家成長,而不是文人相輕。 :)

發表日期:2008/1/3 20:39
_________________
****************************************************
Finjon Kiang / 江明宗
Just This Computer Studio / 就這間電腦工作室
Website: http://olc.tw
****************************************************
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
我並沒有全盤去否定 CAKEPHP的價值 , 只是把它的問題挑出來.

了解 工具的好壞 因應環境的需求去變動 每個設計師都應該去了解.

而不是一味的去崇拜 名牌而不去了解或避免觸及其缺點 .

不採用 MVC 不代表 沒有能力共同開發 , 也不表示單打獨鬥 .


MVC 其實只做到三層式的模組化和切割 .

WEB 的架構 MVC 算是比較初階 好入門 的架構.

若是採用在 一般的小型專案 確實是一個很好的選擇 .

對剛入門的程設師來說 確實是一個可以快速一起 TEAM WORK 的工具.

這點我並沒有否認 .

而且現在我也為了一些未來要開發的小專案而使用CAKEPHP在編寫 開發工具.

目地就是為了讓 CODING 人員可以快速上手 ,

抄的盡興 早點回家陪老婆小孩吃飯.

客觀及不避諱 工具的本質 小弟覺得才是客觀的討論.

發表日期:2008/1/4 13:26
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
網站管理員
註冊日期:
2005/8/27 9:29
文章: 289
我知道下面的回應可能會變成打嘴砲,不過既然上面有問,FIEND有回,不回應一下不好意思。

話說我開始寫網頁程式的時候,當時還是個大學生,第一個程式是用ASP來寫的,而不久之後ASP.NET的beta版出來了,我還玩過一陣子。
之後一直到了大三大四,要做畢業專題,才開始用PHP。
不過在當時,我就已經知道,網頁的功能其實跟資料庫做的事情一樣:新、刪、修、查,這老四項的變化。

研究所畢業之後,到社會上工作,有曾想過類似CakePHP的框架,不過當時的我覺得,如果有這個框架的話,寫程式會很快,但是客戶會認為寫程式是個沒有附加價值的工作,所以當時我並沒有去實做它。
當時我只有提出這個概念,跟某個朋友提過,後來也運用這個概念做過一些東西。

上一次FIEND舉辦的網聚,我跟我那位朋友也有去,當時FIEND拿出來的東西,其概念跟我當初提得很類似,會後我們兩個都覺得蠻巧合的。

廢話一堆只是為了要鋪陳後面要講的幾件事情:
1. FIEND認為MVC是三層,我的看法則是在同一層的三個「獨立」的區塊,實做上有些作法會相互混用或是承先啟後,不過那種作法只是「存在事實」並不能作為MVC視為「層」的概念
2. 在多層架構下,每一層都有各自的MVC,FIEND認為不夠細膩可能是因為他覺得多層架構下仍維持一組MVC的緣故
3. 整個網際網路是「網」而非「層」的概念,因此MVC常常在實做上被打破,這是寫程式的權變,不能依此對MVC做適不適合的評論

發表日期:2008/1/4 23:24
應用擴展 工具箱







[進階搜尋]