Урок по ExtJS 4.1 (часть 1)Решил вам поведать о ExtJS 4.1 —мощный framework, с кучей возможностей, начиная от простого управления DOM’ом до создания RICH приложений.
Данный framework полностью Объектно Ореинтированный. Имеет структуру MVC (опционально). Каждый компонент, будь-то кнопка, панель, дерево, или же поле для ввода — это объект, это надо запомнить. Каждый компонент расширяем, т.е создав панель внутрь можно положить еще кучу панелей, кнопок, менюшек и что душе угодно, т.е иерархия компонентов очень большая. Каждый объект (компонент) имеет так же стандартные настройки для управления им, ширина, высота, хранилище и многое другое! Бывает такое, что не можешь понять что откуда берется, например открыв API и взяв компонент panel мы можем увидеть много стандартных св-в и методов, но нет того, который указан где ибудь в мануале… для этого нужно пройти в родительские классы. Мы раматриваем ExtJS версии 4.1 (последняя версия на данную дату). Для того, чтобы начать работать с ней, нужно скачать полный пакет. Теперь создадим новый файл, для наших тестов: Подключаем в начале наш framework
<link href="/extjs/resources/css/ext-all.css" rel="stylesheet" type="text/css" />
Далее, чтобы наше приложение работало, надо провести маленькие настройки, пишем:
Ext.Loader.setConfig({enabled: true});
После наших настроек можно приступать к работе. Пишем:
// Метод onReady отвечает за запуск скрипта внутри анонимной функции по завершении загрузки страницы
Полный код, страница (не забудьте указывать правильные пути).
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title></title>
<link href="/assets/js/extjs/resources/css/ext-all.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/assets/js/extjs/ext-all.js"></script>
файл test.js
Ext.Loader.setConfig({enabled: true});
Ext.Loader.setPath('Ext', '/assets/js/extjs');
Ext.require([
'Ext.Msg'
]);
Ext.onReady(function(){
Ext.Msg.alert('Приветствие','Hello World');
});
Запускаем, и любуемся:
У нас есть еще и другие компоненты, которые сейчас рассмотрим… Компонент Ext.panel.Panel Данный компонент преднозначен для создания панелей, как бы контейнеров для кнопок, форм, других панелей и т.п Рассмотрим на примере: Для начала добавим наш компонент в блок Ext.require([…
Ext.require([
Внутри блока onReady пишем
var panel = Ext.create('Ext.panel.Panel', {
Теперь по порядку: 1) первым делом мы создаем наш компонент, таким образом — Ext.create('Ext.panel.Panel', {}); первым параметром в функцию Ext.create передается название нашего компонента, вторым параметром передается объект с нашими надстройками. 2) св-во title отвечает за заголовок компонента (панели). 3) width, height ширина и высота соотвественно (остальные св-во можно глянуть в API). 4) св-во html отвечает за содержимое, в виде HTML. 5) св-во renderTo отвечает за отображение, ему указывается ID дива, куда поместить наш компонент. А теперь, мы расмотрим как вкладывать внутрь компонента еще компонент:
var panel = Ext.create('Ext.panel.Panel', {
1) Самое главное в построении многоуровневых компонентов — это следить за рапсположением элементов, св-вом layout, в ExtJS есть такое понятие как слои «layout» они отвечают за расположения эл-тов, основным явлется слой border. Слой border подразумевает расположение объектов по всем сторонам (region) рабочей области, основополагующим регионом является 'center', без него наша панель не будет работать(!!!) т.к все остальные эл-ты позиционируются относительно него! Регионы бывают: center, west, north, south, east. В каждый регион можно положить еще панель, и дать ей слой border, и так же раскидать внутри неё еще панельки, дав им свои регионы, наглядный пример Регионы назначаются дочерним эл-там панели, внутри items. 2) Рассмотрим следующее главное св-во items, данное св-во отвечает за дочерние эл-ты нашего компонента, оно есть в 90% всех компонентов ExtJS. items'у передается массив с объектами наших компонентов! В нашем случае два эл-та (панели)
Каждый компонент (объект), в нашем случае панель, можно создать неявно, указав xtype: 'panel'! Далее описываются св-ва нашего компонента Где найти альтернативные названия наших компонентов? Нужно глянуть в верхнем блоке описания компонента В items можно передавать и обычные объекты, созданные выше, с помощью Ext.create('Ext.panel.Panel', {… 3) Св-во defaults отвечает за стандартные настройки нашей панели, их можно переопределить внутри каждого дочернего эл-та в items. Если поставить св-во collapsible: true, то панелька будет прятаться при щелчке на кнопку… Если поставить еще и св-во split: true, то панельку можно уменьшать или увеличивать, тянув за границу… Самое главное это играться со св-вами, которые нам предоставляют, смотрите API и просто пробуйте, не забываем смотреть в консольку (при ошибках).
Теперь расмотрим создания кнопок, компонент Ext.button.Button, xtype: 'button', добавим её в нижнию часть нашей панельки св-вом bbar, чтобы добавить в верхнию часть используем tbar
var panel = Ext.create('Ext.panel.Panel', {
1) Св-во tbar,bbar,lbar,rbar отвечает за расположение дополнительных плюшек: менюшек, выпадающих списков, кнопок и др. Кнопку можно создать и простым способом:
var button = Ext.create('Ext.button.Button', {
и передать в нашу панельку
...
Чтобы повесить событие на кнопку, нужно воспользоваться св-вом handler
var button = Ext.create('Ext.button.Button', {
Данное св-во как я и говорил выше применимо и к виду с xtype
...
ЗАПОМНИТЕ, сокращенный вид НИЧЕМ НЕ ХУЖЕ стандартного создания компонентов. Кому как нравится. Для того чтобы создать таб панель можно воспользоваться сокращенным способом xtype: tabpanel, или стандартным Ext.tab.Panel. Расширим наше пространство для работы, создав еще один регион, и увеличив саму панель (главную), полный код:
var panel = Ext.create('Ext.panel.Panel', {
Мы добавили еще один объект (компонент) в конец items нашей панели, и дав ему регион south, т.е прибив к низу панели. Дали нашему объекту xtype: 'tabpanel' и остальные настройки. Вкладки в нашей таб панели перечисляются внутри всеми любимым св-вом items. Указывается св-во title — название вкладки и остальные св-ва… Каждая вкладка тоже имеет св-во items, в него можно так же класть панели, кнопки, еще табы и многое другое… Чтобы сразу выделить нужную там панель указывается св-во activeTab: 1, 1 (единичка) указывает на то, что надо открыть при загрузке табов, второй по счету таб, вспоминаем как идет счет эл-тов в массиве. Так же, таб можно загружать динамически использую AJAX. Пример: Добавим третью вкладку в items.
...
1) Cв-во loader отвечает за загрузку, в нем указывается адрес, параметры и доп. параметры 2) На вкладке можно повесить событие, с помощью listeners. События КАЖДОГО КОМПОНЕНТА В ExtJS надо смотреть в API вкладка events (см. сайт) 3)
activate: function(tab) {
здесь мы говорим, возьми на таб tab и загрузи то, что хотели… Так же можно обойтись и без этого, указав просто в loader'е св-во autoLoad: true. Теперь поговорим о формах Ext.form.Panel, xtype: form Формы в ExtJS это те же панели только типа form. Каждый компонент формы, а точнее текстовые поля, чекбоксы и др. можно создать и просто так и работать с ними, но если мы делаем нормальную форму из 5ти полей, мы же не хотим по отдельности ловить наши компоненты (текстовые поля) и обрабатывать их, мы хотим просто отправить форму на сервер… Вот для этого и используется форма, для группировки. Рассмотрим на примере: Изменим немного нашу главную панель, заменив блок
{
на переменную myForm, сейчас мы её создадим.
var myForm = Ext.create('Ext.form.Panel', {
1) Создаем форму как помним с помощью Ext.create('Ext.form.Panel', {}); Можно и не явно создать, с помошью xtype, но будет слишком загроможденный код. 2) В св-ве defaults мы указываем anchor: '100%' для того, чтобы наши инпуты растягивались во всю ширину 3) defaultType: 'textfield', указывает, какой стандартный тип полей использовать, при создании в items. Это нужно для того, чтобы всё время не прописывать в items xtype: 'textfield'. Не забываем, что и все эти поля можно создать с помощью Ext.create('Ext.form.field.Text', {}); и передать просто переменную в items. 4)bodyPadding — делаем отступы от внутренней части панели. 5) Создаем кнопку buttons: [buttonForm], можно сразу несколько, как видим тут массив. Мы вынесли для удобства, чтобы потом сделать отправку формы на сервер. Код buttonForm ниже:
var buttonForm = Ext.create('Ext.button.Button', {
6) У каждого поля, можно указать св-во allowBlank: false, оно нужно для того, чтобы проверять валидность на пустоту и т.д. Пригодится в дальнейшем. А теперь добавим texarea со стандартным текстовым редактором, ниже всех элементов items добавляем:
{
Ну а теперь давайте отправим нашу форму на сервер. Изменим нашу кнопку buttonForm
var buttonForm = Ext.create('Ext.button.Button', {
1) var form = Ext.getCmp('idForm').getForm(); — тут мы получаем наш компонент с ID idForm, далее мы получаем форму. 2) проверяем валидность form.isValid(). 3) При вызове метода submit из нашего компонента form, мы отправляем нашу форму по адресу url, с дополнительными параметрами params, на ваше усмотрение. 4) Так же ставим обработчики на запрос, для отслеживания статуса. success — выполняется тогда, когда ошибок нет и САМОЕ ГЛАВНОЕ в ответе есть success true. Как надо оформлять ответ, в 6 пункте. 5) failure вызывается тогда, когда success false, или произошла ошибка на сервере (статус не 200) 6) код обработчика
<?php
7) в параметр response функции success придет ответ с сервера, а точнее в response.result, уже в декодированном виде, в виде JSON объекта. |