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

Динамический Flash: PHP

PHP в действии

В предыдущей лекции вы изучали искусство загрузки данных в фильмы Flash из специально отформатированного текстового файла с использованием нового метода loadVars. Все это очень полезно и нужно, однако в определенный момент понадобится обновить данные в этом текстовом файле. Сейчас единственным способом сделать это является создание новой копии текстового файла. Несмотря на то, что в таком подходе нет ничего непоследовательного, он может стать несколько неудобным при обновлении больших объемов данных. Можно предположить, что должное форматирование данных может стать довольно сложным мероприятием, даже с использованием кодировщика, рассмотренного в "Движемся дальше" .

К счастью, из этого положения есть выход. Вместо обновления текстового файла вручную можно получить специальные программы на стороне сервера для автоматического выполнения этих действий с использованием информации, предоставляемой в виде Flash или стандартного HTML-представления. Примечательно то, что данные программы на стороне сервера могут выполнять все необходимое форматирование перед обновлением текстового файла. Программы на стороне сервера очень полезны!

В данном параграфе мы создадим отдельный фильм Flash, который можно будет использовать для обновления текстового файла для одного из приложений предыдущей лекции. Для этого понадобится сценарий PHP, но так как мы еще не изучали PHP, это может показаться аналогичным ремонту атомной электростанции с помощью отвертки и молотка. Могу вас успокоить: вы не нанесете большого вреда, экспериментируя с PHP, и двигаться мы будем последовательно, шаг за шагом.

Продолжим?

Для забывчивых предлагаю краткий обзор того, как исходное приложение выполняет свою работу.

Для простоты мы используем одно из наиболее простых приложений из последней лекции - приложение "Message of the Day". Мы будем работать с наиболее полной версией этого приложения - с текстом HTML и фотографией.

Итак, если вы помните, код ActionScript для этого примера выглядел так.

messageURL = "message.txt";

myVars = new loadVars(); 
myVars.onLoad = function(success) { 
  if (success) {
    loadMovie(this.photofile, "imgPlace1");
    message = this.message; 
  } else {
    message = "Error loading message";
  } 
};

myVars.load(messageURL);

Мы работаем с переменной message, содержащей текущее сообщение дня, а также с переменной photofile, указывающей изображение, которое должно загружаться в фильм.

Еще одно сообщение дня

