Как сопоставить класс PHP DateTime с классом ActionScript / Flex Date с помощью Zend Framework AMF

Задний план

Хорошо, я один из тех парней, которые НИКОГДА не задают вопросы и которые обычно могут найти то, что мне нужно, из существующих вопросов или форумов ... но, увы, я потратил последние несколько дней, пытаясь понять это, и придумал очень мало существующей информации.

Я использую Flash Builder 4.6 для PHP Premium для создания приложения Flex, которое использует возможности AMF PHP Zend Frameworks для сопоставления классов из PHP в Flex и использования их в качестве объектов для отправки туда и обратно вместо использования XML или JSON. Прямо сейчас я для простоты делаю все это на одном локальном компьютере.

Проблема

У меня нет проблем с отображением моих собственных пользовательских классов PHP в классы ActionScript / Flex, но я не могу, хоть убейтесь, сопоставить DateTime класс PHP с классом ActionScript Date. Я читал в другом месте, что он автоматически сопоставляет DateTime объекта с Date объектами, но мне так и не удалось заставить его работать.

Как ни странно, я могу заставить его работать, если заменю все экземпляры, в моем случае, valueObjects.DateTime (автоматически сгенерированный класс ActionScript) на Date в классе _Super_Foo.as, который имеет свойство DateTime. Это в основном вынуждает Flex интерпретировать данные этого свойства как Date. Однако, поскольку все _Super_XXX.as файлы являются файлами, автоматически созданными Flex, они перезаписываются каждый раз, когда я обновляю или редактирую ЛЮБУЮ службу PHP, на которую Flex ссылается в Flash Builder.

Замечания

Конечно, я мог бы сделать это быстрым и грязным способом, сохранив переменную в виде строки (она поступает из MySQL в поле DateTime), а затем просто создать несколько функций для преобразования ее в объект Date на стороне клиента, но мне нужно больше постоянное и стабильное решение.

Пример:

<?php
class Foo {  
  public $id; // int
  public $name; // string
  public $date; // DateTime
  public $bar; // custom object
}
?>

следует перейти к --->

package {
  class Foo {
    public var id:int;
    public var name:String;
    public var date:Date; // native class
    public var bar:Bar;
  }
}

но я получаю

package {
  class Foo {
    public var id:int;
    public var name:String;
    public var date:DateTime; // custom class
    public var bar:Bar;
  }
}

Я пробовал такие вещи, как следующее:

  • в файле gateway.php

    $server->setClassMap("Date", "DateTime");
    
  • используя вместо этого объект Zend_Date

    $foo->date = new Zend_Date($blah);        
    
  • и после попытки явно отобразить его

    $server->setClassMap("Date", "Zend_Date");
    
  • изменение, которое я сейчас работаю в файле _Super_Foo.as (который часто переписывается)

    private var _internal_date : valueObjects.DateTime; // custom object
    

    to

    private var _internal_date : Date; // native object
    

    Мне просто нужно, чтобы это делалось автоматически, как я читал.


person walkingbrad    schedule 14.03.2012    source источник
comment
Я всегда использовал временную метку при передаче дат на / с сервера. тогда вы можете просто сказать: new Date(timestamp).   -  person Philipp Kyeck    schedule 14.03.2012
comment
Фу. Хорошо, я решил преобразовать все 50 полей даты и времени, которые я использовал в MySQL, в поля меток времени (изначально думал, что это будет метка времени unix, но это не так, но для этого требуется 4 байта вместо 8). Затем я изменил каждое свойство своего объекта с DateTime на int (что автоматически отражалось в классе AS) и использовал на нем strtotime ($ timestamp). Затем мне просто нужно было отформатировать значения в Flex, умножив их на 1000 (до миллисекунд), и средний уровень удовлетворенности был полным.   -  person walkingbrad    schedule 14.03.2012
comment
Вы можете преобразовать его на уровне PHP и сохранить дату и время в SQL, я не понимаю, почему вы изменили свою БД. И да, отметка времени (миллисекунды) в AS3 - самый надежный способ использовать даты AFAIK.   -  person a.s.t.r.o    schedule 15.03.2012
comment
Ну, я изменил его, как я уже сказал, изначально думая, что метка времени SQL означает простое целочисленное значение. Но я оставил его, потому что он больше не зависит от часового пояса. Однако у меня все еще возникают проблемы с сопоставлением объектов PHP со стандартными / стандартными объектами Flex. Пример: DateTime - ›Date, Zend_Amf_Value_ByteArray -› ByteArray Он продолжает отображать все в пользовательский объект valueObject на стороне Flex, когда я видел, что он работает в другом месте и автоматически отображается в стандартный класс AS.   -  person walkingbrad    schedule 15.03.2012
comment
Я добавил награду за этот вопрос на случай, если вам все еще нужно решение, поскольку я вижу, что оно не решено.   -  person drew010    schedule 23.03.2012
comment
как сказал @pkyeck, хотя я бы также сказал использовать Numbers, а не ints (временные метки представлены в Java как longs - не так уверен в php)   -  person divillysausages    schedule 24.03.2012


Ответы (3)


Что ж, я должен признать, что обычно я использую BlazeDS на Java, а не Zend, но у меня были аналогичные проблемы при передаче объектов Calendar (я хотел предотвратить потерю данных часового пояса). Для этого BlazeDS поддерживает так называемые PropertyProxys, которые представляют собой компоненты, позволяющие взять на себя процесс сериализации / десериализации для определенных типов.

Я предполагаю, что ZEND поддержит подобное. Другим вариантом на самом деле было бы сделать Zend zupport полным типом Flex. Я немного искал, и кажется, что вся терминология в Zend отличается, но я думаю, что эта статья о stackoverflow должна немного объяснить это: пользовательский диспетчер Zend AMF

Крис

person Christofer Dutz    schedule 23.03.2012

По моему опыту, Zend Framework научил меня, что он предлагает множество функций, но во многих случаях они работают не так, как вы ожидаете. Например:

Недавно я работал с ошибкой в ​​«digitalus-cms» (блог-фреймворк, построенный на основе ZF), из-за которого не удавалось публиковать новые статьи с дефисом в названии. Я отследил это до Zend_Form_Element :: filterName. Он использует регулярное выражение, которое соответствует любому символу, который попадает в категорию: [^ a-zA-Z0-9_ \ x7f- \ xff], а затем удаляет его. Это заканчивается удалением дефисов из имен элементов формы, которые оказались причиной ошибки.

Если Zend_Amf или Zend_Date не работают так, как вы хотите, найдите обходной путь, например, передав номер временной метки unix, чтобы все работало так, как должно. После этого вы можете написать класс, расширяющий один из классов Zend. Zend Framework предназначен для расширения, именно так была построена структура, поэтому вы можете самостоятельно исправлять подобные проблемы, чтобы среда вела себя так, как вы хотите. В этом весь смысл оберток. Идите вперед, создайте несколько собственных классов-оболочек и добавьте некоторые методы для взаимодействия с ZF, чтобы вы могли все настроить.

Что касается поиска причины вашей проблемы, все, что я могу вам сказать, это продолжать отладку и изоляцию кода, чтобы вы знали, что вы передаете flex и как гибкие ответы на это. После того, как вы поиграетесь с этим достаточно, я уверен, что вы найдете виновника.

person Ultimater    schedule 29.03.2012

AmfPHP автоматически отображает это. http://www.silexlabs.org/amfphp/

person Marco Aurélio Deleu    schedule 21.02.2013