В предыдущей лекции вы изучали искусство загрузки данных в фильмы 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 будет играть роль дружественного интерфейса для всего приложения.
Я здесь просто использую обыкновенные текстовые кнопки. Я присвоил им имена инстансов load_btn и save_btn, и это позволит установить управляющие элементы событий из кадра в слое Actions.
Теперь перейдем к самой "изюминке" - к работе со слоем Actions. Мы будем последовательно изучать все выполняемые действия, чтобы вы поняли, для чего предназначен каждый фрагмент ActionScript.
Сначала нужно создать управляющие элементы событий onLoad, которые могут быть присвоены объекту loadVars. На самом деле мы собираемся создать два отдельных управляющих элемента, так как нам нужно выполнять различные действия в зависимости от того, загружаем ли мы или сохраняем текст.
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 в два текстовых поля, и затем текст состояния устанавливается соответствующим образом. Если возникла ошибка, пользователь информируется с помощью текста состояния.
checkSuccess = function (success) { if (success && this.result == "Okay") { status_txt.text = "Data saved successfully"; } else { status_txt.text = "An error has occurred"; } };
Эта функция имеет почти такой же формат, как и предыдущая. Однако при детальном рассмотрении можно видеть, что здесь присутствует дополнительная проверка переменной в условной части выражения if. Это необходимо, так как стандартная переменная управляющего элемента дает лишь обозначение того, найден и загружен ли конечный файл. Это подходит для простых текстовых файлов, однако здесь нельзя определить, была ли процедура в сценарии на стороне сервера успешной.
Для проверки этого мы будем возвращать результирующую переменную из нашего сценария, с обозначением успешного или неудачного завершения операции. Если значением будет Okay, тогда операция выполнилась успешно, и текст состояния настраивается соответствующим образом. Если сценарий не был найден или загружен, или если процедура не удалась по какой-либо причине, пользователь информируется с помощью текста состояния.
load_btn.onRelease = function() { dataLoader.onLoad = displayMessage; dataLoader.load("message.txt"); };
Обратите внимание, что мы еще не создали объект dataLoader (это будет сделано в следующем шаге). Мы будем использовать объект loadVars для загрузки всех данных и вызова 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: он позволяет передавать данные сценарию на стороне сервера и считывать возвращенную информацию.
dataLoader = new loadVars();
На этом создание фильма Flash завершено. Фильм достаточно прост, но это несколько обманчивое впечатление, так как всю основную работу проделывает 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 возвращается сообщение об ошибке, и работа сценария прекращается. В противном случае, данные, как и планировалось, перезаписываются.
Помните, что если вы попытаетесь загрузить фильм при отсутствии присвоенных переменным значений в текстовом файле, возникнет ошибка из-за неправильной установки.
Если вы столкнулись с проблемами записи данных в файл, вам может понадобиться установить права доступа на этот файл, чтобы разрешить сценарию PHP открывать его в режиме записи. Для этого используется команда CHMOD, встроенная в большинство FTP-клиентов. Вы можете найти хорошее руководство по этой теме на сайте www.phpforflash.com.