php

PHPExcel

ช่วงสัปดาห์ที่ผ่านมา มีโจทย์ให้สร้างเว็บเพื่อเก็บข้อมูลรายงานที่ปกติจะอยู่ในรูปแบบไฟล์ Excel ก็โอเค อยากได้ก็จัดให้ วิธีการที่ใช้ก็คือสร้าง textbox เป็นร้อยไปใส่ใน <table> กันดื้อๆ นี่แหละ ซึ่งก็เก็บข้อมูลได้ไม่มีปัญหาอะไร (แต่แอบด่าอยู่ในใจ ทำไมไม่ใช้พวก SharePoint อะไรไปเลยฟระ)

มาเดือดร้อนตอนแสดงผล เนื่องจากต้องสามารถพรินท์ออกมาเป็นรายงานได้ด้วย ซึ่งรายงานแต่ละหน้าก็ดันหน้าตาไม่เหมือนกันอีก คิดไปคิดมาถ้าจะทำเป็น template ก็ต้องทำเกือบๆ 50 ไฟล์ =.=

เลยวกกลับมาหา Excel เพราะแต่ก่อนจำได้ว่าเคยสร้างไฟล์ Excel ด้วย PHP แต่ตอนนั้นเป็นการสร้างไฟล์เปล่าๆ ขึ้นมาใหม่ แล้วใส่ข้อมูลลงไป ส่วนคราวนี้จะต่างไปเล็กน้อย เพราะต้องอ่านไฟล์ template ที่แบ่งหน้าและเซ็ต print area ไว้เรียบร้อยแล้วเข้ามาก่อน จากนั้นก็กรอกข้อมูล แล้วค่อยเซฟเป็นรายงาน

google อยู่ครึ่งวันก็ไม่พบตัวเลือกเจ๋งๆ ซักที เพราะส่วนใหญ่จะเป็นไลบรารี่สำหรับสร้างไฟล์ Excel ขึ้นมาใหม่ ไม่สามารถอ่าน/เขียนไฟล์ที่มีอยู่แล้วได้ จนกระทั่งมาเจอ PHPExcel ก็พบว่า โอ้ววว ตัวนี้แหละ ใช่เลย!

Read the rest of this entry »

How to Neatly Dump Variables in Drupal for Debugging

เวลาพัฒนาโมดูล / ธีมใน Drupal สิ่งหนึ่งที่มักจะต้องทำบ่อยๆ คือการ dump ค่าตัวแปรใน Drupal ออกมาดู วิธีที่ง่ายที่สุดคือใช้คำสั่ง print_r(<variable>) แต่ผลลัพธ์ที่ได้ส่วนใหญ่จะเป็น string เละๆ อยู่ในส่วนบนสุดของหน้านั้นๆ ทำให้อ่านลำบากอย่างแรง

เห็น @sugree แนะนำบ่อยๆ ว่าให้ใช้ drupal_set_message() เวลา dump ค่าตัวแปร ลองดูแล้วปรากฏว่ามันใช้ไม่ได้กับ print_r() เนื่องจาก print_r() จะพรินท์ค่าออกมาทันที ไม่ได้ return ค่าเป็น string กลับมาให้ drupal_set_message()

วิธีแก้คือใช้ output buffering ช่วยอีกที สมมติว่าต้องการ dump ค่าในตัวแปร $vars['node'] ก็เขียนโค้ดแบบนี้

@sikachu มาชี้ทางสว่างให้ว่าจริงๆ แล้ว print_r() มัน return ค่าเป็น string กลับมาได้ ถ้าใส่ parameter ตัวที่สองให้เป็น TRUE จากนั้นเอามารวมกับโค้ดที่ @onequad บอกมา จะได้โค้ดสำหรับ dump ตัวแปร $vars['node'] เป็น

<?php
drupal_set_message('<pre>' . htmlspecialchars(print_r($vars['node'], TRUE), ENT_QUOTES) . '</pre>');
?>

จะได้โครงสร้างของตัวแปร $vars['node'] อยู่ในกล่องข้อความของ Drupal อย่างเป็นระเบียบเรียบร้อย อ่านง่ายกว่าเดิมเยอะ :)

How to Setup Oracle Instant Client and PHP on XAMPP

เมื่อวานเพิ่งได้ลองใช้ Oracle Instant Client เพื่อให้ PHP ติดต่อกับฐานข้อมูลที่ทำงาน รู้สึกว่าใช้งานง่ายและสะดวกกว่าการลง Oracle client เต็มๆ เยอะ และวิธีการติดตั้งก็ไม่ยุ่งยากอะไร

  1. ดาวน์โหลด Oracle Instant Client เวอร์ชันที่ต้องการ จะได้ไฟล์ .zip มาไฟล์นึง (Oracle ผมเป็น 8.1.7 ต้องดาวน์โหลด OIC เวอร์ชัน 10.x มาใช้ เพราะลองเวอร์ชัน 11.x แล้วมันบอกว่าไม่ support)
  2. แตกไฟล์ที่ได้ ไว้ในโฟลเดอร์อะไรก็ได้ แนะนำว่าอย่าให้มี space ในชื่อพาธ ถ้าเอาแบบง่ายๆ ก็ C:\Oracle
  3. เพิ่ม/แก้ Environment variable ของวินโดวส์ โดยไปที่ My Computer » Properties » Advanced » Environment Variables
    • แก้ตัวแปร PATH โดยเพิ่ม C:\Oracle เข้าไป
    • เพิ่มตัวแปร ORACLE_HOME ใส่ค่าเป็น C:\Oracle เช่นกัน
  4. รีสตาร์ทวินโดวส์หนึ่งรอบ เพื่อความชัวร์
  5. เพิ่มการโหลด extension php_oci8.dll ใน PHP โดยแก้ไฟล์ php.ini (ถ้าเป็นใน XAMPP ไฟล์ php.ini จะอยู่ใน %XAMPP_DIR%\apache\bin) เอาเครื่องหมาย semicolon (;) ออกจากบรรทัดที่ต้องการ
  6. รัน Apache ถ้าไม่มี error message อะไรก็เป็นอันเสร็จพิธี

