วันพุธที่ 28 กรกฎาคม พ.ศ. 2553

การใส่ paging ให้ list form

ในไฟล์ที่มีการแสดงรายการ จำเป็นต้องใส่ paging ให้กับ list form นั้น เนื่องจากหากมีข้อมูลในปริมาณมาก จะทำให้การโหลดหน้านั้นมาแสดงผลช้า สามารถใส่ paging ให้ list form ได้ดังนี้

1. ใน form ที่มีการ list รายการทั้งหมดมาแสดง มีโค้ดดังนี้

<form name="listLookupWorkEffort" list-name="listIt" target="" title="" type="list" paginate-target="LookupWorkEffort" odd-row-style="alternate-row" default-table-style="basic-table hover-bar">

อธิบายโค้ด
ใส่ paginate-target="LookupWorkEffort" เพื่อแสดงถึงการแบ่ง list จาก form LookupWorkEffort ออกมาเป็นส่วนๆ

2. ใน screen ที่มีการเรียก list form นี้มาแสดงผล หากต้องการกำหนดจำนวนรายการที่แสดงในแต่ละหน้า ให้เขียนโค้ดเพิ่มในส่วนของ &lt;actions&gt;&lt;/actions&gt; ดังนี้

<set field="viewSize" from-field="parameters.VIEW_SIZE" type="Integer" default-value="20"/>

อธิบายโค้ด
default-value คือ จำนวนข้อมูลที่ต้องการให้แสดงในแต่ละหน้า

การส่ง parameter จาก field เป็น hidden field ไปให้ form และ screen

กรณีศึกษา
ในการค้นหาโครงการของโมดูล project management จะมี lookup เพื่อให้ผู้ใช้สามารถเลือก project ที่ต้องการค้นหาได้ แต่เมื่อกด search แล้ว การค้นหาเจอทั้งข้อมูลที่มี workEffortTypeId เป็น PROJECT, TASK, EVENT, PHASE และอื่นๆ ด้วย ทำให้มีข้อมูลมาแสดงเยอะมาก ดังนั้นจึงต้องการกรองเฉพาะข้อมูลที่มี workEffortTypeId เป็น PROJECT เท่านั้น สามารถทำได้ดังนี้

1. ที่ screen ในส่วนของ actions ให้เพิ่มโค้ด

<set field="workEffortTypeId" from-field="parameters.workEffortTypeId" default-value="PROJECT" />

อธิบายโค้ด
ให้ field ชื่อ workEffortTypeId ส่งค่า workEffortTypeId ที่ได้มาจาก parameter โดยที่ตัวแปร workEffortTypeId นี้ ถูกกำหนดค่าไว้ให้มีค่าเท่ากับ PROJECT (default-value="PROJECT")

2. ที่ form ให้เพิ่ม value และส่งค่าไปพร้อมกับ field ชื่อ workEffortTypeId ดังนี้

<field name="workEffortTypeId"><hidden value="${parameters.workEffortTypeId}"/></field>

ใน lookup ก็จะสามารถกรองเฉพาะข้อมูลที่มี workEffortTypeId ที่มีค่าเป็น PROJECT มาแสดงได้

3. ที่ lookup ในหน้า  ProjectForms.xml ให้เพิ่มโค้ด
<lookup target-form-name="LookupWorkEffort?workEffortTypeId=PROJECT">

ใส่ paremeter workEffortTypeId=PROJECT เป็น query string ไปในโค้ด เพื่อให้ส่งค่าเข้าไปค้นหาเฉพาะ workEffortTypeId=PROJECT

วันอังคารที่ 27 กรกฎาคม พ.ศ. 2553

การสร้าง screenlet เพื่อสร้างข้อความระหว่างการสร้างข้อมูลใหม่และการแก้ไขข้อมูลในฟอร์ม

