| Урок по 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) код обработчика 
<?php7) в параметр response функции success придет ответ с сервера, а точнее в response.result, уже в декодированном виде, в виде JSON объекта. |