Get Ready Hoffman Framework pre-alpha

ตอนนี้ส่วน RenderView ที่พัฒนาตรงตามแบบที่ต้องการพอสมควรแล้ว โดยใช้ Smarty มาช่วยในส่วนนี้โดยใช้ Instant ของ Smarty ในการทำ 2 ตัวด้วยกันทำ master-page กับ content-page อย่างละตัว แต่ในอนาคตจะทำ multiple content-page ด้วยคาดว่าหลังจากปล่อย beta โน้นเลย

ส่วน FlowController เพิ่มความสามารถเข้ามาพอสมควร ในส่วนของการให้ Controller นั้นควบคุมการแสดงผลส่วน View ได้ผ่าน Controller ซะ (คือตั้งค่าผ่าน Controller เลยเช่น ใส่ javascript, stylesheet หรือพวก title ต่าง  ๆ) เดี่ยวขอทดสอบกับ app จริง ๆ แล้วมา demo สักตัวนึงครับ

ส่วนของ Model นั้น ตัว LogicModel หลังจาก defend ตัวเองมานาน สรุปโดยแยกออกเป็น DB กับ Static ครับ โดยผมมองว่าบาง Model มันไม่ได้เกี่ยวกับ DB เลย ก็ควรไม่ต้องมี function ของ DB ติดมาด้วย เลยแยกออกจากกันไปซะ อะไรประมาณนั้นครับ

เหลือทดสอบกับ App จริง ๆ สัก 1-2 ตัวน่าจะ ok ปล่อยออกมาให้โหลดกันได้ครับ (เริ่มแรกน่าจะเป็นพวกเล็ก ๆ อย่าง register form กับ booking system ครับ) เดี่ยวถ้าเสร็จกับตัวนี้แล้วเอา demo ขึ้น พร้อมกับ commit เข้า svn และ link download เลยครับ

[สถานนะของ  SVN บนเครื่องผมคือ Revision.74 แล้ว]

ความคืบหน้า 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 มาตรฐานทั่วไปครับผม

ความคืบหน้า 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
โปรแกรมคอมพิวเตอร์นี้ อนุญาตให้ใช้ได้ตามสัญญาอนุญาตของซีซี-กนู