у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет. Вопрос знатокам, что не так? |
XML
Динамически управляемое XML содержимое
Многие из нас проводят часы за компьютером, стараясь улучшить организацию веб-сайтов. Как правило, у нас есть довольно четкое представление о том, как будут работать средства навигации, но способ организации категорий и их просмотр часто представляют собой нечто ужасное. Отделив организацию информации от ее отображения, можно легко изменить способ доступа к информации. Это можно сделать, не возвращаясь к модификации клиента (или клиентов) Flash.
Ниже приведен пример того, как может выглядеть простая организация.
<? xml version='1.0' encoding='ISO-8859-1' ?> <NAVIGATION> <FILE name='contents' extension='php'/> <FILE name='browser' extension='swf'/> <FILE name='browser' extension='fla'/> <FILE name='index' extension='php'/> <CATEGORY name='resume'> <FILE name='resume' extension='html'/> </CATEGORY> <CATEGORY name='portfolio'> <CATEGORY name='studentWork'> <FILE name='caffeine' extension='swf'/> <FILE name='lust' extension='swf'/> <FILE name='Iust2' extension='jpg1/> <FILE name='duchamp' extension='swf'/> <FILE name='beer' extension='swf'/> <FILE name='korea' extension='jpg'/> <FILE name='malevich' extension='swf'/> </CATEGORY > <CATEGORY name='professionalWork'> <CATEGORY name='webWork'> <FILE name='rhino' extension='swf'/> <FILE name='tokyo' extension='swf'/> </CATEGORY > <CATEGORY name='printWork'> <FILE name='tecn' extension='jpg'/> <FILE name='vao' extension='jpg'/> </CATEGORY > </CATEGORY > </CATEGORY > </NAVIGATION >Пример 17.1.
Здесь есть категория resume с документом-резюме и категория portfolio, разбитая на две подкатегории: studentWork и professionalWork. Легко представить, что эта структура может расшириться и покрыть собой почти любую организационную структуру. В данном случае она описывает такой набор файлов и папок.
Создание обозревателя во Flash с помощью PHP и XML
Документ XML может автоматически генерироваться сценарием PHP, выполняющимся на сервере. PHP будет считывать содержимое вашей папки и, в зависимости от файлов и директорий, сгенерирует представляющий их документ XML. Flash будет запрашивать сервер на файл PHP, но получит не полный код, а документ, созданный кодом. Останется только скопировать новый файл в категорию (директорию), и сценарий предоставит обновленную структуру навигации. Добавьте директорию experiments со всеми вашими проектами, требующими доработки, и при следующем запросе структуры навигации они будут отображены. Таким образом, сервер сам проделывает работу по обновлению вашего сайта.
Для обеспечения работы PHP-сценариев нужно обеспечить доступ к серверу, на котором выполняется PHP. Если у вас нет своего сервера, вы можете настроить в качестве него ваш собственный компьютер, получив все необходимое для этого с сайтов www.apache.org и www.php.net. Вы также можете написать "ложный" PHP-сценарий, создав текстовый файл, содержащий документ XML. Можно скопировать простую организацию XML из начала этого параграфа в файл с именем contents.php (этот файл также присутствует на компакт-диске).
- Для редактирования PHP откройте текстовый редактор. Сначала рассмотрим PHP-сценарий, создающий документ навигации.
<?php //tell our client that it's receiving XML header("Content-Type: text/xml"); //tell the parser that it is receiving XML. This lets us К//look at it in an Explorer window echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"; //get the time on the server $time = time(); //print the starting tag for our root node echo "<NAVIGATION>"; //"." Represents the current directory on servers //this function will print everything inside our root node printFileStructure("."); //print the ending tag of our root node echo "</NAVIGATIONS";
В первой части сценария мы сообщили клиенту, что он получает XML, а также указали тип XML для программы-считывателя. После этого выводим узел NAVIGATION с файловой структурой текущей директории (".").
- Далее мы добавили функцию, отвечающую за публикацию данных в XML. Если возможно открыть директорию, представленную путем $inDir, записываем его перед прохождением через каждый элемент (директорию или файл) в текущей директории.
function printFileStructure($inDir) { //if we are able to open the directory at the specified //path then we will write its contents if ($currentDirectory = opendir($inDir)) { //go through each file and sub-directory in the //directory while ($dirElement = readdir($currentDirectory)) {
- Необходимо определить путь к элементу текущей директории, и если текущим элементом является файл, создаем узел FILE.
//build the path to each contained element by adding К//a slash followed by its name to the end of the path $pathToElement = $inDir . "/" . $dirElement; //deal with files differently from the directories if (is_file($pathToElement)) {
- Отделяем имя файла от его расширения.
//determine the position of the dot in the file name $dotposition = strpos($dirElement, "."); //the characters before the dot are the file name $filename = substr($dirElement, 0, $dotposition); //the characters after the dot are the extension $extension = substr($dirElement, 1 + $dotposition);
- После этого нужно создать непосредственно узел, включающий информацию о файле:
echo "<FILE name=\"$filename\" extension=\"$extension\" />"; }
- Убеждаемся, что директория не является той, в которой мы уже находимся ("."), или той, из которой мы только что пришли (".."), и после этого выводим начальный тег нашего узла категории.
else if($dirElement != "." && $dirElement != "..") { //open a CATEGORY node to store any sub-CATEGORY //nodes and file nodes in echo "<CATEGORY name=\"$dirElement\">"; //call the funtion we wrote to fill in all the //subdirectories printFileStructure($pathToElement); //close the CATEGORY node echo "</CATEGORY>"; } } closedir($currentDirectory); } } php?>
Действие функции сводится к прохождению всех файлов директории и последующей записи в узел некоторой полезной информации о каждом файле. При обнаружении директории вызывается функция для ее поддержки. Она рекурсивно вызывает сама себя, "копаясь" в директориях, что автоматически создает список содержимого текущей директории, а также ее поддиректорий.
Теперь приступим к созданию Flash-браузера (файл browser.fla на компакт-диске).
- Создайте новый фильм и сохраните его в файле browser.fla. Добавьте на рабочий стол три элемента: два компонента ListBox (список) и динамическое текстовое поле. Одному из компонентов ListBox присвойте имя инстанса directories, а другому - files. Также установите текстовое поле на отображение переменной path (для этого нужно присвоить текстовому полю имя переменной в Property inspector). Мы используем директории для отображения свертываемого иерархического представления структуры директории, которую мы просматриваем. Список files будет содержать файлы, расположенные в выбранной в списке directories директории. Текстовое поле path будет отображать путь из корневой директории в директорию, выбранную в списке directories, аналогично тому, как это реализовано в Windows Explorer.
- Теперь перейдем к коду программы. Сначала устанавливаем объект XML. Мы создаем объект, обеспечиваем игнорирование им отступов, а также указываем действия по завершении загрузки документа XML, определив функцию. Эта функция добавляет запись в список directories, представляющую корень нашего документа. Затем списку directories сообщается, что новая запись выделена. Введите следующий код в кадр 1 слоя по умолчанию.
//create new XML object var fileStructDoc = new XML(); //tell our XML object to ignore any whitespace fileStructDoc.ignoreWhite = true; //write a handler to deal with our XML document once we get it fileStructDoc.onLoad = function( success) { if( success) { //store the root of the XML document var docRoot = fileStructDoc.firstChild; //add an entry to our directory list representing the root directories.addltem('root', docRoot); //tell directories to select the root entry directories.setSelectedlndex(0); } else { //handle failure trace('failure: fileStructDoc.onLoad'); } };
- Необходимо уделить некоторое внимание инициализации списка directories перед тем, как он начнет функционировать.
//set up a function to handle user input when it happens directories.setChangeHandler ('handleDirectoriesSelection'); function handleDirectoriesSelection(component) { var item = component.getSelectedltem().data; var index = component.getSelectedlndex(); //close open directories, open closed directories toggleDirectory(item, index); //display files from selected directory in 'files' ListBox displayFiles(item); //update the path of our new directory updatePath(item); }