Inserindo, editando e excluindo registros no banco de dados usando AMFPHP e FLEX 2.0
Posted by: Leonardo França in AMFPHP, ActionScript 3.0, Flash Platform, Flash Remoting, Flex, Principal, RIAAgora 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:
-
public function nomeFunction(arg:*):void{
-
var arg:Array = new Array();
-
gateway.call("classe do AMFPHP.método a ser invocado no AMFPHP",new Responder(nomeResult,onFault),arg);
-
}
-
public function nomeResult(re:*):void{
-
//result
-
}
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:
-
var listenerObject:Object = new Object();
-
listenerObject.change = function(evt) {
-
var id:Number = evt.target.selectedItem.id;
-
campo_nome.text = evt.target.selectedItem.nome;
-
campo_email.text = evt.target.selectedItem.email;
-
campo_tel.text = evt.target.selectedItem.telefone;
-
trace(evt.target.selectedItem.id);
-
}
-
dg.addEventListener("change", listenerObject);
No Flex faremos assim:
-
<mx :TextInput id="nome" text="{dg.selectedItem.nome}"/>
-
<mx :TextInput id="email" text="{dg.selectedItem.email}"/>
-
<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.
-
<?php
-
//arquivo flex.php
-
//devera ser salvo do diretorio flashservices/services
-
class flex{
-
var $host = 'localhost';
-
var $user = 'root';
-
var $database = 'banco';
-
var $pass = '';
-
function flex(){
-
"description" => "Return a list of users",
-
"access" => "remote"
-
),
-
"description"=> "Insere registros no banco de dados",
-
"access"=> "remote",
-
"arguments"=>array ("nome","email","telefone")
-
),
-
"description"=> "Atualiza os registros do banco de dados",
-
"access"=> "remote",
-
"arguments"=>array ("id","nome","email","telefone")
-
),
-
"description"=> "exclui os registros do banco de dados",
-
"access"=> "remote",
-
"arguments"=>array ("id")
-
)
-
);
-
}
-
function getUsers() {
-
$query = "SELECT id,nome,email,telefone FROM usuarios";
-
$ArrayOfUsers[] = $row;
-
}
-
return($ArrayOfUsers);
-
}
-
$nome = $arg[0];
-
$email = $arg[1];
-
$telefone = $arg[2];
-
$query = mysql_query("INSERT INTO usuarios (nome,email,telefone) VALUES ('$nome','$email','$telefone')");
-
return "sucesso";
-
}else{
-
return "error";
-
}
-
}
-
$id = $arg[0];
-
$nome = $arg[1];
-
$email = $arg[2];
-
$telefone = $arg[3];
-
$query = mysql_query("UPDATE usuarios SET nome = '$nome',email = '$email', telefone = '$telefone' WHERE id = '$id'");
-
return "sucesso";
-
}else {
-
}
-
}
-
$id = $arg[0];
-
return "sucesso";
-
}else{
-
return "error";
-
}
-
}
-
}
-
?>
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
Entries (RSS)
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.
Favor desconsiderar a “Obs” e considerar apenas a “Obs2″ acima.
obrigado pela observação, ja mudei no fonte
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(”
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));
}
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?
jf.sal, caso você esteja usando HTTPService, você pode enviar o nome dos objetos como teste[], o ‘[]‘, faz o php interpretar como array.
Como implemento segurança no amfphp ? ja tentei a opção Roles mas mesmo assim o metodo consegue ser acessado. obrogado