![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 6
|
Доброго времени суток, уважаемые Знатоки.
Работаю сейчас над флеш версией портфолио а-ля "ЕЖгун". Хочу использовать тот же приём для отображения превьюшек для своих работ. Если вкратце - у меня на сервере лежит папка /portfolio/ с дочерними папками-категориями (Banners, Websites) в каждой из которых размещаются папки-проекты (dir01, dir02 .. dirXX) с описанием проекта, скрином и превьюшкой. внутри папки /portfolio/ сидит мой пхп-скрипт, который выполняет обход вложеных папок и файлов и на их основе формирует XML-описание древа каталогов. В книге Д.Гурского по AS2.0 в главе посвященной XML была заметка, что для объекта во флеш как на примере ниже можно сгенерировать следующее XML-описание. пример: ![]() А как можно выполнить обратное действие? то есть на основе XML-описания воссоздать объект в AS2.0? PS: По задумке, воссоздав объект и перебирая все его свойства циклами, я бы мог по маске передавать пути для загрузки описаний и превьюшек в мой ролик. например: "www.mysite.url/ + portfolio/ + banners/ + dir01/ + prev.jpg" // адрес превьюшки для первой работы из папки-категори Banners - - - дополнительно - - - моё дерево папок: ![]() Cгенерированое скриптом XML-описание этого дерева: <?xml version="1.0" encoding="utf-8"?> <portfolio> <category name="Banners"> <dir01> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir01> <dir02> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir02> <dir03> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir03> </category> <category name="Websites"> <dir01> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir01> <dir02> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir02> <dir03> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir03> </category> </portfolio>
|
|
|||||
|
как вариант запихать этот хмл в компонент Tree, по ходу слегка подправив ( нюансы за бортом, но схема рабочая)
зы: можно не править ХМЛ в AS, а заставит пхп генерить сразу валидный вариант //myTree - компонент Tree на сцене
XML.prototype.ignoreWhite=true;
var dataXML:XML=new XML('<?xml version="1.0" encoding="utf-8"?> <portfolio> <category name="Banners"> <dir01> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir01> <dir02> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir02> <dir03> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir03> </category> <category name="Websites"> <dir01> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir01> <dir02> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir02> <dir03> <file>full.gif</file> <file>info.txt</file> <file>prev.gif</file> </dir03> </category> </portfolio>');
myTree.labelField="name";
var dataXML:XMLNode=dataXML.firstChild;
setNames(dataXML);
function setNames(node:XMLNode){
if(node.nodeName=="file"){
var textNode:XMLNode=node.firstChild;
node.attributes.name=textNode.nodeValue;
textNode.removeNode();
}else{
if(!node.attributes.name) node.attributes.name= node.nodeName;
var nodes=node.childNodes;
for(var i in nodes){
setNames(nodes[i]);
}
}
}
myTree.dataProvider=dataXML;
Последний раз редактировалось silin; 30.10.2007 в 17:55. |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 6
|
Спасибо за ответ, да, разумеется я легко могу избавится от XML-заголовка, и свернуть всё дерево в одну строку для удобства, но насколько я понимаю, (а понимаю я хренова) ваш пример будет формировать несколько иной объект данных. А к большому сожалению структура этого объекта должна быть другой. вот такой:
var portfolio:Object = {Banners:[dir01:[full.gif, info.txt, prev.gif], dir02:[full.gif, info.txt, prev.gif], dir03:[full.gif, info.txt, prev.gif]], Websites:[dir01:[full.gif, info.txt, prev.gif], dir02:[full.gif, info.txt, prev.gif], dir03:[full.gif, info.txt, prev.gif]]} есть точка отправная (xml) и конечная (пример выше), а вот что между ними должно быть, как конкретно эти вот данные выдрать из XML и присвоить их объекту - я не знаю. Буду очень благодарен за рабочий пример с подробными комментариями, потому что сам ни в книге, ни в сетевых исходниках решения своей задачи не нашел(( ![]() |
|
|||||
|
iSextuS, я теперь не вполне понимаю в чем проблема..
т.е. отдать дереву хмл - не вопрос, тогда чего: передать данные из хмл в объект? нарисовать-настроить все? 'рабочий пример с подробными комментариями' чего вы ждете? формулируйте вопрос, но чтоб он не был похож на ТЗ, оно тоже проходит, канеш, но в другом разделе ![]() |
|
|||||
|
Регистрация: Oct 2007
Сообщений: 6
|
блин, да мне просто надо пример, как из хмл-файла вроде моего замутить объект как на примере что я показал
![]() я просто теряюсь - хмл-ка с большим числом вложений, и объект тоже по сути должен быть описан многомерным массивом. - я не знаю как записать все эти данные в объект и правильно распределить их по уровням вложенности) ну епт - ну как дилетант вроде меня может это вам на пальцах объяснить.( |
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
XML без атрибутов:
<root> <firstChild> <firstChild>textNode</firstChild> <secondChild>textNode2</secondChild> </firstChild> <secondChild>textNode3</secondChild> </root> function createObj(currentNode:XMLNode):Object {
if (currentNode.hasChildNodes) {
var currentObj:Object
if (currentNode.firstChild.nodeType == 1) {
currentObj = new Object();
for (var elementNode:XMLNode = currentNode.firstChild; elementNode != null; elementNode=elementNode.nextSibling) {
currentObj[elementNode.nodeName] = arguments.callee(elementNode);
}
} else {
currentObj = currentNode.firstChild.nodeValue;
}
}
return currentObj;
}
XML с атрибутами: <root> <firstChild attr="something"> <firstChild>textNode</firstChild> <secondChild>textNode2</secondChild> </firstChild> <secondChild attr="something2">textNode3</secondChild> </root> function createObj(currentNode:XMLNode):Object {
var currentObj:Object = new Object();
var attributesObj:Object = new Object();
for (var attr in currentNode.attributes) {
attributesObj[attr] = currentNode.attributes[attr];
}
currentObj.attributes = attributesObj;
if (currentNode.hasChildNodes) {
if (currentNode.firstChild.nodeType == 1) {
for (var elementNode:XMLNode = currentNode.firstChild; elementNode != null; elementNode=elementNode.nextSibling) {
currentObj[elementNode.nodeName] = arguments.callee(elementNode);
}
} else {
currentObj.value = currentNode.firstChild.nodeValue;
}
}
return currentObj;
}
Последний раз редактировалось udaaff; 31.10.2007 в 04:20. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
udaaff, я бы не стал юзать callee там, где можно обойтись без него.
|
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Ага, я тоже решил не юзать там, где это возможно из-за того, что она будет вызывать в области видимости объекта arguments, тока забыл уже об этом.
Пример: class MyClass {
private var length : String ;
public function MyClass() {
length = "SomeSting";
__test(4);
}
private function __test(f : Number) : Void {
trace(length)
if(f > 0) arguments.callee(--f)
}
}
|
|
|||||
|
Регистрация: Oct 2007
Сообщений: 6
|
udaaff, а последний код разве для AS2?
|
|
|||||
|
...
модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
|
Да, это AS2. Код написан в классе.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 18:59. |
|
|
« Предыдущая тема | Следующая тема » |
|
|