ผลต่างระหว่างรุ่นของ "Openerp/module 2"

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 2 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 153: แถว 153:
  
 
== action / ORM methods ==
 
== 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 ==
 
== 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>

รุ่นแก้ไขปัจจุบันเมื่อ 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',
    }