Inserindo, editando e excluindo registros no banco de dados usando AMFPHP e FLEX 2.0

Agora que sabemos como passar argumentos do Flex para o AMFPHP, ficou bem facil adaptar o meu artigo escrito anteriormente sobre como inserir, editar e excluir registros do banco dados usando o AMFPHP com Flash e comparar como ficou a versão em FLEX 2.0 e FLASH

Na versão para Flex 2.0, o que faremos simplesmente é adicionar algumas funções para mandar os parametros para o AMFPHP e recebe-los de volta para preencher a datagrid usando basicamente esse modelo:

ActionScript

  1. public function nomeFunction(arg:*):void{
  2.        var arg:Array = new Array();
  3.            gateway.call("classe do AMFPHP.método a ser invocado no AMFPHP",new Responder(nomeResult,onFault),arg);
  4. }
  5. public function nomeResult(re:*):void{
  6.       //result
  7. }

Ou seja, uma função para “enviar dados” e outra para “receber dados”.

Quando clicamos em alguma linha da Datagrid com id “dg”, os dados da linha devem aparecer nos campos de textos. Para pega-los faremos algo parecido como é feito no Flash.
No Flash seria o seguinte:

ActionScript

  1. var listenerObject:Object = new Object();
  2. listenerObject.change = function(evt) {
  3. var id:Number = evt.target.selectedItem.id;
  4.     campo_nome.text = evt.target.selectedItem.nome;
  5.     campo_email.text = evt.target.selectedItem.email;
  6.     campo_tel.text = evt.target.selectedItem.telefone;
  7.     trace(evt.target.selectedItem.id);
  8. }
  9. dg.addEventListener("change", listenerObject);

No Flex faremos assim:

ActionScript

  1. < mx :TextInput id="nome" text="{dg.selectedItem.nome}"/>
  2. < mx :TextInput id="email" text="{dg.selectedItem.email}"/>
  3. < mx :TextInput id="telefone" text="{dg.selectedItem.telefone}"/>

Segue a nossa classe em PHP a ser utilizada pelo AMFPHP. Lembrando que estamos utilizando o mesmo modelo de banco de dados deste artigo.

  1. < ?php
  2. //arquivo flex.php
  3. //devera ser salvo do diretorio flashservices/services
  4. class flex{
  5.     var $host = 'localhost';
  6.     var $user = 'root';
  7.     var $database = 'banco';
  8.     var $pass = '';
  9.     function flex(){
  10.         $this->methodTable = array(
  11.             "getUsers" => array(
  12.             "description" => "Return a list of users",
  13.             "access" => "remote"
  14.             ),
  15.             "setRecords"=> array(
  16.             "description"=> "Insere registros no banco de dados",
  17.             "access"=> "remote",
  18.             "arguments"=>array ("nome","email","telefone")
  19.             ),
  20.             "updateRecords"=> array(
  21.             "description"=> "Atualiza os registros do banco de dados",
  22.             "access"=> "remote",
  23.             "arguments"=>array ("id","nome","email","telefone")
  24.             ),
  25.             "delRecords"=> array(
  26.             "description"=> "exclui os registros do banco de dados",
  27.             "access"=> "remote",
  28.             "arguments"=>array ("id")
  29.             )
  30.         );
  31.         $this->conexao = mysql_connect($this->host,$this->user,$this->pass);
  32.         mysql_select_db($this->database);
  33.     }
  34.     function getUsers() {
  35.         $query = "SELECT id,nome,email,telefone FROM usuarios";
  36.         $result = mysql_query($query);
  37.         while ($row = mysql_fetch_object($result)) {
  38.             $ArrayOfUsers[] = $row;
  39.         }
  40.         return($ArrayOfUsers);
  41.     }
  42.     function setRecords($arg=array()){
  43.         $nome = $arg[0];
  44.         $email = $arg[1];
  45.         $telefone = $arg[2];
  46.         $query = mysql_query("INSERT INTO usuarios (nome,email,telefone) VALUES ('$nome','$email','$telefone')");
  47.         if (!mysql_error()) {
  48.             return "sucesso";
  49.         }else{
  50.             return "error";
  51.         }
  52.     }
  53.     function updateRecords($arg=array()){
  54.         $id = $arg[0];
  55.         $nome = $arg[1];
  56.         $email = $arg[2];
  57.         $telefone = $arg[3];
  58.         $query = mysql_query("UPDATE usuarios SET nome = '$nome',email = '$email', telefone = '$telefone' WHERE id = '$id'");
  59.         if (!mysql_error()) {
  60.             return "sucesso";
  61.         }else {
  62.             return mysql_error();
  63.         }
  64.     }
  65.     function delRecords($arg=array()){
  66.         $id = $arg[0];
  67.         $query = mysql_query("DELETE FROM usuarios WHERE id = '$id' LIMIT 1");
  68.         if (!mysql_error()) {
  69.             return "sucesso";
  70.         }else{
  71.             return "error";
  72.         }
  73.     }
  74. }
  75. ?>

