понедельник, 2 мая 2011 г.

flex

flex

 

Введение

Flex - это framework для Flash.
Сам по себе Flash имеет ограничения, т.к. разрабатывался под web.
Чтобы создавать "полноценные" desktop приложения нужен AIR.
AIR - приложения требуют установленной AIR-машины на целевом компьютере.

Flex:

Основной файл проекта - xml файл. В нём должен быть корневой тег mx:Application
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <!-- разметка, по аналогии с html  -->
        <mx:Label text="Моё первое flex-приложение!"></mx:Label>
</mx:Application>

Air:

Основной файл - так же xml-файл, но корневой тег mx:WindowedApplication.


Скрипты:

Чтобы добавить скрипт, в код добавляется тег mx:Script

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="init1(); init2();"> <!-- initialize - указывается функция, которая сработает при старте приложения -->

    <mx:Script> <!-- сейчас мы находимся внутри объекта "Application" и определяем его свойства и методы -->
    <![CDATA[
        /* здесь только импорты, определение переменных и функций.

            внутри фукнций можно уже делать что угодно. */
    ]]>
    </mx:Script>

</mx:Application>


Инструменты

Flex Builder 3

Настройка интерфейса

список функций по текущему файлу: Window → Outline

закладки
добавляются по клику правой кнопкой мыши: Bookmark...
удалить закладку можно только через панель управления закладками:
Window → Other Views... → General → Bookmarks

Горячие клавиши

alt+↑ (или ↓)переместить стоку вверх/вниз
ctrl+alt+↑(или ↓)дублировать строку
ctrl+d
удалить строку
ctrl+f
окно поиска, настройка "продолжить с начала страницы" называется "Wrap search"
ctrl+kнайти следующее вхождение выделенного текста

FlashDevelop

Требует установленного Adobe SDK (и Microsoft .NET 2.0).
Для создания Adobe AIR проектов надо прописать пусть к SDK:
Tools → Programm Settings... (F10) → AS3Context → Flex SDK Location → указать расположение
Далее создаём проект AIR Flex 3 Project
В созданном проекте будет два bat-файла. В обоих надо указать путь к Flex SDK.
Один файл создаёт сертификат с паролем. Сертификат нужен для сборке air-пакета.
Другой файл создаёт air-пакет.

Чтобы после компилирования по F5 автоматически открывался Firefox, нужно в:
верхнее меню → Project → Properties... → Output → Test Movie → Run custom command → Edit → вписать без изменений:
"C:\Program Files\Mozilla Firefox\firefox.exe";"$(OutputDir)\$(OutputName)"

Подключение swc библиотеки:
Project → Properties... → Compiler Options → в одном из (External Links, SWC Include Libraries, SWC Libraries) указать путь к библиотеке.
пример в картинках

отладка в web

запуск трейсера под firefox:
1) установить flash tracer (с официального сайта)
2) установить debug версию flash player
3) в опциях flash tracer указать расположение лог-фала (там написано, где должно лежать)

вывести подробную информацию об объекте в окно трейсера
trace( ObjectUtil.toString(_itemsIndex) );

Основные моменты

Application

Application - это основной объект программы (типа, "главное окно"). В программе может быть только один такой объект.

В Air такой объект называется WindowedApplication.

Приложение и компоненты можно описывать с помощью mxml или с помощью AcrionScript.

mxml

у любого элемента в разметке mxml можно указать id:
    <mx:DataGrid id="asf">
тогда к нему можно будет обратиться из кода flex как к объекту с именем asf

ActionScript

создание объектов

var a:Button = new Button(); // объект создан, но он ещё не размещён на странице
editPanel.addChild(a); // размещаем объект внутри какого-то уже отображённого контейнера


includeInLayout
bool
занимает ли объект место в разметке странице
display
bool
отображается ли объект



Базовые классы Flex

Тут перечислены только те классы, которые есть во Flex, но отсутствуют в ActionScript.

ArrayCollection

ArrayCollection([{"aa":11, "bb":"qwq"},{"aa":22, "bb":"asd"}]);
ArryaCollection - это класс, который наследуется от Array. В нём есть дополнительный возможности. В частности - сортировка. Пример:
var sort:Sort = new Sort();
sort.fields = [new SortField("age", false)];
coll.sor = sort;
coll.refresh();

XML

http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/XML.html
xml.attribute("attrName"); // получить значение xml-атрибута по его имени
то же самое можно получить как:
xml.@attrName;

xml.elements(); // список вложенных элементов XML
xml.children(); // список вложенных элементов с учётом сортировки
xml.toXMLString(); // получить xml в виде строки

задать новое значение атрибуту XML
xml.attribute( attrName )[0] = new XML( newValue );

XMLList

это список объектов XML. на сколько понимаю, через этот объект можно работать с коллекцией XML, находящихся внутри списка.

HTTPService

Объект для отправки форм
public function stepByStepRequest(url:String, resultFunction:Function, params:Object=false):void {
    publicHTTPService = new HTTPService();
    publicHTTPService.url = url;
    if(params) {
        for (var param:String in params) {
            publicHTTPService.request[param] = params[param];
        };
    };
    publicHTTPService.addEventListener(ResultEvent.RESULT, resultFunction);
    publicHTTPService.addEventListener(FaultEvent.FAULT, stepByStepRequestFault);
    publicHTTPService.send();
    cursorManager.setBusyCursor();
}

Переменные окружения (url и пр.)

Путь к текущему исполняемому файлу swf доступен через this.url (видимо не доступен из подключаемых компонентов приложения).

