免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2614 | 回复: 5
打印 上一主题 下一主题

FleaPHP 的 Ajax 支持和 WebControls [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-06 14:51 |只看该作者 |倒序浏览
FleaPHP 现在具有了基本的 Ajax 支持,示例代码如下:

首先在控制器显示模版的动作方法中有如下代码:

  1.     /**
  2.      * 显示登录界面
  3.      */
  4.     function actionIndex()
  5.     {
  6.         $this->_registerFormEvent('form_login', 'submit', 'OnFormLoginSubmit',
  7.                 array(
  8.                     'beforeRequest' => "\$('loginFailed').setHTML('');",
  9.                     'evalScripts' => true,
  10.                     'update' => 'loginFailed'
  11.                 )
  12.         );
  13.         $ajax =& $this->_getAjax();

  14.         init_webcontrols();
  15.         
  16.         include(TPL_DIR . '/Login.php');
  17.     }
复制代码


_registerFormEvent() 是 FLEA_Controller_Action 的一个方法,用来注册一个表单的事件。
如果是注册控件(例如文本框)的事件,则用 _registerEvent() 方法。

两个方法的参数是一样的,第一个参数都是控件或者表单的ID,第二个参数是要注册的 DOM 事件(例如 click、change、submit)。第三个参数是当前控制器中用于响应该事件的动作名。第四个参数则是一些 Ajax 事件的属性。

上面代码里面为一个名为 form_login 的表单注册了一个 submit 事件,响应该事件的动作名是 OnFormLoginSubmit。

init_webcontrols(); 是用于初始化 WebControls,因为 Login.php 模版会用到 WebControls。

所以这个控制器还有一个方法如下:


  1.     function actionOnFormLoginSubmit()
  2.     {
  3.         $username = isset($_POST['username']) ? $_POST['username'] : '';
  4.         $password = isset($_POST['password']) ? $_POST['password'] : '';
  5.         if ($username == 'dualface' && $password == '123456') {
  6.             ajax_redirect(url('Welcome'));
  7.         } else {
  8.             echo '您输入的用户名或密码不正确';
  9.         }
  10.     }
复制代码


这个方法里面,判断用户登录是否成功。成功就用 ajax_redirect() 重定向浏览器,失败则显示出错信息。要注意的是,ajax_redirect() 要求事件 Ajax 属性中的 evalScripts 必须为 true。这样才能成功的重定向浏览器。

整个控制器的代码:


  1. class Controller_Default extends FLEA_Controller_Action
  2. {
  3.     /**
  4.      * 显示登录界面
  5.      */
  6.     function actionIndex()
  7.     {
  8.         $this->_registerFormEvent('form_login', 'submit', 'OnFormLoginSubmit',
  9.                 array(
  10.                     'beforeRequest' => "\$('loginFailed').setHTML('');",
  11.                     'evalScripts' => true,
  12.                     'update' => 'loginFailed'
  13.                 )
  14.         );
  15.         $ajax =& $this->_getAjax();

  16.         init_webcontrols();
  17.         
  18.         include(TPL_DIR . '/Login.php');
  19.     }
  20.    
  21.     function actionOnFormLoginSubmit()
  22.     {
  23.         $username = isset($_POST['username']) ? $_POST['username'] : '';
  24.         $password = isset($_POST['password']) ? $_POST['password'] : '';
  25.         if ($username == 'dualface' && $password == '123456') {
  26.             ajax_redirect(url('Welcome'));
  27.         } else {
  28.             echo '您输入的用户名或密码不正确';
  29.         }
  30.     }
  31. }
复制代码


非常简单,不需要修改任何应用程序设置,也不需要从特别的对象继承。而且只有在显示模版的动作方法中才需要注册事件(会载入 Ajax 的支持文件),其他动作方法不需要载入任何与 Ajax 相关的文件,提高了性能。

客户端需要的 JavaScript 会自动生成



  1. <script language="JavaScript" type="text/javascript">
  2. if (!Object. extend) {
  3.     alert('ERROR: mootools JavaScript framework failed.');
  4. }

  5. function ajax_form_login_onsubmit()
  6. {
  7.     $('loginFailed').setHTML('');
  8.     var myajax = new Ajax(
  9.         '/__personal/magazine/www/index.php?controller=Default&action=OnFormLoginSubmit',
  10.         {
  11.             postBody: this.toQueryString(),
  12.             evalScripts: true,
  13.             update: "loginFailed"
  14.         }
  15.     );
  16.     myajax.request();

  17.     return false;
  18. }

  19. Window.onDomReady(function() {
  20.     $('form_login').addEvent('submit', ajax_form_login_onsubmit)
  21.     $('form_login').onsubmit = function() { return false; };
  22. });

  23. </script>
复制代码



前面是服务端的代码,现在来看看客户端的代码。

客户端主要是模版,其中必须载入 mootools.js 文件:


  1. <script language="JavaScript" type="text/javascript" src="scripts/mootools.js"></script>
  2. <?php $ajax->dumpJs(); ?>
复制代码


mootools.js 文件在 FLEA/Ajax 目录中,需要复制到应用程序的 scripts 目录中。

前面我们为名为 form_login 的表单注册了事件,所以我们的页面里面必须有一个名为 form_login 的表单,不然是不会正确执行的。


  1. <form name="form_login" id="form_login">
  2. ................
  3. </form>
复制代码


表单中增加一个提交按钮,点击后,我们在服务端注册的事件就会执行。

就这么简单?YES

除了注册事件、载入 JS 外,其他工作都由 FleaPHP 完成。

FleaPHP 以前版本中有一个 FLEA/Helper/Html.php 文件,其中有许多生成页面控件(文本框、列表框)的方法。

不过这些方法虽然很容易使用,但是不够灵活,所以现在 FleaPHP 中提供了全新的 WebControls 组件。这个组件自带一组控件,还可以随意扩展。要使用这个组件,预先调用一下 init_webcontrols() 全局函数就可以了。

然后就可以用下面的代码创建各种控件:


  1. <?php webcontrol('textbox', 'username',
  2.     array(
  3.         'class' => 'textbox',
  4.         'size' => 28,
  5.         'maxlength' => 22,
  6.     )
  7. ); ?>
复制代码


这段代码生成下面的 XHTML 代码(不支持 HTML):


  1. <input type="text" name="username" id="username" value="" class="textbox" size="28" maxlength="22" />
复制代码


与以前的 html_textbox() 相比,新的 webcontrols() 函数更灵活,可以为控件指定任意数量的属性。

看一个稍微复杂点的例子:


  1. <?php webcontrol('radiogroup', 'myoption',
  2.     array(
  3.         'items' => array(
  4.             '选项 1' => 1,
  5.             '选项 2' => 2,
  6.             '选项 3' => 3,
  7.             '选项 4' => 4
  8.         ),
  9.         'selected' => 2,
  10.         'class' => 'blue_options',
  11.     )
  12. ); ?>
复制代码


生成的 XHTML 代码如下:


  1. <input type="radio" name="myoption" id="myoption_0" value="1" class="blue_options" /><label for="myoption_0" >选项 1</label><br />
  2. <input type="radio" name="myoption" id="myoption_1" value="2" class="blue_options" /><label for="myoption_1" >选项 2</label><br />
  3. <input type="radio" name="myoption" id="myoption_2" value="3" checked="checked" class="blue_options" /><label for="myoption_2" >选项 3</label><br />
  4. <input type="radio" name="myoption" id="myoption_3" value="4" class="blue_options" /><label for="myoption_3" >选项 4</label>
复制代码


实际效果:


假如是从数据库取出的数据,那么用 array_hashmap() 转换一下记录集,就可以做为 items 属性来显示一个单选按钮组。

另一个例子,显示一个多选框:

  1. <?php webcontrol('checkbox', 'keep_password',
  2.     array(
  3.         'caption' => '记住我的密码',
  4.     )
  5. ); ?>
复制代码


生成的 XHTML 代码如下:


  1. <input type="checkbox" name="keep_username" id="keep_username" value="1" /><label for="keep_username" >在此计算机上保留我的登录信息</label>
复制代码


实际效果:


[ 本帖最后由 dualface 于 2006-12-6 14:52 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-12-06 15:11 |只看该作者
扒了猛顶


-----------------------------------freeagle-鬼鬼

论坛徽章:
0
3 [报告]
发表于 2006-12-09 17:11 |只看该作者
不错,呵呵。

论坛徽章:
0
4 [报告]
发表于 2006-12-09 17:57 |只看该作者
原帖由 guishoudaoge 于 2006-12-6 15:11 发表
扒了猛顶


-----------------------------------freeagle-鬼鬼


流氓

PS:-----后面的东西是什么意思?

论坛徽章:
0
5 [报告]
发表于 2006-12-10 00:07 |只看该作者
用XAJAX比较多。

论坛徽章:
0
6 [报告]
发表于 2006-12-10 11:44 |只看该作者
感觉和xajax很象啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP