如何使用dialog2打开编辑窗口¶
使用dialog2打开窗口主要有两种方式:
- 窗口内容已经在前端写好,只要打开即可
- 窗口内容将从后台动态生成,后台需要有相应的view来生成窗口
窗口内容从后台生成¶
引用组件¶
{{use "jqutils", ajaxForm=True}}
{{include "inc_jquery_dialog2.html"}}
如果你要使用ajax方式来提交dialog2中的Form,应在 {{use "jqutils"}}
时加入 ajaxForm=True
的 参数,以便自动导入 jquery.form.js
进行ajax提交的处理。
处理事件点击¶
var dialog = $('<div id="edit_plan"></div>').dialog2(
{
autoFocus:false,
url:url,
ajaxFormOptions: {
onSuccess: common_ajaxForm_success(function(data){
//success process
}),
dataType: 'json'
}
});
dialog.closest('.modal').addClass('wide-modal');
dialog.bind('dialog2.content-update', function(e){
//add what you want to do after the content update from server
dialog.find('input.rselect').each(function(){
$(this).rselect();
});
});
其中,建议给每个 <div>
都设置一个 id
属性。
dialog2在创建时时使用的参数参考它的文档 http://nikku.github.com/jquery-bootstrap-scripting/. 其中,ajaxFormOptions 中的onSuccess对应成功后的处理。这里 common_ajaxForm_success
是在 inc_jquery_dialog2.html
中定义的。它用来处理当ajax方式与后台交互时,出错 信息的处理。
缺省的bootstrap的宽度是一定的。如果太窄,可以象上面使用:
dialog.closest('.modal').addClass('wide-modal');
如果有些js代码需要在显示弹出窗口之后再执行,可以在:
dialog.bind('dialog2.content-update', function(e){})
中进行处理。
更多common_ajaxForm_success的细节¶
common_ajaxForm_success
可以接收参数对象或函数对象。上例为直接传入了函数对象。 你还可以传入一个参数对象,详细定义为:
{
success:null,
message: show_message,
done:null,
error:null,
field_prefix:'div_field_',
message_type:'bootstrap'
}
其中:
- success, done, error 为成功,完成及出错时的处理函数。缺省不提供。
- message 为应答信息使用的函数。应答信息是整个调用的结果,一般成功时也会返回。而出错 信息是按字段分别对应的信息。缺省使用poshytip中定义的
show_message
。(poshytip 已经在inc_jquery_dialog2.html
被引用。 - field_prefix 用来处理当出错时来查找出错字段对应的容器元素。缺省是
div_field_
。 这种格式是使用uliweb的Generic View自动生成时创建的。所以common_ajaxForm_success
的处理是与Generic View配套的。其它不使用Generic View的情况下,你可能需要仿照common_ajaxForm_success
来进行相应的成功或出错处理。 - message_type 用来指明出错时提示的风格。缺省使用
bootstrap
。还支持tip
风格。它将使用 poshytip 控件来显示出错信息。
Form的处理¶
因为使用了dialog2插件,如果在提交时,你想使用ajaxForm来处理,则需求按它的要求 在 <form>
中添加 class=ajax
属性。如果 Form 本身是手写代码很容易添加属性, 那么在自动生成 Form 内容的情况下,就需要一些技巧了。有以下方法可以在生成 Form 时添加class属性:
在view中传入form参数
一般我们会使用generic.py中的 AddView,EditView等来自动生成Form。因此我们可以 向它们传入form_args参数,如:
form_args={'action':request.path, 'html_attrs':{'class':'ajax form-horizontal'}, }
在模板中进行处理
我们可以利用Form类提供的build属性将Form的生成分成几部分,如:
- begin
<form class=xxxx>
- body
Form的内容
- buttons_line
Form的按钮行
- end
</form>
其中,每一部分都可以单独运行。这样我们就可以保留需要的内容,将其它的内容进 行替換。举例如下:
<form class="ajax {{=defined('form_class') or 'form-horizontal'}}" method="POST" action="{{=defined('action') or functions.request_url()}}"> {{build = form.build}} {{<< build.body}} {{<< build.buttons_line}} </form>
这个例子自定义了 begin 和 end 。在
<form>
上添加了ajax
的 class。
原来是使用 request.url
来表示请求的URL,但是在群集部署情况下, request.url
将是处理请求机器的IP,不是接入机的IP。所以会不正确。而 functions.request_url()
会只使用相对路径,避免了这一问题。