7 авг. 2013 г.

Передача данных во Flash через flashvars


Сегодня решил попробовать совместить навыки разработки в 1С и Flash. Простой вывод swf-файла в поле HTML документа 1С не так интересен. Гораздо интереснее было бы реализовать передачу данных из 1С во Flash. Для этого будем использовать параметр flashvars, который можно определить в коде html-страницы.
Для написания кода для Flash проектов я использую IDE FlashDevelop. Если вы решите повторить создание swf-файла с помощью FD, то при установке необходимо будет позволить установщику скачать актуальный FlexSDK. После запуска IDE создаете новый проект "AS3 Project" и заменяете код в созданном файле Main.as на нижеприведенный, после чего можно компилировать проект. Готовый файл будет находиться в подкаталоге /bin проекта. В результате у нас получится swf-файл, содержащий текстовый контейнер, который можно перетаскивать мышкой. При этом он при перетаскивании немного увеличивается в размерах и отбрасывает тень.

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.filters.DropShadowFilter;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    /**
     * ...
     * @author mickey.1cx
     */
    public class Main extends Sprite
    {
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            startTest();
        }
        private function startTest():void
        {
            var container:Sprite = new Sprite;
            var tf:TextField = new TextField();
            tf.autoSize = TextFieldAutoSize.LEFT;
            tf.border = true;
            tf.background = true;
            tf.backgroundColor = 0xfacedd;
            tf.selectable = false;
            container.addChild(tf);
            tf.appendText("params:" + "\n");
            try
            {
                var keyStr:String;
                var valueStr:String;
                var paramObj:Object = loaderInfo.parameters;
                for (keyStr in paramObj)
                {
                    valueStr = String(paramObj[keyStr]);
                    tf.appendText("\t" + keyStr + ":\n" + valueStr + "\n");
                }
            }
            catch (error:Error)
            {
                tf.appendText(error.toString());
            }
            addChild(container);
            container.addEventListener(MouseEvent.MOUSE_DOWN, dragEnable);
            container.addEventListener(MouseEvent.MOUSE_UP, dragDisable);
        }
        private function dragEnable(e:Event):void
        {
            var _target:Sprite = e.currentTarget as Sprite;
            _target.startDrag();
            _target.scaleX = _target.scaleY = 1.25;
            _target.filters = [new DropShadowFilter()];
        }
        private function dragDisable(e:Event):void
        {
            var _target:Sprite = e.currentTarget as Sprite;
            _target.stopDrag();
            _target.scaleX = _target.scaleY = 1;
            _target.filters = [];
        }
    }
}
Теперь создаем обработку. Добавляем макет "flash", тип "Двоичные данные" и загружаем в него созданный swf-файл.


Добавляем макет "html", тип "Текстовый документ", помещаем в него текст html-страницы.
<HTML>
<HEAD>
</HEAD>
<BODY>
    <param name="movie" value="testFlashVars.swf" />
    <param name="quality" value="high" />
    <embed src="testFlashVars.swf" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="800" height="600"
    flashvars=""
    >
    </embed>
</BODY>
</HTML>
Форма обработки будет содержать поле HTML, поле ввода текста для импорта и текст исходной html-страницы.


При открытии обработки swf-файл будет передаваться клиенту и выгружаться во временный файл. Так же, в шаблоне html будет происходить замена путей к этому файлу. При выполнении импорта текста в шаблоне html будет происходить замена данных переменной flashvars и обновление поля HTML документа.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
 
 ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
 ВремХранилище = ПоместитьВоВременноеХранилище(ОбработкаОбъект.ПолучитьМакет("flash"), УникальныйИдентификатор);
 ХТМЛ_Шаблон = ОбработкаОбъект.ПолучитьМакет("html").ПолучитьТекст();
 
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)

 ПодготовитьHTML();
 
КонецПроцедуры

&НаКлиенте
Процедура ПодготовитьHTML()

 ВремFlash = ПолучитьИмяВременногоФайла("swf");
 ФайлFlash = ПолучитьИзВременногоХранилища(ВремХранилище);
 ФайлFlash.Записать(ВремFlash);
 
 ХТМЛ_Шаблон = СтрЗаменить(ХТМЛ_Шаблон, "testFlashVars.swf", ВремFlash);
 ХТМЛ_Строка = ХТМЛ_Шаблон;
 ХТМЛ = ХТМЛ_Шаблон;

КонецПроцедуры

&НаКлиенте
Процедура ПриЗакрытии()
 
 УдалитьФайлы(ВремFlash);
 
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьИмпорт(Команда)
 
 ХТМЛ_Строка = СтрЗаменить(ХТМЛ_Шаблон, "flashvars=" + """" + """", "flashvars=" + """" + "import=" + ТекстИмпорт + """");
 ХТМЛ = ХТМЛ_Строка;
 
КонецПроцедуры 
Запускаем обработку, вводим любой текст и жмем "Выполнить импорт". Введенный текст переносится в текстовый контейнер flash.


Так же можно протестировать перетаскивание мышкой.


И конечно же, сама обработка testFlash.

2 комментария: