ความคืบหน้า PHP Hoffman Framework (6)

วันนี้คงสั้น ๆ หน่อย เพราะกำลัง implement ส่วนของ Access Control List และ Authentication อยู่ครับ และ phase ต่อไปก่อนจะสามารถออก pre-alpha version ได้คงต้องทำส่วนของ view layer ให้ดีกว่านี้ โดยการนำเอา Smarty เข้ามาใช้งานนั้น มันเป็นแบบ single template / single layer มันทำให้การออกแบบ theme/template ที่แปลเปลี่ยนตามลักษณะการใช้งานนั้น ยากพอสมควร พอดีว่าผมได้ concept ของ master page ของ ASP.NET มา ซึ่งจริง ๆ มันก็แบบเดียวกับในพวก joomla หรือ drupal ที่มี template กลาง และเอา view มาใส่ซ้อนลงไปอีกทีนึงนั้นเอง ตอนนี้ไล่ทำทั้งหมดอยู่ แบบว่ามัน late มาจากวันที่ต้อง public source มาหลายวันแล้ว เร่งหูตูบเลยงานนี้

ความคืบหน้า PHP Hoffman Framework (5)

จาก ความคืบหน้า PHP Hoffman Framework (4) ตัวความสัมพันธ์ระหว่าง model กับ controller นั้น เพิ่มเติมและปรับเปลี่ยนเพื่อความเหมาะสม โดยถ้าเราจะกำหนด controller ต้องมี namespace หรือ prefix-name (ต่อไปจะเรียกว่า namespace อย่างเดียวครับ) ด้านหน้าเสียก่อน คือ

class controller_<ชื่อ controller> extends Hmf_FlowController {
....
}

โดยให้ extends มาจาก FlowController ครับ

ส่วนของ model ก็เช่นกันครับ

class model_<ชื่อ model> extends Hmf_LogicModel {
    function __construct(){
        parent::__construct();
    }
    ....
}

(อันนี้คือ model แบบมาตรฐาน)

แต่เวลาเรียกเอา model มาใช้ใน FlowController ก็ใช้ method ‘getInstantModel’ ของ FlowController ครับ โดยใส่ชื่อ model ลงไป และเดี่ยวมันจะเติม namespace ให้เอง แบบนี้ครับ

class model_user extends Hmf_LogicModel {
    function __construct(){
        parent::__construct();
    }
    ....
}

class controller_user extends Hmf_FlowController {
    function list($page = 1){

        $user = $this->getInstantModel('user');

        $out['data'] = $user->pagination($page, 5);
        $out['pagenav'] = $user->paginationLink(HttpPage::url('user','list'));

        return $out;

    }
}

แต่ถ้า model_user ไม่มี หรือไม่ได้สร้าง class ไว้ ตัว getInstantModel มันจะไปสร้าง Instant ของ class ของ model นั้นแล้วให้ตัวมันมีคุณสมบัติแบบเดียวกับ class ของ model แบบมาตรฐานด้านบนนั้นแหละครับ พูดง่าย ๆ ก็คือถ้าหาไม่เจอ ก็สร้างให้เลย ส่วนใช้งานได้หรือไม่อีกเรื่องครับ โดย class ของ model แบบมาตรฐานมีคุณสมบติแบบเดียวกับ LogicModel เลยครับ

class controller_user extends Hmf_FlowController {
    function list($page = 1){

        $user = $this->getInstantModel('user');

        $out['data'] = $user->pagination($page, 5);
        $out['pagenav'] = $user->paginationLink(HttpPage::url('user','list'));

        return $out;

    }
}

โดยตัวอย่างด้านบน ถ้าไม่มี model_user ก็ใช้งานได้เหมือนกันครับ ซึ่งสะดวกมากในกรณีที่ใช้ class มาตรฐานทั่วไปครับผม

BarCamp Bangkok Winter 2008 @ ช่างคุย

พอดีว่าผมได้รับเชิญให้ไปคุยเรื่อง BarCamp Bangkok Winter 2008 ในรายการ ช่างคุย ที่เว็บ Changkhui.Com ครับ แต่ในเว็บ ณ. ตอนนี้ (วันที่ 12 ก.พ. 51 เวลา 9:55 น.) ยังไม่มีรายการขึ้นในเว็บ แต่ใน podcast’s feed นั้นมีรายการนี้อยู่แล้ว แนะนำให้ subscribe  ตัว podcast ลง itunes หรือโปรแกรมอ่าน feed แล้วโหลดมาฟังได้เลยครับ

ความคืบหน้า PHP Hoffman Framework (4)

ตอนนี้รอ Approve จาก SourceForge.net อยู่สำหรับ project นี้เพื่อเข้าไปใน SourceForge และใช้ SVN ที่นั้นเพื่อ commit source เอา เพื่อง่ายต่อการ contribute และ download ครับ

และตอนนี้เอา Doctrine ออกจาก lib มาตรฐานไปแล้ว ด้วยเหตุที่ทำงานช้ากว่าที่ควรจะเป็น โดยใช้ Zend_Db_Table แทน สำหรับการเอาใช้ใน LogicModel และเพิ่ม pagination ลงไป

ตัวอย่าง

Model

class albumlist extends LogicModel {
    function __construct(){
        parent::__construct();
    }
}

Controller

class controller_album extends FlowController {
    function list($page = 1){
        $albumlist = new albumlist(); // สร้าง albumlist ให้ทำการ map เข้ากับ table albumlist
        $out['data'] = $albumlist->pagination($page, 5); // แบ่งหน้าละ 5
        $out['pagenav'] = $albumlist->paginationLink(HttpPage::url('album','list'));
        return $out;
    }
}

View

{foreach from=$data item=row}
id: {$row->id}
{/foreach}

{$pagenav}

Output (1)

id: 1
id: 2
id: 3
id: 4
id: 5
[1] [2] [3] [4] TXT_PAGE_NEXT >

Output (2)

id: 6
id: 7
id: 8
id: 9
id: 10
< TXT_PAGE_PRIVOUS [1] [2] [3] [4] TXT_PAGE_NEXT >

อันนี้แค่ตัวอย่างครับ ยังมีการพัฒนาอีกหลายส่วน ครับ กำลังเร่งทำให้สามารถทำงานในระดับ production ได้ครับผม (เร่งสุดเท้าแล้วงานนี้)

License ของ PHP Hoffman Framework

หลังจากนั่งหาตัว license ที่เหมาะสมกับ PHP Hoffman Framework ตอนนี้ผมก็ได้มาแล้วนั้นคือ GNU LGPL license ครับ

คุณมีสิทธิที่จะนำ Framework ตัวนี้ไปใช้กับ Software ของคุณ โดยไม่จำเป็นว่าซอฟท์แวร์ของคุณจะต้องเป็น Opensource Software แต่ถ้ามีการแก้ไขตัว Framework ในส่วนของ Hoffman เอง จะต้องทำการส่งการแก้ไขนั้นกลับสู่ผู้พัฒนาเพื่อนำไปปรับปรุงแก้ไขต่อไป (เพื่อแก้ไขและปรับปรุงให้มีประสิทธิภาพต่อไป)

การพัฒนาซอฟต์แวร์ต่อยอดโดยใช้ GNU LGPL จะไม่ผูกพันกับ GNU LGPL ไปตลอด (แตกต่างจาก GNU GPL) อาจจะนำไปใช้ร่วมกับ license อื่น ๆ ได้

CC-GNU LGPL
โปรแกรมคอมพิวเตอร์นี้ อนุญาตให้ใช้ได้ตามสัญญาอนุญาตของซีซี-กนู