Получение информации о пользователе

Обсуждение и помощь по вопросам взаимодействия с ВКонтакте API в Flash-приложениях (ActionScript)
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

Спасибо, ссылка оказалось очень нужной!

Прочитал урок про взаимодействие создание базы пользователей приложения и ведение статистики посещений и решил пойти дальше:
Создал еще одну кнопку назвал ее create_btn. При ее нажатии должны появиться поля , введя туда значения они должны сохраниться в базе данных.

Код: Выделить всё

 /*подключение библиотек*/import flash.net.URLLoader;    import flash.net.URLRequest;    import flash.net.URLVariables;    import flash.net.URLRequestMethod;    import flash.display.*;    import flash.events.*;    import flash.text.TextField;    import fl.containers.UILoader;    import flash.display.SimpleButton;    import flash.display.BitmapData;    import vk.APIConnection;    import vk.events.*;    import vk.ui.VKButton;    import fl.controls.Button;    import fl.controls.TextArea;    import fl.controls.DataGrid;    import fl.controls.ScrollPolicy;    import fl.data.DataProvider;    import fl.events.ListEvent;    import fl.controls.TextInput;    import fl.controls.Label;    import flash.display.MovieClip;    import flash.text.TextFormat;  /* объявляем глобальные переменные*/ var api_id:Number = 2415040  ;// ID приложенияvar url_loader:URLLoader; var url_request:URLRequest;var viewer_id;               var secret:String;var sid:String;var api_url:String;/*создаем поля */ var bdate_tf:TextField = new TextField(); // поле для отображения даты рожденияvar name_tf:TextField = new TextField();  // поле для отображения имени и фамилииvar result_tf: TextField = new TextField();// поле для отображения информацииvar avatar:UILoader = new UILoader()  ;var auth_key; var namep:TextInput = new TextInput(); //поле для ввода имениvar date_c: TextInput = new TextInput();  // поле для ввода датыvar output : TextArea = new TextArea();     // многострочное текстовое поле с границей и возможностью отображения полос прокруткиvar label_namep: Label = new Label();// отображает одну или несколько строк текста с заданным выравниванием и размеромvar label_date_c: Label = new Label();var createbutton:Button = new Button(); // создаем кнопку //stage - получение напрямую// id просматривающего приложениеviewer_id = stage.loaderInfo.parameters.viewer_id;// secret для генерации сигнатурыsecret = stage.loaderInfo.parameters.secret; // id сессииsid = stage.loaderInfo.parameters.sid;// адрес API-сервисаapi_url = stage.loaderInfo.parameters.api_url;// для тестирования локально, можно прописать их здесь (брать в исходном коде страницы с приложением)/*            viewer_id = '1';            secret = 'NCWvtyB1GV8cz4h54Y9Z';            sid = 'abcd123456abcd123456abcd123456abcd123456abcd123456abcd1234';            api_url = 'http://api.vkontakte.ru/api.php';         */  // вызываем функцию получения профиля пользователя, просматривающего приложениеprofile_btn.addEventListener(MouseEvent.CLICK,getProfile); // событие для кнопки profile_btn function getProfile(e:MouseEvent):void{   trace(viewer_id);   // параметры которые будем передавать в запросе и которые нужны для формирования сигнатуры    // параметры для формирования сигнатуры    var request_params: Object = new Object();    request_params.api_id = api_id;    request_params.method = 'getProfiles';    request_params.format = 'XML';    request_params.v = '3.0';    request_params.fields = 'bdate,photo_big';    request_params.uids = viewer_id;     // параметры для отправки запроса    var variables:URLVariables = new URLVariables();    // часть параметров берем из request_params    for (var j:String in request_params)    {        variables[j] = request_params[j];    }    variables['sid'] = sid;// параметр sid нужно передавать в запросе, но он не используются при создании сигнатуры    variables['sig'] = generate_signature(request_params);// генерируем сигнатуру. Функция generate_signature описана ниже.     // подготавливаем запрос    url_request = new URLRequest(api_url);    // данные будем отправлять POST запросом    url_request.method = URLRequestMethod.POST;    // добавляем параметры в запрос    url_request.data = variables;    // отправляем запрос    url_loader = new URLLoader  ;    url_loader.addEventListener(Event.COMPLETE,onComplete);    url_loader.load(url_request);}  function news(e:MouseEvent):void{     namep.enabled = true;       date_c.enabled = true;       addChild ( namep);        addChild ( label_namep);               addChild ( date_c);        addChild ( label_date_c);        addChild(createbutton)        createbutton.addEventListener(MouseEvent.CLICK,create_complete);  }// запрос выполненfunction onComplete(event:Event):void{    var response:XML = new XML(url_loader.data);     // выводим дату рождения пользователя    var bdate = response..bdate; // объявление переменной    bdate_tf.text = bdate;    bdate_tf.x = 490; // координата поля по х    bdate_tf.y = 380;  // координата поля по у    addChild(bdate_tf); //создаем поле     // выводим имя и фамилию пользователя    name_tf.text = response..first_name + ' ' + response..last_name; //объявление переменной    name_tf.x = 410; //координата поля по х    name_tf.y = 360; // координата поля по у    addChild(name_tf); //создаем поле     // выводим аватарку пользователя    avatar.autoLoad = true;    avatar.scaleContent = false;  // контроль маштабирования     avatar.source = response..photo_big;    avatar.move(175,10);    addChild(avatar); // создаем аватар        /*result_tf.text=stat_loader.data;    result_tf.x = 100;    result_tf.y = 30;    addChild(result_tf);*/        label_namep.move(220,125);    label_namep.text = " Имя:";    label_namep.setSize(500,20);        namep.move(220,145);    namep.setSize(200,20);    namep.maxChars = 25;            label_date_c.move(220,205);    label_date_c.text = "Дата ДД.ММ.ГГГГ:";    label_date_c.setSize(500,20);        date_c.move(220,225);    date_c.setSize(200,20);    date_c.restrict=".0-9";    date_c.maxChars = 10;        createbutton.move(420,245);    createbutton.label="Создать";         } // функция генерации сигнатурыfunction generate_signature(request_params):String{    var signature = '';    // сортируем параметры в алфавитном порядке    var sorted_array: Array = new Array();    for (var key in request_params)    {        sorted_array.push(key + "=" + request_params[key]);    }    sorted_array.sort();     // создаем строку параметров;    for (key in sorted_array)    {        signature +=  sorted_array[key];    }    signature = viewer_id + signature + secret;    return MD5.encrypt(signature);} create_btn.addEventListener(MouseEvent.CLICK,news);  function create_complete ( e:Event):void{    //Создаем экземпляр класса URLLoader и экземпляр URLRequest класса            var stat_loader:URLLoader = new URLLoader();            var stat_request:URLRequest=new URLRequest("http://адрес сайта/news.php");// задаем ссылку на отправку            //выбираем способ отправки            stat_request.method=URLRequestMethod.POST;            // добавление параметров в запрос ( создаем переменные для отправки)            var stat_vars:URLVariables = new URLVariables();            stat_vars['auth_key']=auth_key;            //LoaderInfo(root.loaderInfo).parameters.auth_key;// auth_key из FlashVars            stat_vars['viewer_id']=viewer_id;            // ID просматривающего приложение            stat_vars['pname']=namep.text;            stat_vars['date']=date_c.text;            namep.enabled=false;            date_c.enabled=false;            //Потом задаем эти переменные в экземпляр класса URLRequest            stat_request.data=stat_vars;            createbutton.removeEventListener(MouseEvent.CLICK,create_complete);            //  добавляем слушатель события Event.COMPLETE             stat_loader.addEventListener(Event.COMPLETE,onLoaded2);            //Загружаем экземпляром класса URLLoader все данные, указанные в URLRequest на адрес php скрипта, указанном выше            stat_loader.load(stat_request);     }  function onLoaded2(e:Event):void        {         // удаляем слушатель         e.target.removeEventListener(Event.COMPLETE,onLoaded2);             //e.target - это объект, на который мы повесили слушатель            output.text=e.target.data;        }        
