วันนี้เรามาเรียนรู้เรื่อง form กันครับ ซึ่งก็คล้ายๆกับ HTML form แต่ดูมีหน้าตาสวยงามกว่ากันมาก component หลักของ Ext JS form มี 2 อัน
- Ext.form.FormPanel
- Ext.form.Field
เริ่มจากการเขียน form แรกกันเลย กำหนดง่ายๆแค่ name , birthdate, email เราจะใช้งาน extjs-sandbox.html จากบทที่ 3 กันนะคับ
code snippet
code snippet
if (Ext.getCmp('idx')) {Ext.getCmp('idx').destroy();}
var user_form = new Ext.form.FormPanel({
url: 'register'
,id: 'idx'
,renderTo: document.body
,frame: true
,title: 'User Registration Form'
,width: 250
,items: [{
xtype: 'textfield'
,fieldLabel: 'Name'
,name: 'name'
},{
xtype: 'datefield'
,fieldLabel: 'Birth Date'
,name: 'birthdate'
},{
xtype: 'textfield'
,fieldLabel: 'Email'
,name: 'email'
}]
});
ใช้ Chrome เปิด file C:\extjs-test\extjs-sandbox.html จากความเดิม บทที่ 3
copy code snippet ข้างบนเอาไป paste ในพื้นที่สีเหลือง แล้วกดปุ่ม [execute JS] จะได้ตามรูปข้างล่าง
ขยาย birthdate ให้ขนาดเท่าๆกับ textfield ได้โดยใช้ config
,anchor: '99%'
หรือตัวเลขอื่นที่เหมาะสม
เพิ่มการตรวจสอบให้กับ field เช่น Name ห้ามเป็นค่าว่าง ใช้ config ชื่อ allowBlank: false แปลว่า ไม่อนุญาตให้เป็นค่าว่าง
,items: [{
xtype: 'textfield'
,fieldLabel: 'Name'
,name: 'name'
,allowBlank: false
},{
click ที่ input box name 1 ครั้ง แต่ไม่ต้องกรอกอะไร แล้วมา click ที่ช่องอื่นเช่น Birthdate จะเห็นช่อง Name มีกรอบแดงๆล้อม รอบ แสดงว่า มีความผิดพลาดเกิดขึ้น แต่ตอนนี้ ยังไม่มีการแจ้ง ข้อความผิดพลาด
เพิ่ม filter ใน datepicker เช่น ห้ามเลือกวันเสาร์ หรือ วันอาทิตย์ ให้ใช้ config disabledDays: [] เลือก 0-6 0 คือวันอาทิตย์ และ 6 คือวันเสาร์ จึงได้เป็น disabledDays: [0,6]
Built-in Validation
Ext JS ได้จัดให้มีการตรวจสอบข้อผิดพลาดของ Input หรือการ validate มาให้เป็นพิเศษ สำหรับ field ที่มักจะ input ผิดพลาดบ่อยๆ เช่น
- url
- alpha
- alphanum
เป็นต้น ตัวอย่างวิธีการใช้งาน ทำโดยระบุ config ว่า
vtype: 'email'
vtype: 'email'
ลองใช้ extjs-sandbox.html ของเราทำการพิสูจน์กันดู
},{
xtype: 'textfield'
,fieldLabel: 'Email'
,name: 'email'
,vtype: 'email'
}]
กดปุ่ม [Clear] เพื่อลบ form เก่าทิ้ง แล้วกดปุ่ม [execute JS] เพื่อสร้าง form ขึ้นมาใหม่ ทดลองกรอก email จะได้กรอบสีแดง เตือนขึ้นจริงหรือไม่
จะเห็นว่ามีการแสดงเป็นกรอบสีแดงจริง แต่ไม่มีข้อความแจ้งเตือนอธิบายให้กับผู้ใช้งาน
Ext JS ได้จัดข้อความเตือนไว้ให้อยู่แล้ว แต่ต้องระบุไว้ในช่วงต้นๆ นั่นคือ QuickTips และวิธีการเรียกใช้งานคือ
Ext.QuickTips.init();
This field is required
แล้วถ้าเราอยากจะสร้าง custom validation ขึ้นมาเองหละคับ เช่น PID 13 หลัก ต้องเป็นตัวเลข จำนวน 13 หลัก ห้ามกรอกตัวอักษรหรือเครื่องหมายอื่นๆxxxMask สำหรับจำกัด input เช่น ตัวเลขเท่านั้น ตัวอักษรเท่านั้น
xxxText สำหรับข้อความที่จะแสดงใน QuickTips
ตัวอย่างเช่น เราจะสร้าง vtype ชื่อ pid ตามโจทย์ พร้อมวิธีการนำไปใช้งานใน form
Ext.QuickTips.init();
if (Ext.getCmp('idx')) {Ext.getCmp('idx').destroy();}
if (Ext.getCmp('idx')) {Ext.getCmp('idx').destroy();}
Ext.form.VTypes['pidVal'] = /^[0-9]{13}/;
Ext.form.VTypes['pidMask'] = /[0-9]/;
Ext.form.VTypes['pidText'] = 'เลขที่บัตรประชาชน ต้องเป็นตัวเลข จำนวน 13 หลัก';
Ext.form.VTypes['pid'] = function(v) {
return Ext.form.VTypes['pidVal'].test(v);
}
var user_form = new Ext.form.FormPanel({
url: 'register'
,id: 'idx'
,renderTo: document.body
,frame: true
,title: 'User Registration Form'
,width: 250
,items: [{
xtype: 'textfield'
,fieldLabel: 'PID'
,name: 'pid'
,vtype: 'pid'
}]
});
คำอธิบาย
/^[0-9]{13}/ เป็น pattern matching มีที่มาจาก regular expression ทั่วไป
^ หมายถึง ต้องขึ้นต้นด้วย[0-9] หมายถึงต้องเป็น ตัวเลข 0 1 2 3 4 5 6 7 8 9 เท่านั้น
{13} หมายถึง repeat จนครบ 13 ครั้ง ถึงจะถือว่า matched
Copy เอา code snippet ข้างบน ไปใส่ไว้ในพื้นที่สีเหลืองของ extjs-sandbox.html แล้วกดปุ่ม [execute JS] แล้วลองกรอกข้อมูลในช่อง PID จะพบว่า เราไม่สามารถ key ตัวอักษรใดๆได้เลย นอกจากตัวเลขเท่านั้น และเมื่อ key ตัวเลขไปยังไม่ครบ 13 ตัว กล่อง input จะมีกรอบสีแดง และเมื่อเอา mouse ไปวางบนกล่อง จะได้ QuickTips เป็นข้อความตามที่เราได้ระบุไว้ใน pidText ดังรูปตัวอย่างผลการทดลอง
มารู้จักกับ Form Fields ประเภทอื่นๆที่มีการใช้งานกันพอสมควร
Radio Button ตัวอย่างการใช้งาน เช่น เพศ ( ) ชาย ( ) หญิง ที่เลือกได้แค่อันใดอันหนึ่งเท่านั้น
code snippet
Ext.QuickTips.init();
if (Ext.getCmp('idx')) {Ext.getCmp('idx').destroy();}var user_form = new Ext.form.FormPanel({
url: 'register'
,id: 'idx'
,renderTo: document.body
,frame: true
,title: 'User Registration Form'
,width: 250
,items: [{
xtype: 'radio'
,fieldLabel: 'เพศ'
,name: 'sex'
,boxLabel: 'ชาย'
},{
xtype: 'radio'
,hideLabel: false
,name: 'sex'
,boxLabel: 'หญิง'
}]
});
ComboBox เช่น สถานภาพสมรส : โสด สมรส หม้าย หย่า แยก ที่เลือกได้แค่อันใดอันหนึ่งเท่านั้น
code snippet
if (Ext.getCmp('idx')) {Ext.getCmp('idx').destroy();}
var mstatus = new Ext.data.SimpleStore({
fields: ['id', 'desc']
,data: [
['1', 'โสด']
,['2', 'สมรส']
,['3', 'หม้าย']
,['4', 'หย่า']
,['5', 'แยก']
]
});
var user_form = new Ext.form.FormPanel({
url: 'register'
,id: 'idx'
,renderTo: document.body
,frame: true
,title: 'User Registration Form'
,width: 250
,items: [{
xtype: 'combo'
,name: 'marital'
,fieldLabel: 'สถานภาพสมรส'
,mode: 'local'
,store: mstatus
,displayField: 'desc'
,width: 120
}]
});
Copy เอา code snippet ข้างบน ไปใส่ไว้ในพื้นที่สีเหลืองของ extjs-sandbox.html แล้วกดปุ่ม [execute JS]
ตรงนี้เป็นทางแยกที่สำคัญแล้วคับ เพราะผมต้องขอยอมรับตามตรงว่า ไม่ได้รู้ไปหมดทุกอย่าง พอรู้บ้าง แต่ไม่มีเวลาศึกษาในอีกหลายๆเรื่อง เช่น
- php ไม่ถนัด เพราะใช้แต่ ruby มานาน
- Ruby on Rails จนเดี๋ยวนี้ มีจำนวนผู้ใช้ RoR เพิ่มขึ้นมาก เลยถือโอกาสตามน้ำศึกษา RoR เพิ่มเติม
- Operating System นี่ถนัด Linux Fedora Distro
- ด้านฐานข้อมูลก็ PostgreSQL
- ด้าน GIS ก็มีตั้งแต่ MapServer PostGIS OpenLayers GeoRuby
จบบทความที่ 4
สวัสดีครับคือผมต้องการจะ สร้าง form ติดต่อกับ database ครับ
ตอบลบที่สามารถ add/update/delete หามานานแล้วครับ ยังไม่ได้ซักที
ขอคำแนะนำด้วยครับ...ขอบคุณครับ