рд╕рдорд╕реНрдпрд╛
ExtJS рдмрд╣реБрдд рд╕рд╛рд░реА рдЦреВрдмрд┐рдпреЛрдВ рд╡рд╛рд▓реА рдПрдХ рдмреЗрд╣рддрд░реАрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред Http://dev.sencha.com/deploy/dev/examples/ рдкрд░ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрдИ рдбреЗрдореЛ рд╕реНрд░реЛрдд рдЙрдкрд▓рдмреНрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдЧрд╛ред
рдореБрдЭреЗ TreePanel рдФрд░ GridPanel рдХреЗ рдмреАрдЪ рдПрдХ рдбрдмрд▓ рдбреНрд░реИрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдПрдХреНрд╕рдЯрдЬреЗрдПрд╕ рдлреЛрд░рдо рдкрд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдХреЗрд╡рд▓ рдЦрдВрдбрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓реА, рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ - рдХрдЯ рдХреЗ рддрд╣рддред
рдирд┐рд░реНрдгрдп
рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - рд╣рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рднреА рдПрдХреНрд╕рдЯреАрдЬреЗрдПрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, HTML рдлрд╝рд╛рдЗрд▓ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдпрд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=UTF-8" >
< link rel ="stylesheet" type ="text/css" href ="files/ext-all.css" >
< script type ="text/javascript" src ="files/ext-base.js" ></ script >
<script type= "text/javascript" src= "files/ext-all.js" ></script>
<script type= "text/javascript" src= "files/grid2treedrag.js" > </ script >
< title id ="page-title" > Drag&Drop TreePanel GridPanel ExtJS </ title >
</ head >
< body >
< h3 > Drag&Drop TreePanel GridPanel ExtJS </ h3 >
</ body >
</ html >
* This source code was highlighted with Source Code Highlighter .
рдпрд╣ HTML рдХреЗ рд╕рд╛рде рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд╕реАрдзреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдЯреЛрдХрд░реА" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдмрд╛рдИрдВ рдУрд░ (рдЧреНрд░рд┐рдбрдкреИрдирд▓) - рдЙрддреНрдкрд╛рджреЛрдВ, рджрд╛рдИрдВ рдУрд░ (рдЯреНрд░реАрдкрдиреЗрд▓) - рдЙрдирдХреЗ рд╕рд╛рде рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░рд╛ рдЧреНрд░рд┐рдб рдмрдирд╛рдПрдВ:
var grid1 = new Ext.grid.GridPanel({
store: new Ext.data.ArrayStore({
fields: [ 'name' , 'unit' , 'price' ],
data: d
}),
columns:[
{
id: 'name_column' ,
header: "" ,
width:40,
sortable: true ,
dataIndex: 'name'
},{
id: 'unit_column' ,
header: ". ." ,
width:20,
sortable: true ,
dataIndex: 'unit'
},
{
id: 'price_column' ,
header: "" ,
width:30,
sortable: true ,
dataIndex: 'price'
}
],
sm : sm,
viewConfig:{
forceFit: true
},
id: 'grid' ,
title: '' ,
region: 'center' ,
layout: 'fit' ,
enableDragDrop: true ,
ddGroup: 'grid2tree'
});
* This source code was highlighted with Source Code Highlighter .
d рдПрдХ рд╕рд░рд▓ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ ArrayStore рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рдЧреНрд░рд┐рдб рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рднрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧреНрд░рд┐рдб рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдбреАрдЧреНрд░реИрдбреНрд░реЛрдк рдХреЛ рд╕рд╣реА рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ ddGroup: 'grid2tree' рд╣рдорд╛рд░реЗ рдбреНрд░реИрдЧ рдЧреНрд░реБрдк рдХрд╛ рдирд╛рдо рд╣реИред рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдм рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдПрдБ:
var tree = new Ext.tree.TreePanel({
root:{
text: '' ,
id: 'root' ,
expanded: true ,
children:[{
text: '' ,
children:[{
text: '' ,
leaf: true ,
price: 7000,
unit: ''
}, {
text: '' ,
leaf: true ,
price: 5400,
unit: ''
}, {
text: ' ' ,
children:[{
text: '' ,
leaf: true ,
price: 7000,
unit: ''
}]
}]
},{
text: ' ' ,
children:[{
text: '' ,
leaf: true ,
price: 800,
unit: ''
}]
},{
text: ' ++' ,
leaf: true ,
price: 1200,
unit: ''
}]
},
loader: new Ext.tree.TreeLoader({
preloadChildren: true
}) ,
enableDD: true ,
ddGroup: 'grid2tree' ,
id: 'tree' ,
region: 'east' ,
title: ' ' ,
layout: 'fit' ,
width:300,
split: true ,
collapsible: true ,
autoScroll: true ,
listeners:{
beforenodedrop: function (e) {
if (Ext.isArray(e.data.selections)) {
if (e.target == this .getRootNode()) {
return false ;
}
e.cancel = false ;
e.dropNode = [];
var r;
for ( var i = 0; i < e.data.selections.length; i++) {
r = e.data.selections[i];
e.dropNode.push( this .loader.createNode({
text:r.get( 'name' ),
leaf: true ,
price:r.get( 'price' ),
unit: r.get( 'unit' )
}));
r.store.remove(r);
}
return true ;
}
}
}
});
* This source code was highlighted with Source Code Highlighter .
рдкрдВрдХреНрддрд┐рдпрд╛рдВ
if (e.target == this.getRootNode()) {
return false;
}
рдпрджрд┐ рдЖрдк рдЧреНрд░рд┐рдб рд╕реЗ рд░реВрдЯ рддрддреНрд╡ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЯрд┐рдкреНрдкрдгреА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЪрдпрдирд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рд░рдгреА (рдЖрдк рд╢рд┐рдлреНрдЯ рдФрд░ Ctrl рдХреЗ рд╕рд╛рде рдХрдИ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ) рдЬреЛ рд╣рдореЗрдВ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреА рдЧрдИ рд╣реИ, рдлрд┐рд░ рд╣рдо рдПрдХ рд▓реВрдк рдореЗрдВ рдЪрдпрдирд┐рдд рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдиреЛрдб рдмрдирд╛рддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝реЗ рдЧрдП рдореВрд▓реНрдп рдФрд░ рдЗрдХрд╛рдИ рдЬреИрд╕реЗ "рдХрд╕реНрдЯрдо" рдлрд╝реАрд▓реНрдб рдХреЛ рдлрд┐рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдиреЛрдб рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдо рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрд╡рдЬ рдХреЛ рдЬрдХрдбрд╝рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдЬрд┐рд╕ рдкрд░ рдЖрдЧреЗ рддрд░реНрдХ рдмрдВрдзрд╛ рд╣реБрдЖ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣рдорд╛рд░реА "рдЯреЛрдХрд░реА" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд┐рдбрд╝рдХреА рднреА рд╣реИред
var cb = new Ext.FormPanel({
region: 'south' ,
frame: true ,
height: 40,
labelWidth: 200,
labelPad: 0,
items: [
{
xtype: 'checkbox' ,
fieldLabel: ' ' ,
listeners: {
check: function (cb, checked ) {
remove_catalogs = checked ;
}
}
}
]
});
// create and show the window
var win = new Ext.Window({
title: ' ' ,
id: 'tree2divdrag' ,
border: false ,
layout: 'border' ,
width:700,
height:400,
items:[tree, grid1, cb]
});
win.show();
* This source code was highlighted with Source Code Highlighter .
рдЕрдм рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд DropTarget рдмрдирд╛рдПрдВ, рдЕрд░реНрдерд╛рдд, рд╡рд╣ рд╕реНрдерд╛рди рдЬрд╣рд╛рдВ рдЖрдк рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪ рдФрд░ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
var gridTargetEl = grid1.getView().scroller.dom;
рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк extJS рдбреЗрдореЛ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдпрд╛ ext-all-debug.js рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ GridView рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓рд╛рдЗрдиреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
ts.master = new Ext.Template(
'<div class="x-grid3" hidefocus="true">' ,
'<div class="x-grid3-viewport">' ,
'<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset" style="{ostyle}">{header}</div></div><div class="x-clear"></div></div>' ,
'<div class="x-grid3-scroller"><div class="x-grid3-body" style="{bstyle}">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>' ,
'</div>' ,
'<div class="x-grid3-resize-marker"> </div>' ,
'<div class="x-grid3-resize-proxy"> </div>' ,
'</div>'
);
* This source code was highlighted with Source Code Highlighter .
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдЧреНрд░рд┐рдб рдХрд╛ "рдмреЙрдбреА" рдЗрд╕реЗ рдлреНрд░реЗрдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЗ рдЕрдВрджрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдЖрд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдХреЛрд░рд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреА DOM рд╕рд╛рдордЧреНрд░реА рд▓реЗрддреЗ рд╣реИрдВред
рдЕрдм, рд╣рдорд╛рд░реЗ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, DropTarget рдХреЛ рд╕реНрд╡рдпрдВ рдмрдирд╛рдПрдВ:
var GridDropTarget = new Ext.dd.DropTarget(gridTargetEl, {
ddGroup : 'grid2tree' ,
notifyDrop : function (ddSource, e, data) {
e.cancel = false ;
var node = ddSource.dragData.node;
if ( ( (node.parentNode == null ) || (!node.isLeaf() && !remove_catalogs) ) && !node.hasChildNodes() ) {
e.cancel = true ;
return false ;
}
var r = [];
if (!node.isLeaf()) {
node.cascade( function (n) {
var x = populate(n);
if (x != -1)
r.push(x);
});
}
else
r = populate(node);
grid1.store.add(r);
if ( (node.parentNode != null ) && (remove_catalogs || !node.hasChildNodes()) ) {
node.remove();
}
else {
removeChildNodes(node);
}
return true ;
}
});
* This source code was highlighted with Source Code Highlighter .
рдкрд╣рд▓реЗ, рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд░реВрдЯ рдиреЛрдб рд╣реИ, рдпрд╛ рдХреНрдпрд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рдХреЛрдИ рд╡рдВрд╢рдЬ рдиреЛрдбреНрд╕ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рд╣рдо рдиреЛрдбреНрд╕ рдХреА рд╕реВрдЪреА рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдЧрд░ рдпрд╣ рдПрдХ рдиреЛрдб рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреЛ рдЬреЛрдбрд╝реЗрдВ
var populate = function (node) {
if (!node.isLeaf()) return -1;
var r = new Ext.data.Record();
r.data.name = node.text;
r.data.price = node.attributes.price;
r.data.unit = node.attributes.unit;
return r;
}
* This source code was highlighted with Source Code Highlighter .
рдпрд╣ "рдлрд╝реЛрд▓реНрдбрд░" рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдиреЛрдбреНрд╕ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдЗрд▓рдл () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЧреНрд░рд┐рдб рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдПрдХ рд╕рд░рдгреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (extJS рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛), рдФрд░ рдиреЛрдбреНрд╕ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ
var removeChildNodes = function (node) {
node.expand();
for ( var i = node.childNodes.length - 1; i >= 0; i--) {
var currentNode = node.childNodes[i];
if (currentNode.isLeaf() || remove_catalogs)
node.removeChild(currentNode);
else
removeChildNodes(currentNode);
}
}
* This source code was highlighted with Source Code Highlighter .
рдиреЛрдбреНрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд┐рдП рдмрд┐рдирд╛, рдЙрдирдХрд╛ рдирд┐рд╖реНрдХрд╛рд╕рди рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ - рд▓реВрдк рдкрд╛рд╕ рдореЗрдВ рдиреЛрдбреНрд╕, рд▓реЗрдХрд┐рди рд╣рдЯрд╛рдП рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рд╕рддреНрдп рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдирд╖реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдиреЗ рднреА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд╕рд╛рде рд╣реА рд╣рдЯрд╛рдП рдЧрдП рдЪрд┐рд▓реНрдбреНрд░рди, рдПрдХреНрд╕рдкреЗрд▓реНрдбрд┐рд▓, рдЖрджрд┐ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкрд╛рдВрддрд░ рднреАред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА, рд╕реБрдЭрд╛рд╡ рдФрд░ рд╕рд▓рд╛рд╣ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рдХрд┐ рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рд╕рдВрдмрд▓ рд╕реЗ рд╕реБрдиреВрдВрдЧрд╛ред
рдбреЗрдореЛ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: http://www.linky.ru/~dima4ka/extjs/ (ftp рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдорд┐рддреНрд░ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж), рдЖрдк рд╡рд╣рд╛рдВ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
http://dev.sencha.com/deploy/dev/docs/
http://www.sencha.com/forum/