เมื่อมีการเรียกใช้ form เดียวกันจาก 2 actions คือ มีการสร้างข้อมูลใหม่ผ่าน form และแก้ไขข้อมูลเดิมผ่าน form หากไม่มีการแก้ไข ในส่วนของ labels จะไปดึง uiLabelMap เดียวกันมาแสดงผล ซึ่งก่อให้เกิดความสับสนระหว่างการสร้างและการแก้ไขข้อมูล สามารถแก้ปัญหาได้ดังนี้

1. เพิ่มโค้ดลงใน screen ดังนี้

<container style="screenlet-title-bar">
  <container style="h3">
   <section>
    <condition>
     <if-empty field="projectId"/>
    </condition>
    <widgets>
     <label style="h3" text="${uiLabelMap.PageTitleEditProject}"/>
    </widgets>
    <fail-widgets>
     <label style="h3" text="${uiLabelMap.iMAS_ProjectMgrEditProject}"/>
    </fail-widgets>
    </section>
  </container>
 </container>

อธิบายโค้ด
ในส่วน section ของ titlebar ให้กำหนดเงื่อนไขว่า เมื่อไม่มีค่า projectId ส่งมา ให้เรียกใช้ widget ที่มี label ที่เรียกใช้ uiLabelMap ชื่อ PageTitleEditProject
แต่เมื่อมีค่า projectId ส่งมาด้วย ให้เรียกใช้ widget ที่มี label ที่เรียกใช้ uiLabelMap ชื่อ iMAS_ProjectMgrEditProject

2. ในส่วน screen ที่มีการเรียกใช้ form ให้เพิ่มโค้ดดังนี้

<container style="screenlet-body">                       
   <section>
    <widgets>
     <platform-specific>
      <html><html-template location="component://imas-project/webapp/imas-project/page/NewCustomerButton.ftl"/></html>
                                        </platform-specific>
     <include-form name="EditProject" location="component://imas-project/widget/forms/ProjectForms.xml"/>
    </widgets>
    <fail-widgets>
     <include-form name="EditProject" location="component://imas-project/widget/forms/ProjectForms.xml"/>
    </fail-widgets>
   </section>
 </container>

อธิบายโค้ด
จากข้อ 1 ในส่วนของ condition ถ้ามีการส่งค่า projectId จะเรียกใช้ widget ที่เรียกไฟล์ NewCustomerButton.ftl มาแสดงผลพร้อมกับ form ชื่อ EditProject
แต่ในทางกลับกัน ถ้าไม่มีการส่งค่า projectId ก็จะเรียก form ชื่อ EditProject มาแสดงผลเพียงอย่างเดียว

การสร้างไฟล์ diff เพื่อทำ patch

บางครั้งในการทำงานในโปรเจ็คท์ต้องมีการแก้ไขไฟล์หลักของ OFBiz โดยเฉพาะไฟล์ในโฟลเดอร์หลัก คือ applications, framework และ specialpurpose ซึ่งเมื่อแก้ไขแล้วหากทำการ commit ขึ้นไปที่ svn หลักของ OFBiz จะเกิดความสับสนกับ framework หลัก ดังนั้นจึงต้องทำไฟล์ .diff เพื่อให้เฉพาะโปรเจ็คท์ที่เราทำเท่านั้นได้ทราบถึงความเปลี่ยนแปลงของไฟล์ สามารถทำไฟล์ .diff ได้ดังนี้

1. ใช้คำสั่งดังนี้ใน terminal

svn diff applications >>/home/toonztudio/Documents/imas_28072010_toon.diff

อธิบายคำสั่ง
ใช้คำสั่ง svn diff เพื่อความแตกต่างของไฟล์ในโฟลเดอร์ applications แล้วสร้างไว้เป็นไฟล์ชื่อ imas_28072010.diff แล้วเก็บไว้ที่ /home/toonztudio/Documents

2. ทำการ copy ไฟล์ชื่อ imas_28072010.diff จาก /home/toonztudio/Documents มาเก็บไว้ใน โฟลเดอร์ patches ของโปรเจ็คท์ ในกรณีนี้คือ /home/toonztudio/Desktop/projects/imaserp/trunk/patches

3. ใช้คำสั่ง svn add ไฟล์ .diff

