ผลต่างระหว่างรุ่นของ "Openerp/module 2"
ไปยังการนำทาง
ไปยังการค้นหา
Jittat (คุย | มีส่วนร่วม) (หน้าที่ถูกสร้างด้วย 'ไฟล์ของโมเดลจากครั้งก่อน: '''easynote.py''' <syntaxhighlight lang="python"> from osv ...') |
Jittat (คุย | มีส่วนร่วม) (→states) |
||
(ไม่แสดง 5 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน) | |||
แถว 1: | แถว 1: | ||
− | + | == Note & Category == | |
+ | ไฟล์จากครั้งก่อน | ||
'''easynote.py''' | '''easynote.py''' | ||
แถว 122: | แถว 123: | ||
</data> | </data> | ||
</openerp> | </openerp> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | == onchange == | ||
+ | |||
+ | ใน easynote_view.xml | ||
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
+ | <record model="ir.ui.view" id="view_easynote_note_form"> | ||
+ | ... | ||
+ | <field name="arch" type="xml"> | ||
+ | <form string="Note" version="7.0"> | ||
+ | <field name="title" on_change="onchange_note_title(title)"/> | ||
+ | ... | ||
+ | </form> | ||
+ | </field> | ||
+ | </record> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | การระบุดังกล่าวจะทำให้เมื่อข้อมูลในฟอร์มในฟิลด์นั้นมีการเปลี่ยนแปลง จะมีการเรียกเมท็อด onchange_note_title ที่โมเดล | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | def onchange_note_title(self, cr, uid, ids, title): | ||
+ | pass | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | พารามิเตอร์ cr, uid, ids นั้นจะเป็นพารามิเตอร์ที่ส่งให้โดยอัตโนมัติ ส่วน title นั้น มาจากที่เราระบุใน attribute on_change ด้านบน | ||
+ | |||
+ | เมท็อดดังกล่าวสามารถประมวลผลแล้วส่งค่าคืนได้หลายแบบ [https://doc.openerp.com/trunk/server/03_module_dev_03/#on-change อ่านเพิ่มได้จากเอกสารส่วน onchange] | ||
+ | |||
+ | == action / ORM methods == | ||
+ | ในฟอร์ม เราสามารถเพิ่มปุ่มและกำหนดกิจกรรม (action) ให้กับปุ่มนั้นได้ ([https://doc.openerp.com/trunk/server/03_module_dev_03/#button เอกสาร openerp]) โดยใน xml ที่ระบุฟอร์ม เราสามารถเพิ่มปุ่มเช่น | ||
+ | |||
+ | <syntaxhighlight lang="xml"> | ||
+ | <button name="action_test_action" type="object" string="Test"/> | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | โดยที่ | ||
+ | |||
+ | * type ที่ระบุเป็น object หมายถึงให้เรียกใช้เมท็อดในคลาสของโมเดล | ||
+ | * name จะระบุชื่อเมท็อดที่ต้องการเรียกให้ทำงาน | ||
+ | |||
+ | จากตัวอย่างข้างต้น ในโมเดลเราจะระบุเมท็อด | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | def action_test_action(self, cr, uid, ids, context=None): | ||
+ | pass | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ในการทำงานกับโมเดล สามารถดู methods ของ ORM ได้จากเอกสารที่แจก | ||
+ | |||
+ | == states == | ||
+ | |||
+ | <syntaxhighlight lang="python"> | ||
+ | class Note(osv.Model): | ||
+ | _name = 'easynote.note' | ||
+ | _rec_name = 'title' | ||
+ | _columns = { | ||
+ | 'title': fields.char('Title', | ||
+ | size=100, | ||
+ | required=True, | ||
+ | states={'confirmed': [('readonly', True)]}), | ||
+ | 'body': fields.text('Body', required=True), | ||
+ | 'number': fields.integer('Number'), | ||
+ | 'category_id': fields.many2one('easynote.category', 'Category'), | ||
+ | |||
+ | 'state': fields.selection([('draft','Draft'), | ||
+ | ('confirmed','Confirmed')], | ||
+ | 'State', | ||
+ | required=True, | ||
+ | readonly=False), | ||
+ | } | ||
+ | _defaults = { | ||
+ | 'state': 'draft', | ||
+ | } | ||
</syntaxhighlight> | </syntaxhighlight> |
รุ่นแก้ไขปัจจุบันเมื่อ 09:10, 4 ธันวาคม 2556
Note & Category
ไฟล์จากครั้งก่อน
easynote.py
from osv import osv, fields
class Category(osv.Model):
_name = 'easynote.category'
_columns = {
'name': fields.char('Name', size=50, required=True),
'note_ids': fields.one2many('easynote.note', 'category_id', 'Notes')
}
class Note(osv.Model):
_name = 'easynote.note'
_rec_name = 'title'
_columns = {
'title': fields.char('Title', size=100, required=True),
'body': fields.text('Body', required=True),
'number': fields.integer('Number'),
'category_id': fields.many2one('easynote.category', 'Category'),
}
easynote_view.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="view_easynote_note_tree">
<field name="name">easynote.note.tree</field>
<field name="model">easynote.note</field>
<field name="arch" type="xml">
<tree string="Note">
<field name="title"/>
<field name="body"/>
<field name="number"/>
<field name="category_id"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_easynote_note_form">
<field name="name">easynote.note.form</field>
<field name="model">easynote.note</field>
<field name="arch" type="xml">
<form string="Note" version="7.0" class="oe_form_nomargin">
<field name="title" />
<field name="body" widget="html" class="oe_memo" editor_height="100px" />
<field name="number"/>
<field name="category_id"/>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_easynote_note">
<field name="name">EasyNotes</field>
<field name="res_model">easynote.note</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_open_true':True}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a note. blah blah
</p>
<p>
Use notes to organize personal tasks or notes.
</p>
</field>
</record>
<record model="ir.ui.view" id="view_easynote_category_tree">
<field name="name">easynote.category.tree</field>
<field name="model">easynote.category</field>
<field name="arch" type="xml">
<tree string="Categry">
<field name="name"/>
<field name="note_ids"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="view_easynote_category_form">
<field name="name">easynote.category.form</field>
<field name="model">easynote.category</field>
<field name="arch" type="xml">
<form string="Category">
<field name="name"/>
<field name="note_ids"/>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="action_easynote_category">
<field name="name">Category</field>
<field name="res_model">easynote.category</field>
<field name="view_type">form</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_open_true':True}</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click to add a category.
</p>
</field>
</record>
<menuitem name="Notes" id="menu_easynote_top"
parent="" sequence="1"
action="easynote.action_easynote_note"/>
<menuitem name="Your Notes" id="menu_easynote_main"
parent="menu_easynote_top" sequence="1"/>
<menuitem name="Notes" id="menu_easynote_note"
parent="menu_easynote_main" sequence="1"
action="easynote.action_easynote_note"/>
<menuitem name="Categories" id="menu_easynote_category"
parent="menu_easynote_main" sequence="2"
action="easynote.action_easynote_category"/>
</data>
</openerp>
onchange
ใน easynote_view.xml
<record model="ir.ui.view" id="view_easynote_note_form">
...
<field name="arch" type="xml">
<form string="Note" version="7.0">
<field name="title" on_change="onchange_note_title(title)"/>
...
</form>
</field>
</record>
การระบุดังกล่าวจะทำให้เมื่อข้อมูลในฟอร์มในฟิลด์นั้นมีการเปลี่ยนแปลง จะมีการเรียกเมท็อด onchange_note_title ที่โมเดล
def onchange_note_title(self, cr, uid, ids, title):
pass
พารามิเตอร์ cr, uid, ids นั้นจะเป็นพารามิเตอร์ที่ส่งให้โดยอัตโนมัติ ส่วน title นั้น มาจากที่เราระบุใน attribute on_change ด้านบน
เมท็อดดังกล่าวสามารถประมวลผลแล้วส่งค่าคืนได้หลายแบบ อ่านเพิ่มได้จากเอกสารส่วน onchange
action / ORM methods
ในฟอร์ม เราสามารถเพิ่มปุ่มและกำหนดกิจกรรม (action) ให้กับปุ่มนั้นได้ (เอกสาร openerp) โดยใน xml ที่ระบุฟอร์ม เราสามารถเพิ่มปุ่มเช่น
<button name="action_test_action" type="object" string="Test"/>
โดยที่
- type ที่ระบุเป็น object หมายถึงให้เรียกใช้เมท็อดในคลาสของโมเดล
- name จะระบุชื่อเมท็อดที่ต้องการเรียกให้ทำงาน
จากตัวอย่างข้างต้น ในโมเดลเราจะระบุเมท็อด
def action_test_action(self, cr, uid, ids, context=None):
pass
ในการทำงานกับโมเดล สามารถดู methods ของ ORM ได้จากเอกสารที่แจก
states
class Note(osv.Model):
_name = 'easynote.note'
_rec_name = 'title'
_columns = {
'title': fields.char('Title',
size=100,
required=True,
states={'confirmed': [('readonly', True)]}),
'body': fields.text('Body', required=True),
'number': fields.integer('Number'),
'category_id': fields.many2one('easynote.category', 'Category'),
'state': fields.selection([('draft','Draft'),
('confirmed','Confirmed')],
'State',
required=True,
readonly=False),
}
_defaults = {
'state': 'draft',
}