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:
[as]
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
}
[/as]
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:
[as]
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);
[/as]
No Flex faremos assim:
[as]
< mx :TextInput id="nome" text="{dg.selectedItem.nome}"/>
< mx :TextInput id="email" text="{dg.selectedItem.email}"/>
< mx :TextInput id="telefone" text="{dg.selectedItem.telefone}"/>
[/as]
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]
< ?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”;
}
}
}
?>
[/php]
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