4. ใช้คำสั่ง svn commit ไฟล์ .diff เข้าสู่ repositories ต่อไป

วันพฤหัสบดีที่ 22 กรกฎาคม พ.ศ. 2553

การแยก column ในหัวตารางของ form

โดยปกติแล้วการแสดงข้อความในตารางควรจะมีหัวตาราง เพื่อแสดงข้อมูลว่าเป็นข้อมูลจากตารางไหน ซึ่งบางครั้งใน OFBiz จะแสดงหัวตารางในลักษณะติดกัน ทำให้ไม่สามารถทราบได้ว่า เป็นข้อมูลจากตารางไหน ดังรูป


ต้องทำการใส่แท็กเพื่อให้แสดงผลเป็นตาราง ดังนี้

separate-columns="true"

จะได้ตารางที่แสดงผลหัวตารางสมบูรณ์

วันจันทร์ที่ 12 กรกฎาคม พ.ศ. 2553

การเซ็ต trackpoint ของ thinkpad ใน Ubuntu

โดยปกติแล้วใน windows จะมี software ชื่อ UltraNav สำหรับควบคุมการทำงานของ trackpoint ทำให้ผู้ใช้ thinkpad บน windows สามารถควบคุม trackpoint ได้ แต่ใน ubuntu ต้องทำการแก้ไขไฟล์บางไฟล์เล็กน้อย เพื่อให้สามารถใช้ความสามารถของ trackpoint อย่างเต็มที่ได้ มีขั้นตอนดังนี้

1. สร้างไฟล์ /usr/lib/X11/xorg.conf.d/20-thinkpad.conf โดยใช้คำสั่ง
sudo gedit /usr/lib/X11/xorg.conf.d/20-thinkpad.conf

2. เพิ่มข้อความดังนี้ลงไปในไฟล์
Section "InputClass"
    Identifier "Trackpoint Wheel Emulation"
    MatchProduct "TrackPoint"
    MatchDevicePath "/dev/input/event*"
    Driver "evdev"
    Option "EmulateWheel" "true"
    Option "EmulateWheelButton" "2"
    Option "Emulate3Buttons" "false"
    Option "XAxisMapping" "6 7"
    Option "YAxisMapping" "4 5"
EndSection

3. save ไฟล์ และทำการ restart โดยใช้คำสั่ง
sudo /etc/init.d/gdm restart

4. จะสามารถใช้ trackpoint ร่วมกับปุ่มกลางของ touchpad ได้

reference:
http://psung.blogspot.com
http://thaipats.buddythai.com

วันพุธที่ 7 กรกฎาคม พ.ศ. 2553

การเปลี่ยนค่า screen resolution ของ ubuntu

ในการ install ubuntu บางครั้ง resolution ใน monitor ได้ค่าไม่ตรงกับค่าที่เคยเซ็ตใน windows ทำให้จอไม่ชัดหรือเบลอ สามารถแก้ไขได้ตามวิธีการดังนี้

1. เปิด terminal พิมพ์คำสั่ง

xrandr

2. จะได้ข้อความดังนี้
Screen 0: minimum 320 x 200, current 2464 x 900, maximum 8192 x 8192
VGA1 connected 1440x900+1024+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1360x768       59.8  *
   1024x768       60.0  
   800x600        60.3     56.2  
   848x480        60.0  
   640x480        59.9     59.9  
LVDS1 connected 1024x768+0+132 (normal left inverted right x axis y axis) 304mm x 228mm
   1024x768       60.0*+   85.0     75.0     70.1     60.0*    50.0  
   832x624        74.6  
   800x600        85.1     72.2     75.0     60.3     56.2  
   640x480        85.0     72.8     75.0     60.0     59.9  
   720x400        85.0  
   640x400        85.1  
   640x350        85.1  
TV1 disconnected (normal left inverted right x axis y axis)

* หมายเหตุ VGA1 คือ Acer monitor 17" ที่ต่อเพิ่ม ส่วน LVDS1 คือ monitor ของ Thinkpad R61

