Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > KBAC

Оценить эту запись

AMF3 в AMFPHP 1.9

Запись от KBAC размещена 30.08.2011 в 13:38

В очередной раз стал использовать amfphp для связи сайта с админкой. Откопал свои старые наработки и обратил внимание, что во всех своих старых проектах с amfphp я разбираю amf0 объекты (массив массивов). Отчего мне надо было высчитывать номера нужных мне полей, которые я получал.

Ну вот и подумал с чего вдруг в AS3 мне работать со стандартом для AS2?

Начал разбирать. Оказалось, что когда я впервые использовал amfphp мне надо было очень быстро внедрить связку в сайт и поэтому я схватил первый вразумительный пример использования и особо не разбираясь стал его использовать.
В примере использовался класс Amf(исходники выкладываю без зазрения совести, так как и нашёл их в общем доступе):

Код AS3:
package {
	import flash.net.Responder;	
	import flash.net.NetConnection;	
	import flash.utils.Dictionary;	
	/**
	 * @author Pavelk
	 */
	public class Amf {
		private var nc : NetConnection = new NetConnection();
 
		public function Amf() {
			nc.connect("http://sampleamfphp.ru/amfphp/gateway.php");
			nc.objectEncoding=3;
		} 
		public  function toamf(wht:String, cb : Function, ... args) : void {
			var resp:Responder = new Responder(cb, onFault);
			nc.call.apply(null,[wht,resp].concat(args));
		} 	
 
		private function onFault(res:Object):void {
			 trace('к севраку не достучались.',res);
		}
	}		
}
У объекта Amf вызывается метод toamf, следующим образом:

Код AS3:
 var amf:Amf = new Amf();
amf.toamf("amftest.getnews.getnews",onGetNews);
Где соответственно
Код AS3:
"amftest.getnews.getnews"
- путь и имя вызываемой функции,
Код AS3:
onGetNews
- callback метод, принимающий параметр типа Object. Так же можно добавить необходимое количество значений если вызываемая функция принимает какие-то параметры.

При выполнении, метод onGetNews получает объект, в свойстве initialData, которого находится массив со всеми значениями. На лицо Amf0.

Начинаем смотреть что не так. Обратим внимание, что в конструкторе класса Amf указано:
Код AS3:
nc.objectEncoding=3;
— наверняка указываем, что хотим получать Amf3.
Здесь всё правильно, автор хочет чтобы мы получили amf3.

Но смотрим дальше на метод toamf:
Код AS3:
public  function toamf(wht:String, cb : Function, ... args) : void {
	var resp:Responder = new Responder(cb, onFault);
	nc.call.apply(null,[wht,resp].concat(args));
}
Почему-то мы не вызывает nc.call на прямую. Почему? Вызовем на прямую и посмотрим:
Код AS3:
nc.call(wht, resp, args);
Запускаем и... получаем ошибку:
Код AS3:
ArgumentError: Error #2173: Не удается прочитать объект в потоке. В классе flex.messaging.io.ArrayCollection не реализован интерфейс flash.utils.Iexternalizable, но в качестве его псевдонима используется класс с поддержкой внешних связей.
Так. Нам приходит ArrayCollection для Flex – отлично, но чистый AS3 его не ест.

Гуглим. Первое что находим рассуждения в пустоту, вопросы без ответа и крики души, что amfphp не отдаёт нам amf3 пакеты, когда ему возвращают результат SELECT из базы MySQL.

Так... смотрим amfphp/browser/ там то мы получаем и amf0 и amf3 – на выбор!

Значит злобные создатели amfphp не такие негодяи как кажутся. Значит можно вытащить вполне человеческий amf3 объект.

Я стал думать о причинах. Если мы получаем ArrayCollection значит мы где-то создаём ArrayCollection.

Мои догадки подтвердиись. Смотрим файл amfphp/core/amf/io/AMFSerializer.php.
Находим там следующую строчку:
PHP код:
$this->writeAmf3ArrayCollectionPreamble(); 
Та-да! Комментируем её. Билдим проект, скрещиваем пальцы и... получаем AMF3 объект собственной персоной!

Вобщем, судя по гуглу, не мне одному может пригодится то, что описано выше. Поэтому это всё и написано выше.

Welcome!
Всего комментариев 2

Комментарии

Старый 31.08.2011 06:10 Dukobpa3 вне форума
Dukobpa3
 
Аватар для Dukobpa3
Ой как хорошо, возьму на заметку)))) Где ж ты раньше был с такими сообщениями) Сейчас уже неактуально но было дело бился долго) В итоге плюнул и написал класс который мне вот эту пачку массивов переколбашивал в удобоваримый обжект
Старый 31.08.2011 13:40 KBAC вне форума
KBAC
 
Аватар для KBAC
Ну вот и я раньше изворачивался. А потом неактуально было, сейчас подвернулось вот и разобрался. Рад что полезно))
 
Последние записи от KBAC

 


Часовой пояс GMT +4, время: 01:24.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.