Sem misterios, teste você mesmo a aplicação em Flash e em Flex

O código fonte do mxml pode ser encontrado no meu LABS

ActionScript 3.0, AMFPHP, Flash Platform, Flash Remoting, Flex, Principal, RIA

8 comments


  1. Alexandre

    Muito bom o artigo. Tinha tentado, sem sucesso, adaptar o seu artigo anterior para conseguir este mesmo resultado.

    Obs: porque aparece, no fim da tela, as informações do array? Dá pra ocultar isto?

    Obs2: tive que modificar no deleteRegistros, tanto no flex quanto no php, a variável id, mudando de array para int, senão não funcionava a função.

    É isso.

    Valeu!

    Alexandre.

  2. Alexandre

    Favor desconsiderar a “Obs” e considerar apenas a “Obs2” acima.

  3. obrigado pela observação, ja mudei no fonte 😉

  4. Alexandre

    Cara, desculpe estar te amolando…

    Como disse anteriormente, estou tentando adaptar o teu exemplo, incluindo novas funcionalidades, etc..

    Supondo que eu quero “duplicar” o que você fez, trabalhando com duas tabelas diferentes no bd (tabelas que possuem campos diferentes uma da outra) posso fazer algo como:

    public var dataProvider:*;
    public var dataProvider2:*;
    public var gateway:RemotingConnection;
    public var gateway2:RemotingConnection;
    public function initApplication():void{
    gateway = new RemotingConnection(“http://localhost/amfphp/gateway.php”);
    gateway.call(“flex.getDataSite”,new Responder(onResult,onFault));

    }

    public function initApplicationCat():void{
    gateway2 = new RemotingConnection(“http://localhost/amfphp/gateway.php”);
    gateway2.call(“flex.getCategorias”,new Responder(onResult2,onFault2));
    }

    public function onResult(result:*):void{
    trace(“> onResult(result) “);
    trace(result);
    dataProvider = result;
    //output.text = ObjectUtil.toString(result);
    trace(” onFault(fault) “);
    trace(fault);
    //output.text = ObjectUtil.toString(fault);
    trace(” onResult(result) “);
    trace(result);
    dataProvider2 = result;
    //output.text = ObjectUtil.toString(result);
    trace(” onFault(fault) “);
    trace(fault);
    //output.text = ObjectUtil.toString(fault);
    trace(“

  5. Não seria necessario setar duas variaveis para o RemotingConnection, bastaria chamar na mesma variavel, por exemplo:

    public function initApplication():void{
    gateway = new RemotingConnection(�http://localhost/amfphp/gateway.php�);
    gateway.call(�flex.getDataSite�,new Responder(onResult,onFault));
    gateway.call(�flex.getCategorias�,new Responder(onResult2,onFault2));
    }

  6. jf.sal

    Caro Leonardo

    Muito Obrigado pelo teu post, trabalha na perfeição ando a algum tempo treinando com o post do Mike Potter mas estava incompleto, e estava com dificuldades em gravar dados na BD usando por isso HTTPservice mas agora tenho muita matéria para evoluir atravês do teu post.

    Mil vezes obrigado.

    PS.
    Qual é a forma de gravar multiplos records ao mesmo tempo, como se fosse um shoppingCart?

  7. jf.sal, caso você esteja usando HTTPService, você pode enviar o nome dos objetos como teste[], o ‘[]’, faz o php interpretar como array.

  8. matias

    Como implemento segurança no amfphp ? ja tentei a opção Roles mas mesmo assim o metodo consegue ser acessado. obrogado

Leave a Reply