返回列表 回复 发帖

flash后台数据连接(PHP篇)之php&flash收藏夹---amfphp实现

flash后台数据连接(PHP篇)之php&flash收藏夹---amfphp实现

==============================================
继上篇http://space.flash8.net/bbs/thread-330867-1-2.htmlflash(后台数据连接(PHP篇)之php&flash收藏夹) 介绍了amfphp,
想想,还是是加多一篇,当然,这是一个入门级的东西,大虾级的就不要笑话了,
------------------------------------------------------------------------


说明:
======
这里还是使用上一个的例子!用来实现一个收藏夹,改用amfphp来传递数组!

这个例子中,并没有使用mysql,还是使用文本存的数据,下个看样子要写写这些了....


我的设想(流程):[与上例有改动]
=================
1> 写入操作:填好数据到表单中,点按钮保存 -> 透过amfphp 呼叫php类中的函数append()直接写入文件favorite.dat中

2> 读数据: 点刷新按钮 -> 通过amfphp读取全部的数据(数据还是上个例子一样,只是有一些差别) -> 返回到flash TextArea中,(因为TextArea支持简单的HTML,当然也包括<a href..>)

3> 删除:留给你的作业!:-)


我的一些理解
============

使用amfphp的理由,就是可以直接呼叫php中的类的函数
一般这样:

新建一个service

_global.svc = new Service(  
  "http://localhost/amfphp/gateway.php",
   myLogger,
   "favorite",
   null,
   null);

这里就可以使用
这里有我的php文件名是:favorite.php,其里面类的名称也是 class favorite{}

然后:
就可以
var pcendingCall = svc.append(webname_txt.text,url_txt.text); //呼叫php中的append方法
pc.responder = new RelayResponder(this, "append_Result", "onError"); <-- 这里有响应append_Result处理,和对应的出错处理

下面有一个函数做为处理
append_Result = function(re:ResultEvent){  //添加按钮响应结果



环境配置
========

一: php
我以本地做解释 apache2+php5,

=================
我用的是绿化版gggAPMserver
这个很方便使用,可以找一下,里面有mysql+php+apache
==================

二: amfphp的使用:
==============

我用的是amfphp-1.1.2
--------------------
1> 到http://www.amfphp.org/下载amfphp

2> 我的是装在D:/gggAPMServer后会在D:中有一个www目录

3> 解压后直接把amfphp放在www目录里,如图

4> 下载本文后的样例tutor_favorite2.rar解压到www目录中

5> 把tutor_favorite2中的(favorite.php),(favorite.dat)两个文件放入amfphp的services目录中

6> 直接访问http://localhost/tutor_favorite2 即可看到效果




好了,开始:

一: 打开上一个案例的favorite.fla,我用这个进行改装 :-)