3. สิ่งที่ต้องการคือ ต้องการเพิ่มความละเอียด 1440x900 ในมอนิเตอร์ VGA1 ให้ทำการเช็ค modeline โดยใช้คำสั่ง

cvt 1440 900

*หมายเหตุ 1440 900 คือความละเอียด 1440x900 พิกเซล

4. จะแสดงผลดังนี้

# 1440x900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz
Modeline "1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync

โดยเราจะใช้โค้ดที่ต่อจาก modeline คือ
"1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync
ในการเซ็ตค่าที่ไฟล์ /etc/gdm/Init/Default

5. เปิดไฟล์ /etc/gdm/Init/Default โดยใช้คำสั่ง

sudo gedit /etc/gdm/Init/Default

6. ค้นหาบรรทัดดังนี้
PATH=/usr/bin:$PATH
OLD_IFS=$IFS

7. เพิ่มโค้ดต่อท้ายดังนี้
xrandr --newmode "1440x900_60.00"  106.50  1440 1528 1672 1904  900 903 909 934 -hsync +vsync
xrandr --addmode VGA1 1440x900_60.00
xrandr --output VGA1 --mode 1440x900_60.00
โดยค่าที่ใส่ในบรรทัด newmode คือค่าที่ได้จากการเช็ค modeline

8. restart ubuntu และเช็คค่าที่ System > Preference > Monitor จะพบ resolution ใหม่ที่เพิ่มเข้าไปแล้ว

Reference: http://www.ubuntugeek.com/how-change-display-resolution-settings-using-xrandr.html

การแก้ปัญหาเมื่อ Eclipse หา JVM ไม่เจอ

เมื่อทำการถอน jdk ตัวเดิมออกแล้วติดตั้งใหม่ Eclipse มักจะหา path ของ JAVA_HOME ไม่เจอ และจะแจ้งเตือนว่า

A Java Runtime Environment (JRE) or Java Development Kit (JDK)
must be available in order to run Eclipse. No Java virtual machine
was found after searching the following locations:
/home/toonztudio/Downloads/eclipse_reporting/jre/bin/java
java in your current PATH

หากยังไม่ได้เซ็ท JAVA_HOME ให้ทำการเซ็ตตามนี้
การ เซ็ต JAVA_HOME และ CLASSPATH บน Ubuntu

หากทำการเซ็ตแล้ว ให้เปิด Eclipse จะเจอ Error ด้านบน ให้แก้ไขไฟล์ eclipse.ini
โดยเพิ่มบรรทัด

-vm
/home/toonztudio/jdk1.6.0_20/bin

โดย /home/toonztudio/jdk1.6.0_20/bin คือพาธที่ทำการ install jdk ไว้

เปิด eclipse อีกครั้ง จะไม่เจอข้อความแสดง error

reference: http://wiki.eclipse.org/Eclipse.ini#Linux_Example

วันจันทร์ที่ 5 กรกฎาคม พ.ศ. 2553

การเซ็ต JAVA_HOME และ CLASSPATH บน Ubuntu

1. เปิด terminal พิมพ์ดังนี้
sudo gedit /etc/bash.bashrc

2. ในไฟล์ bash.bashrc เพิ่มคำสั่งดังนี้
export JAVA_HOME="/usr/lib/jvm/java-6-sun"
export JRE_HOME="/usr/lib/jvm/java-6-sun/jre"
export CLASSPATH="/usr/lib/jvm/java-6-sun/lib/tools.jar"
export PATH="/usr/lib/jvm/java-6-sun/bin:$PATH"

สามารถเช็คการตั้งค่าได้จาก terminal
พิมพ์ echo $JAVA_HOME เพื่อเช็คพาธ JAVA_HOME
พิมพ์ echo $JRE_HOME เพื่อเช็คพาธ JRE_HOME
พิมพ์ echo $CLASSPATH เพื่อเช็คพาธ CLASSPATH
พิมพ์ echo $PATH เพื่อเช็ค PATH

การเพิ่ม auto complete ให้กับ Eclipse

