Neste artigo estarei dando um pequeno exemplo de como você pode fazer uma integração de Flex, PHP e SQlite. Este exemplo é apenas um ponto de partida para você explorar sua criatividade e adentrar nos conceito mais avançados.
Fiz o possível para trabalhar com o código de um forma simples para facilitar o entendimento. Bom chega de papo furado e mãos a obra. O Flex 4 basta uma pequena busca no google e você já consegue baixar, já o PHP e SQlite acho que esse link pode ajudar, um pouco antigo mas te dá o caminho das pedras. Um “pouquinho” de esforço não mata ninguém.
Depois de criar um novo projeto WEB no Flash Builder 4. Você terá o seguinte código.
<?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> <!-- Place non-visual elements (e.g., services, value objects) here --> </fx:Declarations> </s:Application>
Agora vamos adicionar um mx:HTTPService dentro de fx:Declarations. Agora nosso código cresceu um pouco e ficou assim.
<?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:HTTPService id="ControllerUsers" result="ControllerUsersResult(event)" useProxy="false" resultFormat="text" method="POST" /> </fx:Declarations> </s:Application>
É importante que você adicione um id, result no mx:HTTPService conforme o código acima. Ao salvar irá aparecer um erro, mas não se preocupe com ele. Logo está erro irá virar história.
Adicione agora uma tag fx:Script dentro de s:Application onde iremos trabalhar nossas ações. Em fx:Script vamos adicionar alguns funções. ControllerUsersResult essa função irá capturar o resultado do mx:HTTPService e a outra função será InitSystem. Está irá apenas executar algumas ações ao carregar nossa aplicação. Iremos também adicionar duas variáveis e uma delas será Bindable. Vou explicar tudo isso em seguida, mas antes vamos ver como nosso código ficou.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
creationComplete="InitSystem()"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
<fx:Declarations>
<mx:HTTPService id="ControllerUsers" result="ControllerUsersResult(event)" useProxy="false" resultFormat="text" method="POST" />
</fx:Declarations>
<fx:Script>
<![CDATA[
import com.adobe.serialization.json.JSON;
import mx.rpc.events.ResultEvent;
[Bindable]
public var Users:Array;
public var UrlController:String = "http://varaldebits.com.br/sample/flex-php-sqlite/controller.php";
private function InitSystem():void {
ControllerUsers.url = UrlController;
ControllerUsers.send();
}
private function ControllerUsersResult(event:ResultEvent):void {
Users = JSON.decode(String(event.result)) as Array;
}
]]>
</fx:Script>
</s:Application>
Resolvemos aquele erro, não foi? Mas agora apareceu outro erro. Este erro é porque precisamos adicionar dentro da pasta libs o arquivo “corelib.swc“. Estou utilizando JSON para capturar os dados que o PHP irá retornar. Adicione o arquivo na pasta libs e aguarde alguns segundos e… este erro também virou história.
Conforme prometido, vamos agora explicar o código.
Primeiro porque a variável Users é [Bindable] e a UrlController não? A variável Users nós iremos utilizá-la fora da tag fx:Script em um outro componente, que iremos criar ainda já a variável UrlController iremos apenas utilizá-la dentro da tag tag fx:Script.
Na função InitSystem iremos apenas adicionar uma url em nosso mx:HTTPService e enviá-lo. Você precisa adicionar esse função na tag s:Application como creationComplete. Simples assim. Já na função ControllerUsersResult iremos capturar o resultado que foi retornado pelo PHP em formato JSON (iremos ver isto ainda) e converte-lo a um Array adicionando-o dentro da variável Users. Simples assim também.
Tendo explicado isso vamos exibir o Array. Você pode utilizar vários componentes. Neste caso irei utilizar um mx:DataGrid. Logo após a tag fx:Script adicione o seguinte código.
<mx:DataGrid y="10" x="10" dataProvider="{Users}" height="250" width="580" id="DataGridUsers">
<mx:columns>
<mx:DataGridColumn dataField="username" headerText="Nome do Usuário" />
<mx:DataGridColumn dataField="email" headerText="Email" />
</mx:columns>
</mx:DataGrid>
Repare que na tag mx:DataGrid temos o parametro dataProvider com a nossa variável Users. Por isso foi necessário colocá-lo como [Bindable].
Bom com tudo isso a parte do Flex está pronta. Agora vamos para o PHP.
<?php
$kind = isset($_GET["kind"]) ? $_GET["kind"] : "";
switch ($kind) {
case "SQLiteDatabase":
$query = "SELECT * FROM users ORDER BY ID";
$database = "sampleWebOthers.db3";
$db = new SQLiteDatabase($database, 0666);
$results = $db->query($query)->fetchAll();
break;
case "sqlite_open":
$query = "SELECT * FROM users ORDER BY ID DESC";
$database = "sampleWebOthers.db3";
$db = sqlite_open($database, 0666, $error);
$results = sqlite_array_query($db, $query, SQLITE_ASSOC);
break;
default:
$query = "SELECT * FROM users ORDER BY RANDOM()";
$database = "sampleWebPDO.db3";
$dbh = new PDO("sqlite:$database");
$sth = $dbh->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute();
$results = $sth->fetchAll();
}
echo json_encode($results);
?>
Você precisa de tudo isso para que funcione? A resposta é não. Eu fiz desta maneira porque já tive vários problemas com formatos de banco de dados. Alguns bancos de dados só abrem utilizando PDO outro apenas com sqlite_open e outros ainda com SQLiteDatabase, então segue os 3 exemplos para você. Descobrindo o que funciona para você, utilize apenas o que está dentro do case.
// Apenas o SQLiteDatabase":
$query = "SELECT * FROM users ORDER BY username";
$database = "sampleWebOthers.db3";
$db = new SQLiteDatabase($database, 0666);
$results = $db->query($query)->fetchAll();
// Apenas o sqlite_open
$query = "SELECT * FROM users ORDER BY username";
$database = "sampleWebOthers.db3";
$db = sqlite_open($database, 0666, $error);
$results = sqlite_array_query($db, $query, SQLITE_ASSOC);
// Apenas o PDO
$query = "SELECT * FROM users ORDER BY username";
$database = "sampleWebPDO.db3";
$dbh = new PDO("sqlite:$database");
$sth = $dbh->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$sth->execute();
$results = $sth->fetchAll();
Configurado da sua maneira. retorne o resultado como JSON.
echo json_encode($results);
Segue aqui para download e o exemplo online. Adicionei algumas coisa simplesmente para testes.