Chart Drawing Tools in Drupal

ช่วงนี้มีงานต้องทำเว็บแอพพลิเคชันแนวๆ issue tracker สำหรับใช้ที่ทำงาน ตัวโครงสร้างพื้นฐานของระบบก็เป็น Drupal กับคู่หู CCK + Views ซึ่งเพียงเท่านี้ก็ได้ฟังก์ชันหลักๆ ประมาณ 80% แล้ว

มาสะดุดก็ตอนที่คิดว่าถ้ามี dashboard แสดงสถานะของ issue ต่างๆ แบบเป็นกราฟิกด้วยก็น่าจะช่วยให้ผู้ใช้เห็นภาพได้ชัดเจนขึ้น เลยลองค้นดูว่า Drupal มีโมดูลอะไรที่ช่วยในการสร้าง graph หรือ chart พวกนี้บ้าง ก็ได้รายชื่อโมดูลมาจำนวนหนึ่ง แต่ก่อนที่จะตัดสินใจใช้โมดูลไหน ก็ต้องดูก่อนว่า โมดูลนั้นๆ มันใช้ tools หรือ backend อะไรในการสร้าง chart ซึ่งเท่าที่สำรวจมาได้ก็พบว่ามีดังนี้

Read the rest of this entry »

Fueled by CodeIgniter

อาทิตย์ที่แล้วเพิ่งได้ลองใช้ CodeIgniter รู้สึกว่าเป็น PHP framework อีกตัวที่เข้าท่าดีเหมือนกัน

ตอนแรกว่าจะลอง Prado แต่ดูๆ แล้วรู้สึกจะแนวไปหน่อย กลัวทำงานเสร็จไม่ทันส่ง ส่วน Symfony เคยเล่นไปแล้ว แต่ลืมแล้วเหมือนกัน เลยตัดสินใจลองตัวใหม่บ้างดีกว่า

เท่าที่ลองใช้งานดู พบว่า CI เป็น framework แบบ MVC ทำนองเดียวกับ PHP framework ส่วนใหญ่ แต่มีจุดเด่นคือ

  • ขนาดเล็ก แค่ 800 กว่า kB... ชนะ Symfony และ Prado ขาดลอย แต่ยังแพ้ CakePHP แฮะ
  • ติดตั้งง่าย แค่ extract ออกมาก็ใช้ได้เลย
  • เป็น framework แบบ DIY คืออยากได้ไรต้องทำเอง ไม่มีตัว generator (อ้าว แล้วตกลงมันดีมั้ยเนี่ย) ผมว่าดีในแง่ที่เราควบคุมได้่ว่ามีไฟล์อะไรในระบบบ้าง ไม่มีไฟล์แปลกๆ ที่โดนสร้างขึ้นมาตอนไหนก็ไม่รู้ แต่ข้อเสียคือเหนื่อยหน่อย เพราะต้องสร้างไฟล์เองหมด
  • ให้ความรู้สึกดิบๆ หน่อย เหมือนเขียนโค้ดด้วยตัวเองหมด ไม่ค่อยเหมือน Symfony ที่ออกแนวหรูหราไฮโซกว่า (บอกไม่ถูกเหมือนกัน -_-a)
  • ออกจะแหกกฏ MVC เล็กๆ เพราะไม่ต้อง define model แค่มี controller กับ view ก็ทำงานได้แล้ว
  • มาพร้อม manual ในตัว แต่ interface เมนูเป็นแบบ drop-down มันจะรู้สึกประหลาดๆ หน่อย ใช้ๆ ไปอาจจะรำคาญ

ถ้าให้สรุปตอนนี้คือ CI เหมาะสำหรับพัฒนาเว็บแอพขนาดไม่ใหญ่มาก ที่ต้องการความรวดเร็วในการพัฒนา และไม่ต้องการฟีเจอร์อลังการ เพราะเท่าที่ดูคือไม่เห็น documentation เกี่ยวกับการใช้งาน Ajax และ javascript effect ทั้งหลาย แล้วก็ระบบ form validation ทำให้โค้ดดูยุ่งๆ พอสมควร

แต่ที่ดีกว่า Symfony แน่ๆ คือ ในแง่การติดตั้งลงเซิร์ฟเวอร์จริง เพราะแค่ก๊อป directory ไปก็เรียบร้อย และรู้สึกว่าโดยรวมแล้วระบบจะทำงานได้เร็วกว่า

ปล. โครงการต่อไป ลอง CakePHP และ Prado