ในกรณีที่ Eclipse ไม่รู้จักคำสั่งใน namespace จะไม่สามารถสร้าง auto complete ได้ สามารถทำการเพิ่ม namespace ได้ ดังนี้

Windows -> Preference -> XML -> XML Catalog

ทำการเพิ่ม namespace เช่น http://ofbiz.apache.org/dtds/widget-screen.xsd
แล้วกด OK

วันอาทิตย์ที่ 4 กรกฎาคม พ.ศ. 2553

การเพิ่ม confirm dialog box ใน form ของ OFBiz 9.04

ใน OFBiz 10.04 การทำ Confirm Dialog Box สามารถใช้ confirmation-message ใน button ได้โดยตรง ดังนี้

<field name="searchButton" title="Search" widget-style="smallSubmit"><submit button-type="button" confirmation-message="Test"/></field>

แต่ใน OFBiz 9.04 ไม่สามารถใช้ confirmation-message ได้ จึงได้ทำการทดลองหาวิธีต่างๆ มาใช้ ดังนี้

ทดลองสร้าง javascript แล้วนำไปใช้กับ onClick ของปุ่มของฟอร์มใน OFBiz ดังนี้
<input type="submit" name="Submit" value="Submit" onClick="fncSubmit()" />

พบว่าไม่สามารถทำได้ เนื่องจาก OFBiz จะทำการ generate แท็ก onSubmit ให้โดยอัติโนมัติดังนี้

onSubmit="javascript:submitFormDisableSubmits(this)"

เมื่อเขียน javascript ที่ปุ่ม submit ของ form ทำให้เกิดการ submit ไปยัง target ของ form ถึงแม้ว่าจะเป็นการกดปุ่ม cancel

ได้รับคำแนะนำจากพี่แซนด์ให้ทำการสร้างปุ่มของฟอร์มในไฟล์ ftl แล้ว include เข้ามาใช้แทนปุ่มของ form โดยตรง จึงได้ทำการสร้างไฟล์ดังนี้

1. สร้างไฟล์ submitButton.ftl โดยมีรายละเอียดดังนี้ (ใช้ dojo มาช่วยในการเขียน javascript ศึกษาเพิ่มเติมได้จาก http://www.dojotoolkit.org/)

<button dojoType="dijit.form.Button" id="btn">Submit
    <script type="dojo/method" event="onClick">showDlg1("FindProject")</script>
</button>

2. ทำการ comment ปุ่มของ form เดิม เพื่อไม่ให้ปุ่มเดิมสามารถทำงานได้
3. เขียนฟังก์ชั่น javascript ในไฟล์ชื่อ testDialog.js ดังนี้

dojo.addOnLoad(function(){
 dojo.parser.parse();
});

function removeThis(){
 this.destroyRecursive()
}

function showDlg1(formIdName){
 var d = new dijit.Dialog({id:'dlg',title:'Dojo Dialogs',content: "<h2>Do you need to do this thing ?</h2>" +
        "<button dojoType='dijit.form.Button' type='submit' id='buttonalertyes' iconClass='mailIconOk' onClick='document." + formIdName + ".submit()'>Yes</button><button dojoType='dijit.form.Button' type='submit' id='buttonalertno' iconClass='mailIconCancel'>No</button>",onExecute:removeThis,onCancel:removeThis});
 d.show()
}

4. ที่ form ทำการ include ไฟล์ submitButton.ftl เข้าไปดังนี้
<platform-specific>
    <html><html-template location="component://imas-project/webapp/imas-project/project/submitButton.ftl"/></html>
</platform-specific>

5. ทำการเพิ่มไฟล์ testDialog.js ใน framework/common/widget/CommonScreens.xml เพื่อให้ทุกเพจสามารถเรียกใช้ไฟล์ javscript นี้ได้ ดังนี้
<set field="layoutSettings.javaScripts[+0]" value="/dojotoolkit/imas/testDialog.js" global="true"/>

6.เมื่อทดลองกดปุ่ม จะแสดง dialog box ดังนี้