Опубликован: 07.11.2006 | Доступ: свободный | Студентов: 3406 / 343 | Оценка: 3.94 / 3.71 | Длительность: 37:11:00
Лекция 18:

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 (этот файл также присутствует на компакт-диске).

  1. Для редактирования 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 с файловой структурой текущей директории (".").

  2. Далее мы добавили функцию, отвечающую за публикацию данных в 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))
        {
  3. Необходимо определить путь к элементу текущей директории, и если текущим элементом является файл, создаем узел 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))
    {
  4. Отделяем имя файла от его расширения.
    //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);
  5. После этого нужно создать непосредственно узел, включающий информацию о файле:
    echo "<FILE name=\"$filename\" extension=\"$extension\" />";
    }
  6. Убеждаемся, что директория не является той, в которой мы уже находимся ("."), или той, из которой мы только что пришли (".."), и после этого выводим начальный тег нашего узла категории.
    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 на компакт-диске).

  7. Создайте новый фильм и сохраните его в файле browser.fla. Добавьте на рабочий стол три элемента: два компонента ListBox (список) и динамическое текстовое поле. Одному из компонентов ListBox присвойте имя инстанса directories, а другому - files. Также установите текстовое поле на отображение переменной path (для этого нужно присвоить текстовому полю имя переменной в Property inspector). Мы используем директории для отображения свертываемого иерархического представления структуры директории, которую мы просматриваем. Список files будет содержать файлы, расположенные в выбранной в списке directories директории. Текстовое поле path будет отображать путь из корневой директории в директорию, выбранную в списке directories, аналогично тому, как это реализовано в Windows Explorer.

  8. Теперь перейдем к коду программы. Сначала устанавливаем объект 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'); 
      }
    };
  9. Необходимо уделить некоторое внимание инициализации списка 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); 
    }
Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

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