Se você ainda não leu CRUD com Flex e Zend_AMF – Parte 1, leia agora
Agora que nossa conexão foi estabelecida, podemos começar a adicionar registros. Esta é a nossa primeira tarefa, e para isso precisamos criar um formulário de entrada de dados. Geralmente os formulários de entrada de dados são feitos em uma popup, e vamos seguir esta regra, ok?
Crie um novo MXML Component, chamado: PessoaForm.mxml, conforme a imagem a seguir:
O código inicial deste componente está a seguir:
<?xml version="1.0" encoding="utf-8"?>
<s:TitleWindow xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="300" height="150"
title="Pessoa"
close="{PopUpManager.removePopUp(this)}"
>
<s:layout>
<s:VerticalLayout/>
</s:layout>
<fx:Declarations>
<!-- Place non-visual elements
(e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
<![CDATA[
import mx.managers.PopUpManager;
import spark.components.PopUpAnchor;
]]>
</fx:Script>
<mx:Form width="100%" height="100%">
<mx:FormItem label="Nome:" width="100%">
<s:TextInput id="nome" width="100%"/>
</mx:FormItem>
<mx:FormItem label="Email:" width="100%">
<s:TextInput id="email" width="100%"/>
</mx:FormItem>
</mx:Form>
<s:controlBarContent>
<s:HGroup horizontalAlign="right" width="100%">
<s:Button id="btnOk" label="OK"/>
<s:Button id="btnCancelar"
label="Cancelar"
click="{PopUpManager.removePopUp(this)}"/>
</s:HGroup>
</s:controlBarContent>
</s:TitleWindow>
Neste código criamos um form com dois campos, mais os botões ok e cancelar. Até aqui nada de mais. O botão cancelar remove o popup, pois este TitleWindow será um popup.
Voltando à aplicação principal, temos que criar o botão que irá abrir este TitleWindow. Alterando o código da aplicação (Parte 1), temos:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600">
<fx:Declarations>
<mx:RemoteObject id="RemotePessoas"
destination="zend"
source="Pessoas">
<mx:method name="TesteConexao"
result="OnTestConexaoOk(event)"/>
</mx:RemoteObject>
</fx:Declarations>
<fx:Script>
<![CDATA[
import forms.PessoaForm;
import mx.controls.Alert;
import mx.managers.PopUpManager;
import mx.rpc.events.ResultEvent;
public function OnTestConexaoOk(event:ResultEvent):void
{
Alert.show(event.result.toString());
}
]]>
</fx:Script>
<s:Button label="Adicionar Pessoa" top="10" left="10">
<s:click>
<![CDATA[
var p:PessoaForm = new PessoaForm();
PopUpManager.addPopUp(p,this,true);
PopUpManager.centerPopUp(p);
]]>
</s:click>
</s:Button>
</s:Application>
O botão “Adicionar Pessoa” da aplicação principal abre uma popup, exibindo o formulário abaixo:

Agora podemos voltar ao código do formulário e adicionar a funcionalidade de “adicionar pessoa”. Para isso usamos o RemoteObject. O código do arquivo PessoaForm.mxml fica assim:
...
<fx:Declarations>
<mx:RemoteObject id="pessoaRemote"
destination="zend"
source="Pessoas"
showBusyCursor="true"
>
<mx:method name="Inserir"
result="OnInserir(event)"
fault="OnFault(event)"
/>
</mx:RemoteObject>
</fx:Declarations>
...
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.managers.PopUpManager;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import spark.components.PopUpAnchor;
protected function OnInserir(event:ResultEvent):void
{
PopUpManager.removePopUp(this);
}
protected function OnFault(event:FaultEvent):void
{
Alert.show(event.message.toString(), "ERROR");
}
]]>
</fx:Script>
....
<s:Button id="btnOk" label="OK">
<s:click>
<![CDATA[
pessoaRemote.Inserir(nome.text,email.text);
]]<
</s:click>
</s:Button>
As mudanças no código são relativas ao RemoteObject, que possui o método inserir, disparado pelo click do botão. O método inserir deve ser criado no arquivo pessoas.php, conforme o código a seguir:
<?php
class Pessoas
{
var $db;
function __construct()
{
$this->db = new Zend_Db_Adapter_Pdo_Mysql(array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => '',
'dbname' => 'flexcrud'
));
}
function TesteConexao()
{
return "OK";
}
function Inserir($nome,$email)
{
$data = array('nome'=>$nome,'email'=>$email);
$this->db->insert('pessoas',$data);
return $this->db->lastInsertId();
}
}
Neste momento já podemos testar a aplicação. Caso dê algum erro, verifique o log de erros em c:wamplogsapache_error.log. Mas olhando o código do arquivo pessoas.php, podemos notar que ele tem um problema. Os parâmetros de conexão estão dentro da classe pessoas. Fiz isso de propósito, para mostrar que temos que ter uma visão crítica do nosso código, sempre que possível. Já imaginou termos 10 classes e cada uma delas tem as configurações do banco de dados? E se estas configurações mudarem?? Precisaremos alterar as 10 classes.. (eu acho que isso da justa causa hehe).
Para resolver o problema, podemos usar um pouco de orientação a objetos. Vamos criar uma classe chamada “Base”, que contém essa configuração, e fazer a classe Pessoas herdar de Base. Veja:
base.php:
<?php
class Base
{
var $db;
function __construct()
{
$this->db = new Zend_Db_Adapter_Pdo_Mysql(array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => '',
'dbname' => 'flexcrud'
));
}
}
Agora a classe Pessoas fica assim:
<?php
include("base.php");
class Pessoas extends Base
{
function __construct()
{
parent::__construct();
}
function TesteConexao()
{
return "OK";
}
function Inserir($nome,$email)
{
$data = array('nome'=>$nome,'email'=>$email);
$this->db->insert('pessoas',$data);
return $this->db->lastInsertId();
}
}
Desta forma, conseguimos usar a variável $this->db em qualquer classe que herde da classe Base. No próximo artigo da série, iremos criar um datagrid para ver os dados que estão sendo inseridos. Aguardem!!




