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

 

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

จากตอนที่แล้ว ความคืบหน้า PHP Hoffman Framework (2) ได้ปรับเปลี่ยนการ config จาก ini มาเป็น array ใน php แทนแล้ว ได้ทำการปรับ routing จากตั้งใน xml มาเป็น array ใน php เช่นกัน ทำให้ลดเวลาในการ parse ข้อมูลได้

เป็นแบบนี้ครับ

$Rounting['keywords'] = array(
    ':controller' => '[a-zA-Z][a-zA-Z0-9_\-]*', // Default
    ':action' => '[a-zA-Z][a-zA-Z0-9_\-]*' // Default
);

$Rounting['map'] = array(
    'login' => 'user/login',
    'userdetail' => 'user/detail',
    ':controller/:action' => null // Default
);

เหตุผลต่อมาในการทำแบบนี้เพราะ เราสามารถนำไปทำ cache ได้ง่ายขึ้นด้วยครับ

หลาย ๆ คนถามมาว่าทำไมเปลียนแปลงส่วน config ใหม่ ทั้ง ๆ ที่น่าจะดีอยู่แล้ว เหตุผลง่าย ๆ ก็คือลดการประมวลผลที่ไม่จำเป็นในการประมวลผลส่วนการตั้งค่าระบบไปซะ อีกอย่าง array ใน php ก็ทำความเข้าใจไม่ยากนัก ทำให้การปรับมาใช้ไม่ทำให้สวยความง่ายลงไปครับ

อาจจะทำ tools สำหรับ generate ตัว routing ด้วยก็ไม่ยากนักครับ

 

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

หลังจาก ความคืบหน้า PHP Hoffman Framework มีข้อเสนอแนะมาเกี่ยวกับ routing ที่เป็น xml กับ config ที่เป็น ini ทั้ง ทาง im และ comment (แต่ใน comment มีแค่ 4 คน)

จาก comment ของคุณ kaze เรื่อง config แบบ ini เมื่อเอามานั่งไล่ดู แล้วเห็นตรงกันกับคุณ kaze ตอนนี้เลยทำการปรับเปลี่ยนไปใช้ array และ convert ตัว array เป็น object แทน ซะ แต่ยังคงความสามารถ inherit ตัว config ไว้เพื่อความสะดวกในการขึ้น production app ได้ ตอนนี้เลยปรับเปลี่ยนจาก ini เป็น Array ใน php แทน

ตอนนี้เลยใช้เป็นแบบนี้ครับ

$Config['Production']['WebHost'] = 'http://localhost';
$Config['Production']['UseCleanUrl'] = true;
$Config['Production']['UseRoutesCache'] = false;
$Config['Production']['BaseUrl'] =  '/PHM2';
$Config['Production']['RenderViewDebugging'] = false;
$Config['Production']['RenderViewCompileCheck'] = false;
$Config['Production']['RenderViewCache'] = false;
$Config['Production']['ArgSeparator'] = ';';

$Config['Production']['Database']['Default'] = 'mysqli://root:1234@localhost:3007/production_album';
$Config['Production']['Database']['ReadServer'] = 'mysqli://root:1234@localhost:3008/production_album';
$Config['Development']['Database']['Default'] = 'mysqli://root:1234@localhost:3008/development_album';
$Config['Test']['Database']['Default'] = 'mysqli://root:1234@localhost/test_album';

โดน Dimension แรกเป็นตัวกำหนด config ว่าจะเป็น environment ไหน ส่วนตัวต่อมาก็เป็น dimension ของ ตัวที่เอาไปตั้งค่าจริง ๆ ส่วน ของ database จะเรื่องมากกว่าหน่อยตรงที่มีหลาย ๆ profile เผื่อในกรณีที่มีการใช้งานข้าม database หรือข้าม server กัน

อันนี้คือการเปลี่ยนส่วนของ config อีกรอบนึง แต่ดู ๆ แล้วน่าจะดีกว่าเดิมในแง่ของการไม่ต้อง parse ตัว ini ออกมา

ส่วน routing กำลังคิด ๆ อยู่ว่าจะเอาไงดี อาจจะปรับมาใช้แบบเดียวกันเลย เพื่อลดเวลาการ parse ข้อมูลลอง xml ด้วย

ส่วนเวลาเรียกใช้ก็ อ้างอิงแบบ Object ซะ โดยตัวอย่างด้านล่างก็ต้องเอาข้อมูล user ของ Database ที่เป็น Default ออกมา

echo $applicationConfigurations->Database->Default->user;

[Update 08/02/2007 00:21]

ตอนนี้ลดรูปลงมาให้ดูง่ายขึ้น (หรือเปล่า) มาเป็นแบบนี้ครับ

$Config['Production'] = array(
    'WebHost'=>'http://localhost',
    'UseCleanUrl'=>true,
    'UseRoutesCache'=>false,
    'BaseUrl'=>'/PHM2',
    'RenderViewDebugging'=>false,
    'RenderViewCompileCheck'=>false,
    'RenderViewCache'=>false,
    'ArgSeparator'=>';',
    'Database'=> array(
        'Default'=>'mysqli://root:1234@localhost:3007/production_album',
        'ReadServer'=>'mysqli://root:1234@localhost:3008/production_album'
    )
);

$Config['Development'] = array(
    'Database'=> array(
        'Default'=>'mysqli://root:1234@localhost:3007/development_album'
    )
);

$Config['Test'] = array(
    'Database'=> array(
        'Default'=>'mysqli://root:1234@localhost:3007/test_album'
    )
);