2016-01-05 17 views
9

Pracuję z odoo . W systemie istnieje render_value metody dla każdego typu pola:Odoo 9. Jak przesłonić widżety formularzy?

/odoo/addons/web/static/src/js/views/form_widgets.js 
/odoo/addons/web/static/src/js/views/form_relational_widgets.js 

Jak mogę wykorzystać mój sposób niestandardowy render_value (na przykład w FieldChar) dla wszystkich form? I w jaki sposób mogę użyć konkretnej wartości render_value dla jednej formy lub jednego modułu?

Utworzone form_widgets.js w moim module, ale nie rozumiem, jak poprawnie zastąpić pole.

odoo.define('my_module.form_widgets', function (require) { 
"use strict"; 

// what I should do here??? 

}); 

Czy możesz podać mały przykład? Z góry dziękuję.

Odpowiedz

17

Znalazłem rozwiązanie.

Pierwszą rzeczą, którą trzeba zrobić, jest utworzenie statycznej dla interfejsu użytkownika. JS:

// path_to_your_module/static/src/js/form_widgets.js 
odoo.define('your_module.form_widgets', function (require) { 
    "use strict"; 

    var core = require('web.core'); 
    var form_common = require('web.form_common'); 
    var FieldChar = core.form_widget_registry.get('char'); 

    FieldChar.include({ 
     // this is will be work for all FieldChar in the system 
     template: 'MyChar', // my template for char fields 
     // we can create here any logic for render 
     //render_value: function() { 
     //} 
    }); 
    // this is widget for unique CharField 
    var MyModuleFieldChar = FieldChar.extend({ 
     template: 'MyUniqueChar' // my custom template for unique char field 
    }); 
    // register unique widget, because Odoo does not know anything about it 
    core.form_widget_registry.add('my_unique_char', MyModuleFieldChar); 

}); 

szablony dla QWEB:

<?xml version="1.0" encoding="UTF-8"?> 
<templates xml:space="preserve"> 
<!-- path_to_your_module/static/src/xml/form_widgets.xml --> 
<t t-name="MyChar"> 
    <!-- for example I just added new <span> to all FieldChar --> 
    <span>my_val</span> 
    <!-- this is original content for CharField from path_to_odoo/addons/web/static/src/xml/base.xml --> 
    <span t-att-class="'oe_form_field '+widget.widget_class" t-att-style="widget.node.attrs.style"> 
     <t t-if="!widget.get('effective_readonly')"> 
      <input t-att-type="widget.password ? 'password' : 'text'" 
       t-att-barcode_events="widget.options.barcode_events" 
       t-att-id="widget.id_for_label" 
       t-att-tabindex="widget.node.attrs.tabindex" 
       t-att-autofocus="widget.node.attrs.autofocus" 
       t-att-placeholder="widget.node.attrs.placeholder" 
       t-att-maxlength="widget.field.size" 
      /><img class="oe_field_translate oe_input_icon" t-if="widget.field.translate" t-att-src='_s + "/web/static/src/img/icons/terp-translate.png"' width="16" height="16" border="0"/> 
     </t> 
     <t t-if="widget.get('effective_readonly')"> 
      <span class="oe_form_char_content"></span> 
     </t> 
    </span> 
</t> 
<!-- This is example template for my unique field --> 
<t t-name="MyUniqueChar"> 
    <span>unique_char</span> 
</t> 

</templates> 

Drugi krok - to nasze pliki statyczne.

Utwórz nowy widok, który będzie dodać aktywa :

<?xml version="1.0" encoding="utf-8"?> 
<!-- path_to_your_module/views/assets.xml --> 
<openerp> 
    <data> 
     <template id="assets_backend" name="mail assets" inherit_id="web.assets_backend"> 
      <xpath expr="." position="inside"> 
       <script type="text/javascript" src="/your_module/static/src/js/form_widgets.js"></script> 
      </xpath> 
     </template> 
    </data> 
</openerp> 

W OpenERP .py z modułem dodać następujące sekcje:

'data': [ 
    'views/assets.xml', 
    # other files 
], 
'qweb': [ 
    'static/src/xml/*.xml', 
], 

Po zostanie to działa nasz Pole FieldChar dla wszystkich pól CHAR w systemie. Jeśli musimy użyć my_unique_char potrzebujemy tylko dodać atrybut widget do pola od naszego tak:

<field name="name" widget="my_unique_char"/> 

Mam nadzieję, że komuś pomóc.