Все это находится в одном кадре.Поэтому нажимая на кнопку create_btn у меня в приложении в самом верхнем углу появляется надпись label и больше ничего не происходит. Нажимая на кнопку profile_btn , загружается профиль, но если нажать потом на кнопку create_btn то поверх той информации возникнет "Имя: " "Дата ДД.ММ.ГГГГ" "Создать" но почему то без полей, куда вводить текст и без самой кнопки..
Сообственно два вопроса:
1) Почему при нажатии первой кнопки create_btn ничего не происходит т.е не появляется окно вбивания информации ?
2) Почему не отображаются поля TextInput и кнопка созданная методом Button ?
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

может это надо просто в разных кадрах сделать ?
dr1emaver
Сообщения: 78
Зарегистрирован: 16 июл 2011, 20:08

Re: Получение информации о пользователе

Сообщение dr1emaver »

Убрал код получения информации о пользователе.Попробовал :

Код: Выделить всё

/*подключение библиотек*/import flash.net.URLLoader;    import flash.net.URLRequest;    import flash.net.URLVariables;    import flash.net.URLRequestMethod;    import flash.display.*;    import flash.events.*;    import flash.text.TextField;    import fl.containers.UILoader;    import flash.display.SimpleButton;    import flash.display.BitmapData;    import vk.APIConnection;    import vk.events.*;    import vk.ui.VKButton;    import fl.controls.Button;    import fl.controls.TextArea;    import fl.controls.DataGrid;    import fl.controls.ScrollPolicy;    import fl.data.DataProvider;    import fl.events.ListEvent;    import fl.controls.TextInput;    import fl.controls.Label;    import flash.display.MovieClip;    import flash.text.TextFormat;  /* объявляем глобальные переменные*/  var api_id:Number = 2415040  ;// ID приложения var url_loader:URLLoader;  var url_request:URLRequest; var viewer_id;                var secret:String; var sid:String; var api_url:String;/*создаем поля */   var auth_key;  var namep:TextInput = new TextInput(); //поле для ввода имени var date_c: TextInput = new TextInput();  // поле для ввода даты var output : output : TextArea = new TextArea();  var label_namep: Label = new Label();// отображает одну или несколько строк текста с заданным выравниванием и размером var label_date_c: Label = new Label(); var createbutton:Button = new Button();// создаем кнопку    //stage - получение напрямую// id просматривающего приложениеviewer_id = stage.loaderInfo.parameters.viewer_id;// secret для генерации сигнатурыsecret = stage.loaderInfo.parameters.secret; // id сессииsid = stage.loaderInfo.parameters.sid;// адрес API-сервисаapi_url = stage.loaderInfo.parameters.api_url;// для тестирования локально, можно прописать их здесь (брать в исходном коде страницы с приложением)/*            viewer_id = '1';            secret = 'NCWvtyB1GV8cz4h54Y9Z';            sid = 'abcd123456abcd123456abcd123456abcd123456abcd123456abcd1234';            api_url = 'http://api.vkontakte.ru/api.php';         */   create_btn.addEventListener(MouseEvent.CLICK,news);     function news(e:MouseEvent):void{        namep.enabled = true;        date_c.enabled = true;       addChild ( namep);        addChild ( label_namep);                addChild ( date_c);        addChild ( label_date_c);        addChild(createbutton);        createbutton.addEventListener(MouseEvent.CLICK,create_complete);  } // запрос выполнен , отображение выполненных запросовfunction onComplete(e:Event):void{    var response:XML = new XML(url_loader.data);         label_namep.move(220,125);    label_namep.text = " Название новости:";    label_namep.setSize(500,20);        namep.move(220,145);    namep.setSize(200,20);    namep.maxChars = 25;                    label_date_c.move(220,205);    label_date_c.text = "Дата ДД.ММ.ГГГГ:";    label_date_c.setSize(500,20);        date_c.move(220,225);    date_c.setSize(200,20);    date_c.restrict=".0-9";    date_c.maxChars = 10;        createbutton.move(420,245);    createbutton.label="Создать";    } function create_complete ( e:Event):void{    //Создаем экземпляр класса URLLoader и экземпляр URLRequest класса            var stat_loader:URLLoader = new URLLoader();            var stat_request:URLRequest=new URLRequest("http://адрес сайта/create_news.php");// задаем ссылку на отправку            //выбираем способ отправки            stat_request.method=URLRequestMethod.POST;            // добавление параметров в запрос ( создаем переменные для отправки)            var stat_vars:URLVariables = new URLVariables();            stat_vars['auth_key']=auth_key;            //LoaderInfo(root.loaderInfo).parameters.auth_key;// auth_key из FlashVars            stat_vars['viewer_id']=viewer_id;            // ID просматривающего приложение            stat_vars['pname']=namep.text;            stat_vars['date']=date_c.text;            namep.enabled=false;            date_c.enabled=false;            //Потом задаем эти переменные в экземпляр класса URLRequest            stat_request.data=stat_vars;              //  добавляем слушатель события Event.COMPLETE             stat_loader.addEventListener(Event.COMPLETE,onLoaded2);            //Загружаем экземпляром класса URLLoader все данные, указанные в URLRequest на адрес php скрипта, указанном выше            stat_loader.load(stat_request);     }  function onLoaded2(e:Event):void        {         // удаляем слушатель         e.target.removeEventListener(Event.COMPLETE,onLoaded2);             //e.target - это объект, на который мы повесили слушатель            output.text=e.target.data;        }
Программа без ошибок компилируется, но при нажатии на кнопку create_btn выдает в выводе :
TypeError: Error #2007: Параметр child не должен быть равен нулю.
at flash.display::DisplayObjectContainer/addChildAt()
at fl.controls::BaseButton/drawBackground()
at fl.controls::LabelButton/draw()
at fl.controls::Button/draw()
at fl.core::UIComponent/callLaterDispatcher()
и вверху просто слово label. тоесть не отображается ни поля ввода, ни текстовые "Название новости" ," Дата ДД.ММ.ГГГГ". Загрузив в контакт, таже ерунда, жму на кнопку и ничего кроме как в верхнем углу слово label. Как быть? подскажите пожалуйста )
Аватара пользователя
bodnar
Модератор
Модератор
Сообщения: 1399
Зарегистрирован: 03 апр 2010, 06:41

Re: Получение информации о пользователе

Сообщение bodnar »

dr1emaver писал(а): Как быть?
Вполне очевидно что следует выяснить в какой строчке ошибка, не?
Поочередно комментируй строчки в проблемном методе, и найти на какой именно addChild() он ругается
Ответить