Я пытаюсь использовать виджет portal.portal_signature внутри моего модуля внешнего интерфейса.
Если я добавлю приведенный ниже код в мой шаблон, все будет работать нормально:
<t t-call="portal.portal_signature">
<t t-set="object" t-value="object"/>
<t t-set="res_id" t-value="object.id"/>
<t t-set="callUrl" t-value="'/add/some/path'"/>
</t>
Но если я добавлю этот код в шаблон, визуализированный с помощью контроллера JSON и показанный как модальное окно, t-call
не отображает виджет подписи!
<template id="sale_worksheet_signature_modal" name="Sale Worksheet's Siganture Creation">
<div id="modal_signature_create" class="modal fade" tabindex="-1" role="dialog">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">x</button>
<h4 class="modal-title" id="myModalLabel"><strong>Add new signature</strong></h4>
</div>
<div class="modal-body">
<h3>Sign Sale Worksheet</h3>
<hr/>
<!-- Call custom signature -->
<t t-call="website_signature.portal_signature">
<t t-set="object" t-value="object"/>
<t t-set="res_id" t-value="object.id"/>
<t t-set="callUrl" t-value="'/my/path/to/trigger'"/>
</t>
</div>
<div class="modal-footer">
<div class="pull-right">
<button type="button" class="btn btn-danger js_goto_sale_worksheet" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
</template>
Здесь контроллер, который отображает модальный шаблон:
@route(['/my/path/that/load/modal'],
type='json', auth="user", methods=['POST'], website=True)
def signature_modal_create(self, **post):
"""
JSON Controller that render the modal template for signature creation
for client side
:param post:
:return: render modal sale_worksheet.sale_worksheet_signature_modal
"""
if not post.get('sale_worksheet_id'):
return False
sale_worksheet = request.env['sale.worksheet']\
.browse(post.get('sale_worksheet_id'))
if not sale_worksheet.exists():
return False
values = self.get_modal_signature_render_values(sale_worksheet)
return request.env['ir.ui.view']\
.render_template("sale_worksheet.sale_worksheet_signature_modal", values)
Все это вызывается из виджета JavaScript, добавленного к кнопке, позволяющей пользователю добавить новую подпись:
odoo.define('sale_worksheet.sale_worksheet_signature_widget', function (require) {
require('web.dom_ready');
var ajax = require('web.ajax');
var core = require('web.core');
var Widget = require('web.Widget');
var _t = core._t;
var WorksheetSignatureWidget = Widget.extend({
start: function () {
var self = this;
var res = this._super.apply(this.arguments).then(function () {
$('.js_show_modal_signature_create')
.off('click')
.click(function (ev) {
self.openModalCreateSignature(ev);
});
});
return res;
},
openModalCreateSignature: function (ev) {
ev.preventDefault();
ev.stopPropagation();
var $button = $(ev.currentTarget).closest('#create_signature');
$button.attr('disabled', true);
var saleWorksheetLineId = $('input[name=sale_worksheet_id]').val();
var post = {
'sale_worksheet_id': Number(saleWorksheetLineId),
};
return ajax.jsonRpc('/my/path/that/load/modal', 'call', post).then(function (modal) {
var $modal = $(modal);
$modal.modal({backdrop: 'static', keyboard: false});
$modal.insertAfter($('.signature-div')).modal();
$modal.on('click', '.js_goto_sale_worksheet', function () {
$modal.modal('hide');
$button.prop('disabled', false);
});
$modal.on('click', '.close', function () {
$button.prop('disabled', false);
});
});
},
});
return WorksheetSignatureWidget;
});
Я делаю что-то не так, или render_template()
метод не отображает внутренний t-call
?