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:
- 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(){
- $this->methodTable = array(
- "getUsers" => array(
- "description" => "Return a list of users",
- "access" => "remote"
- ),
- "setRecords"=> array(
- "description"=> "Insere registros no banco de dados",
- "access"=> "remote",
- "arguments"=>array ("nome","email","telefone")
- ),
- "updateRecords"=> array(
- "description"=> "Atualiza os registros do banco de dados",
- "access"=> "remote",
- "arguments"=>array ("id","nome","email","telefone")
- ),
- "delRecords"=> array(
- "description"=> "exclui os registros do banco de dados",
- "access"=> "remote",
- "arguments"=>array ("id")
- )
- );
- $this->conexao = mysql_connect($this->host,$this->user,$this->pass);
- mysql_select_db($this->database);
- }
- function getUsers() {
- $query = "SELECT id,nome,email,telefone FROM usuarios";
- $result = mysql_query($query);
- while ($row = mysql_fetch_object($result)) {
- $ArrayOfUsers[] = $row;
- }
- return($ArrayOfUsers);
- }
- function setRecords($arg=array()){
- $nome = $arg[0];
- $email = $arg[1];
- $telefone = $arg[2];
- $query = mysql_query("INSERT INTO usuarios (nome,email,telefone) VALUES ('$nome','$email','$telefone')");
- if (!mysql_error()) {
- return "sucesso";
- }else{
- return "error";
- }
- }
- function updateRecords($arg=array()){
- $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'");
- if (!mysql_error()) {
- return "sucesso";
- }else {
- return mysql_error();
- }
- }
- function delRecords($arg=array()){
- $id = $arg[0];
- $query = mysql_query("DELETE FROM usuarios WHERE id = '$id' LIMIT 1");
- if (!mysql_error()) {
- 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
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