保持下面几个不变
------------------
1. 一个TextArea -> 我命名为: url_textarea
  这里的属性我设置成了支持HTML,以便我的那些网址可以点击,有人问:为什么不用DataGrid啊,因为我还没有学会用 :-(

2. 二个TextInput -> 命名为 : webname_txt 和 url_txt

3. 三个Button -> 命名为: save_btn 和 refresh_btn

4. 以及几个用作说明的label

-----------------------------

二: 打开代码写上:
  1. import mx.remoting.Service;
  2. import mx.services.Log;
  3. import mx.rpc.RelayResponder;
  4. import mx.rpc.FaultEvent;
  5. import mx.rpc.ResultEvent;
  6. import mx.remoting.PendingCall;
  7. import mx.remoting.debug.NetDebug;

  8. import mx.controls.Alert; //加入Alert,以便弹出一个提示信息

  9. //Initialize a Logger
  10. mx.remoting.debug.NetDebug.initialize(); // initialize the NCD
  11. var myLoggerog = new Log( Log.DEBUG, "logger1" );
  12. // override the default log handler
  13. myLogger.onLog = function( message:String ):Void {
  14. trace( "myLogger-->>>"+message );
  15. }

  16. //设定全局Service
  17. _global.svc = new Service(  
  18.   "http://localhost/amfphp/gateway.php",
  19.    myLogger,
  20.    "favorite",
  21.    null,
  22.    null);

  23. /**
  24. * 设定添加按钮的动作
  25. */
  26. append_btn.onRelease = function(){
  27. var pcendingCall = svc.append(webname_txt.text,url_txt.text); //呼叫php中的append方法
  28. pc.responder = new RelayResponder(this, "append_Result", "onError");
  29. webname_txt.text = url_txt.text = ""; //清空文本框
  30. }
  31. append_Result = function(re:ResultEvent){  //添加按钮响应结果
  32. var id = re.result;
  33. if(id != "error"){
  34.   refresh_data(); //刷新数据
  35.   mx.controls.Alert.show ("保存好了", "Debug Message", Alert.YES, _root, false, "prueba", Alert.OK);
  36. }
  37. else {
  38.   mx.controls.Alert.show ("技术原因未成保存", "Debug Message", Alert.YES, _root, false, "prueba", Alert.OK);
  39. }

  40. }


  41. /***
  42. * 刷新按钮
  43. */
  44. refresh_btn.onRelease = function(){
  45. refresh_data();
  46. }


  47. /**
  48. * 刷新数据
  49. */
  50. function refresh_data(){
  51. var pcendingCall = svc.get_data();
  52. pc.responder = new RelayResponder(this, "getData_Result", "onError" );
  53. }

  54. /***
  55. * 接收数据显示
  56. */
  57. function getData_Result(re: ResultEvent){
  58. url_textarea.text = re.result;
  59. }


  60. /***
  61. * 出错 :-(
  62. */
  63. function onError(rs: FaultEvent){
  64. mx.remoting.debug.NetDebug.trace({level:"None", message:"There was a problem: " + fault.fault.faultstring });
  65. }
  66. refresh_data();  //初始数据
  67. stop();
复制代码
三:写那个favorite.php


我喜欢用的编辑器: editplus 介绍给大家使用
写入代码
  1. <?php

  2. /***
  3. * php & flash 收藏夹 之amfphp实现
  4. *
  5. * 这里要实现的功能是,用flash来展示和通过php来读写文本来
  6. * 实现一个收藏夹的功能
  7. *
  8. * 数据的储存结构
  9. * $name|$url|$date|&|$name|$url|$date....
  10. */


  11. class favorite
  12. {
  13. var $df='favorite.dat'; //存放数据
  14. function favorite(){
  15.   $this->methodTable = array(
  16.    "get_data" => array(
  17.     "description" => "Returns data",
  18.     "access" => "remote",
  19.     "returntype" => "String" //返回数据为字符串
  20.    ),
  21.    "append" => array(
  22.     "description" => "Inserts a Data",
  23.     "access" => "remote",
  24.     "arguments" => array ("name", "url") // 需要两个参数
  25.    ),
  26.   );
  27. }


  28. /**
  29. * 实现添加的功能
  30. * @ $name : 收藏的网站名
  31. * @ $url : 网址
  32. */
  33. function append($name,$url){
  34.   $fp = fopen($this->df,"a+"); //添加模式
  35.   $flag = fwrite($fp,"$name|$url|".time()."|&|"); //添加是否成功?
  36.   fclose($fp);
  37.   return $flag?"":"error";
  38. }


  39. /***
  40. * 实现读取功能
  41. * 返回:数组
  42. */
  43. function get_data(){
  44.   
  45.   $fp = fopen($this->df,'r');
  46.   $tmpdata = fread($fp,filesize($this->df)); //全部读取
  47.   fclose($fp);
  48.   $detail= explode('|&|',$tmpdata); //分解数据
  49.   for($i=0; $i<sizeof($detail)-1; $i++) {
  50.    $out = explode('|',$detail[$i]); //再分一次就可以输出了
  51.    $date=date("Y/m/D",$out[2]); //格式化日期
  52.    $ret_data .= "<a href='$out[1]'>$out[0]</a> - [$date]<br>"; //格式化数据了 <--- 这里与上一个例子不一样
  53.   }
  54.   return $ret_data;
  55. }
  56. }
  57. ?>
复制代码
这里有一点:
这里一这要记得建立一个favorite.dat,因为fopen(fp,'a+') ,这里的a+模式不能新建文件,所以你要建好! :-)


下面是AD:  :-)

http://www.oiasoft.com/ korpton's blog
http://www.celesteteam.com 我的工作组了
谢谢!
另外还有一些数据传递方法:xml_socket,及fms可用,有兴趣可与我一起讨论


预告:

下次写写使用amfphp+mysql

[ 本帖最后由 korpton 于 2007-4-7 22:41 编辑 ]

tutor_favorite2.rar (294.65 KB)

http://www.oiasoft.com

http://www.celesteteam.com/
前辈您好,
我照您的方法做了,发现有几个小问题想请教。

我可以调用php端的函数了,可为什么返回的总是".....No properties"呢?
详细的信息请看NCD中的内容:
1,
MethodName: "favorite.get_data"
Parameters (object #2)
.....No properties

2,
MethodName: "favorite.append"
Parameters (object #2)
.....[0]: "asf"
.....[1]: "dgf"
还有这局:
$fp = fopen($this->df,"a+"); //添加模式

我们的数据文件不是favorite.dat 么?怎么这里的是 df  ?

是不是大大写错了?

o , 我看到前面有全局声明了  --_--
var $df=’favorite.dat’; //存放数据

[ 本帖最后由 寄生幻想 于 2007-4-17 10:45 编辑 ]
哎,在目录里加了个df.dat, 结果还是

MethodName: "favorite.get_data"
Parameters (object #2)
.....No properties

郁闷啊~~~ :'(
还有个问题就是
pcendingCall.responder = new RelayResponder(this, "append_Result", "onError");

不管是 append_Result 还是 onError ,
都不能被正常触发.(因为我在这2函数里都做了trace,可都没执行到)

急,请大家帮忙看看啊
返回列表