Слайд 1Создание динамических интерфейсов
и AJAX-приложений
промышленного класса с помощью
Dojo Toolkit и Zend
Framework
Георгий Туревич, Wizartech
Слайд 2Немного о себе
Ведущий веб-программист компании Wizartech
Более 7-и лет использования PHP и
JavaScript
Более 2-х лет использования Zend Framework
Около 1-го года активного использования Dojo Toolkit
(с момента заключения партнерства с Zend Framework)
и создания индивидуальных компонентов
Принимаю активное участие в развитии сообщества ZendFramework.ru (с момента создания)
Модератор русскоязычной группы рассылки
«RU DojoToolkit JS Framework» на Google Groups
Слайд 3Промышленный?
Богатый функционал
Гибкая архитектура
Проверенный код
Код библиотек покрыт тестами
Собственный инструментарий для тестирования
Постоянное развитие
и ясное будущее
Поддержка от Zend Technologies и Sitepen
Мощное сообщество
Zend Framework: Adobe, Google, Sitepen, Microsoft, Nirvanix, Strikiron
Dojo Toolkit: Sun, IBM, Google, AOL, Uxebu, Sitepen
Лицензирование
Zend Framework: New BSD License
Dojo Toolkit: Modified BSD license \ The Academic Free License 2.1
Слайд 5Где взять Dojo?
Скачайте напрямую
Subversion / Git / Bazaar
CDN (Google, AOL, …)
Слайд 7Вкратце о Core и Base
Полезные утилиты
Обработка событий
Ajax (Restful XHR, script, iframe)
Манипулирование узлами
Интернационализация
Перетаскивание
Анимация
Абстракция данных
Имитация классов и наследования
Слайд 9Инициализация
Dojo
type="text/javascript"
src="http://o.aolcdn.com/dojo/1.3/dojo.xd.js">
HELLO PHPCONF 2009 !!!
Также можно использовать:
Другие CDN (помимо AOL и Google можно использовать собственные
XD-сборки)
Локальные копии Dojo Toolkit
Слайд 10Конфигурирование
Конфигурировать возможно прямо в тэге :
Или
программным способом (для соответствия стандартам):
Слайд 11Система управления
пакетами и зависимостями
dojo.require("dojo.fx");
dojo.require("dojo.io.script");
dojo.registerModulePath("wlib", "/js/wlib/");
dojo.require("wlib.Example"); // /js/wlib/Example.js
var exampleObj = new wlib.Example();
Слайд 12Система управления
пакетами и зависимостями
dojo.provide("wlib.Example");
dojo.declare("wlib.Example", null, {
constructor: function() {
console.log("HELLO! It is example!");
}
});
/js/wlib/Example.js
Вывод в консоли Firebug Lite (упрощенный аналог плагина для FF):
Слайд 13dojo.addOnLoad()
dojo.addOnUnload()
var onLoadFunc = function() {
console.log('Да! Страница загружена!');
}
dojo.addOnLoad(onLoadFunc);
Интересное в Base и Core
События
Слайд 14Интересное в Base и Core
События
dojo.connect()
Все на конференцию
dojo.connect(dojo.byId('link'),'onclick',
function(evt) {
dojo.stopEvent(evt);
console.log('Вы щелкнули на ссылку!');
});
Слайд 15Интересное в Base и Core
События
dojo.connect() / dojo.disconnect()
function foo() {
console.log('Вызвана функция foo') }
function bar() { console.log('Вызвана фукция bar') }
var conn = dojo.connect('foo', bar);
foo();
console.log('--- Удаляем соединение --- ');
dojo.disconnect(conn);
foo();
Слайд 16Интересное в Base и Core
События
dojo.connect() / dojo.disconnect()
Слайд 17Интересное в Base и Core
События
dojo.subscribe(), dojo.unsubscribe(), dojo.publish()
function handlerFirst(data) {
console.log("Функция handlerFirst, Данные:", data);
}
function handlerSecond(data) {
console.log("Функция handlerSecond, Данные:", data);
}
var subscrFirst
= dojo.subscribe('mySubscribe', null, handlerFirst);
var subscrSecond
= dojo.subscribe('mySubscribe', null, handlerSecond);
Слайд 18Интересное в Base и Core
События
dojo.subscribe(), dojo.unsubscribe(), dojo.publish()
dojo.publish("mySubscribe", ["Привет всем!"]);
dojo.publish("mySubscribe", ["Пока всем!"]);
console.log(" --- Очищаем subscrFirst --- ");
dojo.unsubscribe(subscrFirst);
dojo.publish("mySubscribe", ["Привет всем!"]);
dojo.publish("mySubscribe", ["Пока всем!"]);
Слайд 19Интересное в Base и Core
События
dojo.subscribe(), dojo.unsubscribe(), dojo.publish()
Слайд 20Интересное в Base и Core
Ajax
Полный Restful набор функций:
dojo.xhrGet()
dojo.xhrPost()
dojo.xhrPost({
url: "./test.php",
handleAs: "text",
content: {a: "1111", b: "2222"},
load: function(response, ioArgs) {
console.log(response);
return response;
}
});
dojo.xhrPut()
dojo.xhrDelete()
Слайд 21Интересное в Base и Core
Ajax
test.php
Слайд 22Интересное в Base и Core
Ajax
dojo.Deffered (позволяет создавать цепочки функций обратного вызова)
Слайд 23Интересное в Base и Core
Ajax
var deffered = dojo.xhrPost({
url: "./test_deffered.php",
handleAs: "json",
content: {a: "1111", b: "2222"},
load: function(response, ioArgs) {}
});
deffered.addCallback(firstCallback);
deffered.addCallback(secondCallback);
dojo.Deffered
Также есть возможность добавлять:
Исключительно обработчики ошибок (addErrback метод)
Универсальные обработчики (addBoth метод)
Слайд 24Интересное в Base и Core
Ajax
test_deffered.php
Слайд 25Имитация классов
и наследования
dojo.declare()
dojo.declare("wlib.ExampleParentFirst", null, {
constructor:
function() {
console.log("Вызов конструктора");
}
});
dojo.declare("wlib.ExampleParentSecond", null, {
say: function(message) {
console.log(message)
}
});
Слайд 26Имитация классов
и наследования
dojo.declare(
"wlib.ExampleParentChild",
[wlib.ExampleParentFirst, wlib.ExampleParentSecond],
{
sayBy: function() {
this.say("Всем пока!")
}
}
);
var child = new wlib.ExampleParentChild();
child.sayBy();
dojo.declare()
Слайд 27Имитация классов
и наследования
dojo.declare()
Слайд 28Имитация классов
и наследования
dojo.extend()
dojo.extend(wlib.ExampleParentChild, {
sayHello:
function() {
this.say("Всем привет!");
}
});
var child = new wlib.ExampleParentChild();
child.sayHello();
child.sayBy();
Слайд 29Имитация классов
и наследования
dojo.mixin()
var obj = { firstName: "Иван", lastName:
"Петров" };
var emp = dojo.mixin(obj, {
sayName: function() {
console.log(
"Меня зовут " + this.firstName + " "
+ this.lastName
);
}
});
emp.sayName();
Слайд 30Имитация классов
и наследования
dojo.hitch()
function sayName() {
console.log(
"Меня зовут " + this.firstName + " "
+ this.lastName
);
}
var obj = { firstName: "Иван", lastName: "Петров" };
var callback = dojo.hitch(obj, sayName);
callback();
Слайд 32Что такое Dijit?
Система виджетов Dojo
Богатый набор готовых виджетов
Элементы форм (текстовые поля,
кнопки, выпадающие элементы,
слайдеры и т.д.)
Слайд 34Что такое Dijit?
Система виджетов Dojo
Богатый набор готовых виджетов
Элементы форм (текстовые поля,
кнопки, выпадающие элементы,
слайдеры и т.д.)
Виджеты компоновки (Content pane, Accordion / Tab / Stack /
Border-контейнеры)
Слайд 36Что такое Dijit?
Система виджетов Dojo
Богатый набор готовых виджетов
Элементы форм (текстовые поля,
кнопки, выпадающие элементы,
слайдеры и т.д.)
Виджеты компоновки (Content pane, Accordion / Tab / Stack /
Border-контейнеры)
Виджеты приложения (деревья, прогресс-бар, диалоги, меню,
WYSIWYG и т.д.)
Слайд 38Что такое Dijit?
Система виджетов Dojo
Богатый набор готовых виджетов
Элементы форм (текстовые поля,
кнопки, выпадающие элементы,
слайдеры и т.д.)
Виджеты компоновки (Content pane, Accordion / Tab / Stack /
Border-контейнеры)
Виджеты приложения (деревья, прогресс-бар, диалоги, меню,
WYSIWYG и т.д.)
Доступность (Accessibility (a11y))
Шаблонность (встроенный шаблонизатор)
Готовые темы оформления (tundra, soria, nihilo, noir)
Слайд 39Инициализация виджетов
dojo.require("dijit.form.Button");
rel="stylesheet" href="/dojotoolkit/dijit/themes/tundra/tundra.css">
В секции :
Устанавливаем parseOnLoad в true
Подключаем нужные виджеты
Подключаем тему оформления
Слайд 40Инициализация виджетов
Щелкни по мне!
В секции :
Слайд 44Dojox
Dojox — собрание расширенных, дополнительных и экспериментальных компонентов (Extensions, Extras, Experiments)
Состав:
Расширения
Dijit (dojox.widget, dojox.layout, dojox.form)
Дополнительная анимация: dojox.fx (Morph, Text, Extras, ...)
Виджеты изображений (FlickrBadge, Lightbox (Nano), SlideShow, ...)
Расширенный IO (RPC, REST, SMD, ScriptFrame, ...)
И многое другое …
Слайд 48Абстракция
работы с данными
Все типы хранилищ реализуют один или несколько интерфейсов:
dojo.data.api.Read
(чтение, поиск, сортировка и фильтрация элементов данных)
dojo.data.api.Write (создание, удаление, обновление элементов данных)
dojo.data.api.Identity (доступ к элементам по средствам уникальных идентификаторов)
dojo.data.api.Notification (уведомление о таких событиях, как создание, удаление или обновление элементов данных)