Problema

Temos um DateField no Flex e queremos enviar a data selecionada para o PHP como um objeto Date e não somente uma simples string no fomato DD/MM/YYYY. Enviando o objeto Date, teremos o benefício de ter todas as informações de Timezone, GMT e etc para serem manipuladas futuramente via backend.

Solução

Para resolvermos nosso problema, devemos utilizar o Zend Amf para serialização/deserialização de objetos entre Flex e PHP. No Flex simplesmente usaremos a propriedade selectedDate do DateField para selecionarmos o objeto Date e após enviar ao PHP via RemoteObject. O Zend Amf terá o papel de converter este objeto para Zend Date e vice versa.

Explicação Detalhada

Obs.: O ViewSource está habilitado no exemplo abaixo para quem quiser acompanhar melhor esta explicação.

1º – Capturamos o objeto Date pela propriedade selectedDate do DateField e enviamos para o PHP.

FlexPHPDate.mxml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">
   
    <mx:Script>
       <![CDATA[
           import mx.controls.Alert;
           import mx.rpc.events.FaultEvent;
           import mx.rpc.events.ResultEvent;
           
           public function getTimezone():void
           {
               remote.getTimezone(dt.selectedDate);
           }

           public function getTimestamp():void
           {
               remote.getTimestamp(dt.selectedDate);
           }
           
           protected function remote_resultHandler(event:ResultEvent):void
           {
               Alert.show(event.result.toString());
           }

       ]]>
   </mx:Script>
   
    <mx:DateField id="dt" formatString="DD/MM/YYYY" />
   
    <mx:Button label="Get Timezone" click="getTimezone()" enabled="{ dt.selectedDate != null }" />
    <mx:Button label="Get UNIX timestamp" click="getTimestamp()" enabled="{ dt.selectedDate != null }" />
   
    <mx:RemoteObject id="remote" destination="zend" endpoint="../gateway.php"
                    source="DateService"
                    result="remote_resultHandler(event)"/>
   
</mx:Application>

2º – Recebemos o objeto Date no PHP já convertido para Zend_Date. Isso é feito automaticamente pelo Zend_Amf.

DateService.php (está localizando dentro da pasta /services/)

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
class DateService
{
    public function getTimezone(Zend_Date $date)
    {
        return $date->getTimezone();
    }
   
    public function getTimestamp(Zend_Date $date)
    {
        return $date->getTimestamp();
    }
}

Exemplo da Solução: Ao selecionarmos a data e selecionando Get Timezone, mandaremos para o PHP o objeto Date e após o PHP enviará para nós um timestamp desta data atravéz do Zend_Date. Acontece o mesmo para Get UNIX Timestamp.

Baixe aqui o projeto Flex incluindo o PHP: FlexPHPDate.zip

Observações Finais

Esta prática é interessante para manipularmos o mesmo objeto Date de uma linguagem para outra, com várias informações de Timezone, GMT e etc, como citados acima.

Abraços a todos e até o próximo Fiel Cookbook.