Создадим отдельный фильм, предназначенный для обновления текстового файла. Очевидно, мы используем сценарий PHP для непосредственной записи новых данных в текстовый файл (так как Flash не может делать это самостоятельно), однако фильм Flash будет играть роль дружественного интерфейса для всего приложения.

  1. Создайте новый фильм и повторно создайте следующую временную шкалу.
  2. В слое Background нарисуйте какой-нибудь рисунок и добавьте текстовые метки, и затем добавьте в слой Textfields три текстовых поля, чтобы ваше рабочее место выглядело примерно так.

  3. Текстовые поля названы именами message_txt, image_txt и status_txt в порядке сверху вниз.
  4. В слое Buttons создайте кнопки, которые будут использоваться для загрузки и сохранения данных из текстового файла и в него.

    Я здесь просто использую обыкновенные текстовые кнопки. Я присвоил им имена инстансов load_btn и save_btn, и это позволит установить управляющие элементы событий из кадра в слое Actions.

    Теперь перейдем к самой "изюминке" - к работе со слоем Actions. Мы будем последовательно изучать все выполняемые действия, чтобы вы поняли, для чего предназначен каждый фрагмент ActionScript.

    Сначала нужно создать управляющие элементы событий onLoad, которые могут быть присвоены объекту loadVars. На самом деле мы собираемся создать два отдельных управляющих элемента, так как нам нужно выполнять различные действия в зависимости от того, загружаем ли мы или сохраняем текст.

  5. Первой является функция displayMessage, которая будет использоваться при загрузке данных сообщения прямо из текстового файла.
    displayMessage = function (success) { 
      if (success) {
        message_txt.text = this.message;
        image_txt.text = this.photofile;
        status_txt.text = "Data file loaded";
      } else {
        status_txt.text = "Could not load data file";
      }
    };

    Здесь видно, что мы проверяем успешность выполнения операции. Если она была завершена успешно, переменные копируются из объекта loadVars в два текстовых поля, и затем текст состояния устанавливается соответствующим образом. Если возникла ошибка, пользователь информируется с помощью текста состояния.

  6. Переходя к следующему управляющему элементу события, отметим, что он будет использоваться для запроса сценарию PHP на сохранение измененных данных.
    checkSuccess = function (success) {
      if (success && this.result == "Okay") {
        status_txt.text = "Data saved successfully";
      } else {
        status_txt.text = "An error has occurred";
      }
    };

    Эта функция имеет почти такой же формат, как и предыдущая. Однако при детальном рассмотрении можно видеть, что здесь присутствует дополнительная проверка переменной в условной части выражения if. Это необходимо, так как стандартная переменная управляющего элемента дает лишь обозначение того, найден и загружен ли конечный файл. Это подходит для простых текстовых файлов, однако здесь нельзя определить, была ли процедура в сценарии на стороне сервера успешной.

    Для проверки этого мы будем возвращать результирующую переменную из нашего сценария, с обозначением успешного или неудачного завершения операции. Если значением будет Okay, тогда операция выполнилась успешно, и текст состояния настраивается соответствующим образом. Если сценарий не был найден или загружен, или если процедура не удалась по какой-либо причине, пользователь информируется с помощью текста состояния.

  7. Теперь нам нужно установить управляющие элементы onPress кнопок Load и Save. Первой будет кнопка load_btn, и здесь нужно установить соответствующий управляющий элемент события onLoad (displayMessage) и загрузить текстовый файл.
    load_btn.onRelease = function() {
    dataLoader.onLoad = displayMessage; 
    dataLoader.load("message.txt");
    };

    Обратите внимание, что мы еще не создали объект dataLoader (это будет сделано в следующем шаге). Мы будем использовать объект loadVars для загрузки всех данных и вызова PHP-сценария.

  8. Кнопка save_btn немного сложнее, так как нам нужно копировать переменные из текстовых полей в объект dataLoader. Теперь можно установить управляющий элемент и вызвать сценарий PHP.
    save_btn.onRelease = function() {
      dataLoader.message = _root.message_txt.text; 
      dataLoader.photofile = _root.image_txt.text;
    
      dataLoader.onLoad = checkSuccess;
      dataLoader.sendAndLoad("update.php", dataLoader, "POST");
    };

    Если вы раньше не встречали метод sendAndLoad: он позволяет передавать данные сценарию на стороне сервера и считывать возвращенную информацию.

  9. Нам осталось добавить следующий небольшой фрагмент ActionScript, создающий объект dataLoader, который мы только что использовали.
    dataLoader = new loadVars();

    На этом создание фильма Flash завершено. Фильм достаточно прост, но это несколько обманчивое впечатление, так как всю основную работу проделывает PHP-сценарий.

  10. Так как мы еще не изучали ни один сценарий PHP, я просто приведу его целиком. Я добавил некоторые пояснения в конце, однако с помощью комментариев можно вполне разобраться в структуре сценария. Введите этот текст в текстовом редакторе обычного текста, таком как Блокнот, и сохраните его в файле update.php. Убедитесь, что текстовый редактор не добавил свое собственное расширение файла, и, если это произошло, удалите его - оно лишнее.
    <?
    // update.php
    // Flash MX Studio - Steve Webster
    
    // Data file name 
    $datafile = "message.txt";
    
    // Create data string for message
    $data = "&message=" . urlencode($HTTP_POST_VARS['message']);
    
    // Add photofile variable to data string
    $data . = "&photofile=" .x urlencode($HTTP_POST_VARS ['photofile']);
    
    // Open data file in write mode 
    $file = @fopen($datafile, 'w');
    
    // If file not opened... 
    if (!$file) {
      // Report error and exit
      print "&result-Fail";
      exit; 
    }
    
    // Write data string to file and close
    fwrite($file, $data);
    fclose ($file);
    
    // Report success to Flash 
    print "&result=Okay";
    
    ?>
    Пример 16.1.

    Этот сценарий перезаписывает текущее содержимое файла данных со значениями переменных, переданных из фильма Flash. Если сценарий не смог открыть файл данных в режиме правки, в фильм Flash возвращается сообщение об ошибке, и работа сценария прекращается. В противном случае, данные, как и планировалось, перезаписываются.

  11. Вот и все. Теперь нужно отгрузить новые HTML, SWF, message.txt и PHP файлы на веб-сервер в ту же директорию и загрузить новый фильм.

    Помните, что если вы попытаетесь загрузить фильм при отсутствии присвоенных переменным значений в текстовом файле, возникнет ошибка из-за неправильной установки.

    Если вы столкнулись с проблемами записи данных в файл, вам может понадобиться установить права доступа на этот файл, чтобы разрешить сценарию PHP открывать его в режиме записи. Для этого используется команда CHMOD, встроенная в большинство FTP-клиентов. Вы можете найти хорошее руководство по этой теме на сайте www.phpforflash.com.

Игорь Хан
Игорь Хан

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

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

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

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