0

CakePHP app กับ userdir

เวลาเอา web app ที่เขียนด้วย cakephp ไปใส่ใน userdir เช่น /home/veer/public_html/myapp (ซึ่งมักจะไปตรงกับ url http://hostname/~veer/myapp) มักจะมีปัญหากับ mod_rewrite ขึ้นมา แต่ก็แก้ไม่ยาก เพียงแต่แก้ .htaccess ใน myapp กับ myapp/app/webroot

เดิมทีจะเขียนไว้ประมาณนี้ (ใน myapp กับ myapp/app/webroot ไม่เหมือนกัน แต่ก็แก้เหมือนกัน)


   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

ก็แก้โดยใส่ RewriteBase เข้าไปเป็นแบบนี้


   RewriteEngine on
   RewriteBase    /~veer/myapp
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    (.*) app/webroot/$1 [L]

เสร็จแล้ว

0

History สำหรับ CakePHP Model

สิ่งผมเขียนไม่ใช่ best practice จริงๆ แล้วผมก็ไม่ค่อยแน่ใจว่ามันจะใช้ได้ดีหรือเปล่า แต่ว่าก็บันทึกไว้ก่อน. เว็บที่ผมเขียนมักจะต้องทำอะไรประเภทมี version control ด้วย แนวๆ wiki ดังนั้นถ้า model ช่วงแบ่งเบาภาระพวก version control ไปได้บ้าง ก็ทำให้ controller ดูรกน้อยลงไปมาก (หวังว่าแบบนั้น) ก่อนหน้านี้ CakePHP เคยมี behavior ด้วยช่วยเก็บ history มาให้ถ้าจำไม่ผิด แต่ตอนนี้หาไม่เจอแล้ว และเพื่อให้ได้อย่างใช้ตัวเองผมก็เลยใช้แค่ callback function.

model ที่ผมต้องการจำ history ชื่อ Textunit สมมุตว่า textunits เป็น table มี column ได้แก่ id และ string เอาแค่นี้ก็พอ เพื่อเป็นตัวอย่าง วิธีของผมก็คือสร้างขึ้นมาอีก table เลยชื่อ history_textunits โดยมี column ดังนี้ id, old_id, revision และ string

จากนั้นก็สร้าง code ใน app/model ตามนี้

<?php
class Textunit extends AppModel {
   var $name = 'Textunit';
   var $history = 'HistoryTextunits';

    function beforeSave() {
        if(!empty($this->id)) {
            $historyModel = ClassRegistry::init($this->history);
            $historyData = $this->findById($this->id);
            $historyModel->record($historyData[$this->name]);
        }                 
        return true;
    }
}
?>

และ

<?php
class HistoryTextunits extends AppModel {
    var $name = 'HistoryTextunits';
    function record($textunit) {
        $history = array();
        foreach($textunit as $k => $v) {
            if($k == "id") 
                $k = "old_id";
            $history[$k] = $v;
        }
        $this->create();
        $this->save($history);
    }
}
?>

แค่นี้เอง :-P