FleaPHP 的 Ajax 支持和 WebControls

article/2025/9/12 4:17:19
原文地址: http://www.fleaphp.org/bbs/viewthread.php?tid=40

FleaPHP 现在具有了基本的 Ajax 支持,示例代码如下:

首先在控制器显示模版的动作方法中有如下代码:
     /* *
     * 显示登录界面
     
*/
    
function  actionIndex()
    {
        
$this -> _registerFormEvent( ' form_login ' ,   ' submit ' ,   ' OnFormLoginSubmit ' ,
                
array (
                    
' beforeRequest '   =>   " $('loginFailed').setHTML(''); " ,
                    
' evalScripts '   =>   true ,
                    
' update '   =>   ' loginFailed '
                )
        );
        
$ajax   =&   $this -> _getAjax();

        init_webcontrols();
        
        
include (TPL_DIR  .   ' /Login.php ' );
    }

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

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

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

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

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

     function  actionOnFormLoginSubmit()
    {
        
$username   =   isset ( $_POST [ ' username ' ])  ?   $_POST [ ' username ' :   '' ;
        
$password   =   isset ( $_POST [ ' password ' ])  ?   $_POST [ ' password ' :   '' ;
        
if  ( $username   ==   ' dualface '   &&   $password   ==   ' 123456 ' ) {
            ajax_redirect(url(
' Welcome ' ));
        } 
else  {
            
echo   ' 您输入的用户名或密码不正确 ' ;
        }
    }

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

整个控制器的代码:

class  Controller_Default  extends  FLEA_Controller_Action
{
    
/* *
     * 显示登录界面
     
*/
    
function  actionIndex()
    {
        
$this -> _registerFormEvent( ' form_login ' ,   ' submit ' ,   ' OnFormLoginSubmit ' ,
                
array (
                    
' beforeRequest '   =>   " $('loginFailed').setHTML(''); " ,
                    
' evalScripts '   =>   true ,
                    
' update '   =>   ' loginFailed '
                )
        );
        
$ajax   =&   $this -> _getAjax();

        init_webcontrols();
        
        
include (TPL_DIR  .   ' /Login.php ' );
    }
   
    
function  actionOnFormLoginSubmit()
    {
        
$username   =   isset ( $_POST [ ' username ' ])  ?   $_POST [ ' username ' :   '' ;
        
$password   =   isset ( $_POST [ ' password ' ])  ?   $_POST [ ' password ' :   '' ;
        
if  ( $username   ==   ' dualface '   &&   $password   ==   ' 123456 ' ) {
            ajax_redirect(url(
' Welcome ' ));
        } 
else  {
            
echo   ' 您输入的用户名或密码不正确 ' ;
        }
    }
}

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

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

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


function ajax_form_login_onsubmit()
{
    $(
'loginFailed').setHTML('');
    
var myajax = new Ajax(
        
'/__personal/magazine/www/index.php?controller=Default&action=OnFormLoginSubmit',
        
{
            postBody: 
this.toQueryString(),
            evalScripts: 
true,
            update: 
"loginFailed"
        }

    );
    myajax.request();

    
return false;
}


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

</ script >

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

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

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

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

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

< form  name ="form_login"  id ="form_login" >
................
</ form >

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

就这么简单?YES

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

===============================================

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

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

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

<? php webcontrol( ' textbox ' ,   ' username ' ,
    
array (
        
' class '   =>   ' textbox ' ,
        
' size '   =>   28 ,
        
' maxlength '   =>   22 ,
    )
); 
?>

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

< input  type ="text"  name ="username"  id ="username"  value =""  class ="textbox"  size ="28"  maxlength ="22"   />

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

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

<? php webcontrol( ' radiogroup ' ,   ' myoption ' ,
    
array (
        
' items '   =>   array (
            
' 选项 1 '   =>   1 ,
            
' 选项 2 '   =>   2 ,
            
' 选项 3 '   =>   3 ,
            
' 选项 4 '   =>   4
        )
,
        
' selected '   =>   2 ,
        
' class '   =>   ' blue_options ' ,
    )
); 
?>

生成的 XHTML 代码如下:

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

实际效果:



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

另一个例子,显示一个多选框:
<? php webcontrol( ' checkbox ' ,   ' keep_password ' ,
    
array (
        
' caption '   =>   ' 记住我的密码 ' ,
    )
); 
?>

生成的 XHTML 代码如下:

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

实际效果:



==================================

Ajax 支持和 WebControls 将在 FleaPHP 1.0.70 版本中发布。

目前的开发进度请参考: http://www.qeeyuan.com:8090/browse/FLEA?report=com.atlassian.jira.plugin.system.project:roadmap-panel

http://chatgpt.dhexx.cn/article/XMv6ncou.shtml

相关文章

实际采用 FleaPHP 的网站

下面都是采用 FleaPHP 框架开发的网站列表&#xff0c;如果发现无效连接请在留言。 如果你有采用 FleaPHP 开发的网站&#xff0c;并且愿意公开网址&#xff0c;可以发邮件到 dualface (at) gmail.com 需要提供的信息包括网站名称和连接地址&#xff0c;以及简单的介绍文字。…

获取和安装 FleaPHP

目前 FleaPHP 还处于开发中&#xff0c;您应该经常访问该页面&#xff0c;下载最新版本的 FleaPHP&#xff0c;或者通过 Subversion 仓库直接更新本地的 FleaPHP 代码。 FleaPHP 完全版和 FleaPHP runtime 核心合计下载次数已经超过 2000 次。 下载 FleaPHP 如果无法使用 Sub…

关于 FleaPHP

FleaPHP 并不是心血来潮的结果&#xff0c;而是作者在 Web 开发中不断探索的成果。虽然 FleaPHP 缺乏 Zend Framework 那样巨大的号召力&#xff0c;也没有 CakePHP 和 Symfony 那样庞大的社区。但 FleaPHP 仍然是一个值得你花时间去了解、去学习的框架。 FleaPHP 的设计目标 F…

http头部content-type与数据格式

http 头部中的 content-type 和我们传递的数据是息息相关的&#xff0c;不同的取值&#xff0c;服务器解析处理方式不同&#xff0c; 介绍一下几种常见的方式 text/plain&#xff1a;ajax默认方式&#xff0c;将文件设置为纯文本的形式&#xff0c;浏览器在获取到这种文件时…

http 协议中的content-type

content-type可以位于请求头、响应头&#xff0c;分别代表&#xff1a; Request头&#xff1a;请求的与实体对应的MIME信息&#xff08;post请求时的请求体&#xff09;Response头&#xff1a;返回内容的MIME类型 由于http1.0版规定&#xff0c;头信息必须是 ASCII 码类型&am…

contentType的类型及其在上传下载的例子

content-type之上传下载 下载 Content-Type 实体头部用于指示资源的MIME类型&#xff0c;在响应中&#xff0c;Content-Type标头告诉客户端实际返回的内容的类型。 Content-Disposition 是 MIME 协议的扩展&#xff0c;通常用在下载文件时&#xff0c;是下载文件的一个标识字…

Http中Content-Type等属性详解

前言 一直以来对HTTP请求中各种属性一知半解,偶然在博客中找到一篇,特意摘录过来方便自己以后查看. 正文 敬请关注博客&#xff0c;后期不断更新优质博文&#xff0c;谢谢 这里讲解Content-Type的可用值&#xff0c;以及在spring MVC中如何使用它们来映射请求信息。 1. Con…

HTTP首部——Content-Type的作用

前言 对于我们习以为常的东西&#xff0c;却没有仔细思考它的作用。 HTTP的首部都各有个的价值&#xff0c;最近看到这个Content-Type&#xff0c;忽然让我想起来以前自己的一个小小的失误&#xff0c;而产生了一个bug。但是当时却搞得我焦头烂额&#xff0c;我在网络上查找了一…

http(S)系列之(一):概念

参考文章&#xff1a; HTTP & HTTPS网络协议重点总结&#xff08;基于SSL/TLS的握手、TCP/IP协议基础、加密学&#xff09; 一篇比较全的HTTP协议详解 记&#xff1a;千万别误会&#xff0c;本章是完全ctrlc然后ctrlv&#xff0c;知识理解才是最重要&#xff0c;不必要在…

http 协议之 Content-Type

Content-Type 字段是 http 服务端返回给客户端时&#xff0c;head 里面带上的&#xff0c;这个字段表明服务端返回给客户端的 body 是什么类型的&#xff0c;然后客户端就可以根据这个类型进行文件处理。如浏览器客户端&#xff0c;针对 text/html 类型时&#xff0c;是直接显示…

Http中的Content-Type详解

Content-Type Content-Type&#xff08;MediaType&#xff09;&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

HTTP(S)协议详解

1 什么是协议 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。 粗俗理解协议就是 比如你的电脑和我的电脑要通信&#xff0c;&a…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…

tomcat修改jdk配置两种方法

由于一个电脑多个项目,可能会使用多个版本的jdk,所以在跑tomcat的时候,可以自定义配置的各项目所使用的jdk 配置步骤(window设置): 1. 在catalina.bat找到如下代码: echo Using JAVA_HOME: “%JAVA_HOME%” 替换成 echo Using JAVA_HOME: “E:\Company\Tool\jdk1.7.0_13” 如…

linux下jdk配置

一、jdk下载 jdk下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/ 二、配置环境变量 1、解压 tar -xvf jdk-11.0.13_linux-x64_bin.tar.gz 2、配置环境变量 修改/etc/profile文件 vim /etc/profile 文件末尾添加 #jdk JAVA_HOME/usr/local/a…

Mac多JDK配置

Mac多JDK配置 开发环境有时候需要配置多个JDK&#xff0c;Windows下配置比较方便&#xff0c;Mac环境下稍微有点曲折 下载对于的JDK 这里我以JDK8、JDK11为例&#xff0c;可以从oracle官网下载&#xff0c;也可以从国内源下载,比如华为源 直接安装后 执行如下命令可以快速…

eclipse及jdk配置

JDK(Java Development Kit)是Sun Microsystems针对Java开发员的产品。自从Java推出以来&#xff0c;JDK已经成为使用最广泛的Java SDK。JDK 是整个Java的核心&#xff0c;包括了Java运行环境&#xff0c;Java工具和Java基础的类库。JDK是学好Java的第一步。而专门运行在x86平台…

JDK配置Path的详细教程(包教包会)

在教程之前,先提示一下,新版本的JDK(比如17)是不需要我们配置的,因为我们在下载的时候已经自动给我们配置了,但是老版本(比如JDK8)是需要我们自己去配置的 OK,进入正题,我们先来说一下为什么要给jdk配置path环境? 首先,我们需要清楚的是jdk是java的开发工具,运行一个java程序…

多jdk配置

1.这里默认安装好jdk8和对应的环境变量,本文我们把jdk8的环境修改为jdk17(安装jdk17&#xff0c;下载安装版jdk17一直点下一步就行&#xff0c;没有好讲的) 2.系统CLASSPATH变量值为(下面都是在系统变量位置进行操作): .;%JAVA_HOME%\bin;%JAVA_HOME%\lib\tools.jar;%JAVA_HO…