Я отправляю некоторую информацию с PHP на флеш-память и отправляю другую информацию из PHP обратно в flash. Я отправляю идентификатор пользователя на PHP и отправляю XML-переменную, а также индекс, обратно в Flash.
Flash-код:
var myLoader:URLLoader = new URLLoader();
var myRequest:URLRequest = new URLRequest(/*private info*/);
myRequest.method = URLRequestMethod.POST;
var memberInfo:URLVariables = new URLVariables();
memberInfo.member_id = 1817;
myRequest.data = memberInfo;
myLoader.addEventListener(Event.COMPLETE, onXMLLoad);
myLoader.load(myRequest);
function onXMLLoad(event:Event)
{
var newXML:XML = new XML(event.currentTarget.data.xml);
var index:int = new int(event.currentTarget.data.index);
}
PHP:
$xml = new DOMDocument("1.0");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$presets = $xml->createElement("presets");
$red = $xml->createElement("colors", "0xff0000");
$green = $xml->createElement("colors", "0x00ff00");
$blue = $xml->createElement("colors", "0x0000ff");
$presets->appendChild($red);
$presets->appendChild($green);
$presets->appendChild($blue);
$xml->appendChild($presets);
$index = 3;
echo $xml->saveXML();
echo $index;
Когда я это сделаю, я получаю эту ошибку:
ReferenceError: Error #1069: Property xml not found on String and there is no default value.
Как я могу это исправить? Я думаю, что это связано с тем, что XML фактически является строкой, но я не совсем уверен.
Вот вывод из PHP:
<?xml version="1.0"?>
<presets>
<colors>0xff0000</colors>
<colors>0x00ff00</colors>
<colors>0x0000ff</colors>
</presets> 3
Примечание. Если я удаляю индексную переменную из PHP и просто "xml" как единственное, что отправляется на Flash, я могу получить к ней доступ с помощью "event.currentTarget.data", и он будет работать нормально.
Вспышка:
var myLoader:URLLoader = new URLLoader();
var myRequest:URLRequest = new URLRequest(/*private info*/);
myRequest.method = URLRequestMethod.POST;
var memberInfo:URLVariables = new URLVariables();
memberInfo.member_id = 1817;
myRequest.data = memberInfo;
myLoader.addEventListener(Event.COMPLETE, onXMLLoad);
myLoader.load(myRequest);
function onXMLLoad(event:Event)
{
var newXML:XML = new XML(event.currentTarget.data);
}
PHP:
$xml = new DOMDocument("1.0");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$presets = $xml->createElement("presets");
$red = $xml->createElement("colors", "0xff0000");
$green = $xml->createElement("colors", "0x00ff00");
$blue = $xml->createElement("colors", "0x0000ff");
$presets->appendChild($red);
$presets->appendChild($green);
$presets->appendChild($blue);
$xml->appendChild($presets);
echo $xml->saveXML();
Проблема заключается в вашем выходе из PHP.
Выведенный результат недействителен xml (из-за 3
в конце).
Вот почему он работает, когда вы удаляете индекс.
Чтобы исправить это, либо поместите индекс в xml (как атрибут корневого узла presets
возможно), либо проанализируйте вывод перед преобразованием его в объект XML в AS3, например:
var response:String = event.currentTarget.data;
var index:String = response.substr(response.lastIndexOf(">") + 1);
var newXML:XML = new XML(response.substring(0, response.lastIndexOf(">") + 1));
Если вы хотите иметь доступ к переменным как объекты в свойстве данных (например, например event.currentTarget.data.xml
и event.currentTarget.data.index
, вам необходимо сделать следующее:
Установите свойство dataFormat
URLLoader в URLLoaderDataFormat.VARIABLES
, чтобы он знал, как анализировать ответ как таковой.
Отправьте с PHP строку с переменными в формате url. Таким образом, ваш ответ от php должен выглядеть следующим образом:
xml=<xml></xml>&index=3
Где <xml></xml>
заменяется полным xml. Имейте в виду, что все данные должны будут следовать правилам форматирования переменных URL- rawurlencode
, поэтому вам может понадобиться использовать escape
(или rawurlencode
в PHP) и unescape
(в AS3) для значений
вот что я думаю, что php должен выглядеть так:
echo "xml=".$xml->saveXML();
echo "&index=".$index;
Однако проще всего использовать JSON и создать объект в PHP и выполнить echo json_encode(obj)
, затем в flash выполнить var response:Object = JSON.parse(event.currentTarget.data);
loader.data
во флэш-памяти. Если у меня есть две переменные, которые я хочу отправить из PHP во Flash, одна из которых является объектом XML (xml), а другая - целым числом (индексом), могу ли я получить доступ к этим элементам отдельно через Flash? (то есть, event.currentTarget.data.xml
, event.currentTarget.data.index
). Я ограничен только доступом к loader.data
в целом?
echo "$xml=$xml->saveXML()";
?
header( "content-type: application/xml; charset=ISO-8859-15" );