Передать параметры из html во flash

    <object id='mySwf' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='100%' width='100%'>
        <param name='src' value='FlashVarTest.swf'/>
        <param name='flashVars' value='firstName=Nick&lastName=Danger'/>
        <embed name='mySwf' src='FlashVarTest.swf' pluginspage='http://www.adobe.com/go/getflashplayer' height='100%' width='100%' flashVars='firstName=Nick&lastName=Danger'/>
    </object>
статья в документации Adobe называется "Passing request data with URL fragments"

Менеджеры

PopUpManager

класс для управления всплывающими окнами
http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=layouts_065_45.html

Полезные функции

Определить ширину текста

import flash.text.TextLineMetrics;       
private function a2():void{
     var bbb:TextLineMetrics = measureText( aaa.text );
     Alert.show( bbb.width.toString() );
}

Взаимодействие с javascript

получить текущий путь

trace( ExternalInterface.call("window.location.href.toString") );
вроде бы этот класс позволяет вызывать любые функции javascript

Полезные функции

print_r

некоторые простенькие объекты может обработать, но, видимо, далеко не все

        private function print_r(theObj:Object,indent:String=""):void {
            if (indent == "") {
                indent = " ";
            } else {
                indent += " ";
            }
            if(theObj is Array || theObj is Object) {
                for(var p:Object in theObj){
                    if(theObj[p] is Array|| theObj[p] is Object){
                        trace("\n"+indent+"["+p+"]("+typeof(theObj[p])+")=>");
                        print_r(theObj[p],indent);
                    } else {
                        trace("\n"+indent+"["+p+"]:"+theObj[p]);
                    }
                }
            }
            trace(String(theObj));
        }

nextHi

public static function getNextHi(hi:String):String
{
    var prefix:String;
    var endPart:String;
    var index:int = hi.lastIndexOf(".");
    if(index == -1){
        endPart = hi;
        prefix = '';
    } else {
        prefix = hi.substr(0, index + 1);
        endPart = hi.substr(index+1);
    }
    endPart = String(Number(endPart.substr(1))+1);
    return  prefix + (endPart.length - 1) + endPart;
}







php. Работа с БД

Работа с БД



Стандартная библиотека MySQL

Кодировка

когда вместо русских букв отображаются ????? ?? ????????, может помочь это:

mysql_query( "SET character_set_client = cp1251;" );
mysql_query( "SET character_set_connection = cp1251;" );
mysql_query( "SET character_set_results = cp1251;" );

ставиться сразу после подключения к БД.


PDO

Класс для унифицированной работы с базами данных.
http://ru2.php.net/pdo

Создать курсор БД

$cursor = new PDO( sprintf( "mysql:host=%s;dbname=%s",
    Config::$dbHost, Config::$dbName),
    Config::$dbUser, Config::$dbPass);

foreach ($cursor->query("select 1") as $row){
    print_r( $row );
}
Параметры соединения указываеются четвёртым аргументом:
$dbh = new PDO($dbtype.':host='.$dbhost.';dbname='.$dbname, $dbuser, $dbpass, array(PDO::ATTR_PERSISTENT => true));

Выполнение запросов

Для выполнения запросов есть два метода: prepare и query

            $q = $this->db->prepare( "
insert into advert ( advert_nm, advert_text, homepage, group_id )
values (:title, :text, :homepage, :groupId )
" );
            $q->bindParam(':title', $_POST["adv_title"], PDO::PARAM_STR, 255 ); # есть ещё PDO::PARAM_INT
            $q->bindParam(':text', $_POST["adv_text"], PDO::PARAM_STR, 1024 );
            $q->bindParam(':homepage', $_POST["home_page"], PDO::PARAM_STR, 255 );
            $q->bindValue(':groupId', 1, PDO::PARAM_INT );
            $q->execute();  # после выполнения select можно получить данные через $q->fetch(), fetchall(), fetchObject(), fetchColumn()
                                    ## после выполнения insert -> $this->db->lastInsertId();
            $a = $q->errorInfo();
            if ($a[0]=="00000"){
                header( "Location: /do/" );
            }
Если нужно выполнить несколько запросов подряд, то могут возникнуть запарки: на некоторых серверах PDO может иметь только одно подготовленное выражение.
Прежде чем создавать очередной запрос, нужно удалить (unset) старое подготовленное выражение.

fetchObject

fetchObject возвращает объект типа stdClass. Чтобы получить данные из него, надо обращаться с ним как с объектом:
$res = $q->fetchObject();
print $res->column_nm;

dbSimple

Для начала

http://dklab.ru/lib/DbSimple/
dbSimple не обновлялся с 2006(?) года.
В PHP5 появился класс PDO для работы с БД.

Интерфейс библиотеки (кратко)

Полное описание интерфейса см. в подробной документации.

mixed connect(string $dsn) Соединение с указанной СУБД, используя DSN. mixed select(string $query [,$arg1...]) Выборка двумерного массива (список строк). hash selectRow(string $query [,$arg1...]) Выборка однострочного результата запроса (одна строка). array selectCol(string $query [,$arg1...]) Выборка одноколоночного результата запроса (один столбец). scalar selectCell(string $query [,$arg1...]) Выборка скалярного результата запроса (одна ячейка). mixed selectPage(int &$total, string $query [,$arg1...) Выборка ограниченного двумерного массива с занесением общего числа записей в переменную. mixed query(string $query [,$arg1...]) Вызов не-SELECT запроса; для автоинкрементных полей в INSERT-запросах возвращает ID вставленной записи. mixed transaction([mixed $parameters]) Запускает новую транзакцию. mixed commit() / mixed rollback() Подтверждает/отменяет текущую транзакцию.