7 рдорд┐рдирдЯ рдореЗрдВ ExtJS / рд░реЗрд▓ CRUD рдРрдк

рдпрд╣ рдкреЛрд╕реНрдЯ рдЖрдкрдХреЛ рдПрдХреНрдЬреЛрдЬрд╝, рд░реВрдмреА рдСрди рд░реЗрд▓реНрд╕ рдПрдВрдб рдиреЗрдЯреНрдЬрд╝рдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TODO рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдХрджрдо рджрд┐рдЦрд╛рдПрдЧреАред рдЖрдкрдХреЛ рд▓рдЧрднрдЧ 7 рдорд┐рдирдЯ рд▓рдЧреЗрдВрдЧреЗ, рдФрд░ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЙрддреНрд╕реБрдХ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рддреЛ рддреБрд░рдВрдд рдЕрдВрддрд┐рдо рднрд╛рдЧ рджреЗрдЦреЗрдВ (рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рддрд░реАрдХрд╛), рдЬрд╣рд╛рдВ рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ TODO рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ, рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЪрд┐рдиреНрд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реЙрд░реНрдЯ рдФрд░ рдЦреЛрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рдЖрдк рдЕрдкрдиреА рдШрдбрд╝реА рдкрд░ рд╕рдордп рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рдЬрдм рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рд░реЗрд▓реНрд╕ 3.0.1, рдиреЗрдЯрдЬрд╝рдХреЗ-рдХреЛрд░ 0.6.2, рдиреЗрдЯрдЬрд╝рдХреЗ-рдмреЗрд╕рдкреИрдХ 0.6.1, рд░реВрдмреА 1.9.2, рдПрдХреНрд╕рдЯреНрд░реАрдо 3.3.0ред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг


рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдирд╛:
> rails new netzke_task_manager && cd netzke_task_manager

Netzke Gems рдХреЛ рдЕрдкрдиреЗ Gemfile рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 gem 'netzke-core', :git => "git://github.com/skozlov/netzke-core.git" gem 'netzke-basepack', :git => "git://github.com/skozlov/netzke-basepack.git" 

рдпрджрд┐ рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ рдкреЗрдЬреЗрд╢рди рд╕рдВрдмрдВрдзрд┐рдд рддреНрд░реБрдЯрд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рд╕рдорд╛рдзрд╛рди рдЦреЛрдЬрдиреЗ рддрдХ will_paginate рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ:
 gem 'will_paginate', '~>3.0.pre2' 

рд░рддреНрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
bundle install

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлреИрдорд┐рд▓реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, FamFamFam рд╕реЗ рдЖрдЗрдХрди рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ:
> ln -s ~/code/extjs/ext-3.3.0 public/extjs
> ln -s ~/assets/famfamfam-silk public/images/icons

рдиреЗрдЯрдЬрд╝рдХреЗ рдФрд░ рд░реВрдЯ рд░реВрдЯ рдЬреЛрдбрд╝реЗрдВ:
 NetzkeTaskManager::Application.routes.draw do netzke root :to => "welcome#index" # ... end 

рдПрдХ рд╕реНрд╡рд╛рдЧрдд рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдПрдБ:
> rails g controller welcome index
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / index.html рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦреЗрдВред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ, рдорд╛рдирдХ JavaScript рдФрд░ CSS рд▓рд┐рдВрдХ рдХреЛ netzke_init рд╣реЗрд▓реНрдкрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
 <!DOCTYPE html> <html> <head> <title>Netzke Task Manager</title> <%= netzke_init %> <%= csrf_meta_tag %> </head> <body> <%= yield %> </body> </html> 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ netzke_init рдЖрдкрдХреЛ рд╕рднреА Ext рдФрд░ Netzke JS рдФрд░ CSS рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
3 рдорд┐рдирдЯ рдмреАрдд рдЪреБрдХреЗ рд╣реИрдВ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред

рдореЙрдбрд▓ рдирд┐рд░реНрдорд╛рдг


рдЖрдЗрдП рдлрд╝реАрд▓реНрдб рдирд╛рдо, рдкреНрд░рд╛рдердорд┐рдХрддрд╛, рдиреЛрдЯреНрд╕, рдирд┐рдпрдд рддрд╛рд░реАрдЦ рдФрд░ "рдХрд┐рдП рдЧрдП" рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд╛рд╕реНрдХ рдореЙрдбрд▓ рдмрдирд╛рдПрдВ:
> rails g model Task done:boolean name:string notes:text priority:integer due:date
рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ (db / migrate / xxx_create_tasks.rb) рддрд╛рдХрд┐ "рдХрд┐рдпрд╛ рдЧрдпрд╛" рдзреНрд╡рдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рдП:
 t.boolean :done, :default => false 


рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░реЗрдВ:
rake db:migrate

рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╣рдореЗрд╢рд╛ рдХрд┐рд╕реА рддрд░рд╣ рдХрд╛ рдирд╛рдо рд╣реЛ, рддреЛ рдЖрдЗрдП рдЙрдЪрд┐рдд рд╕рддреНрдпрд╛рдкрди рдЬреЛрдбрд╝реЗрдВред рдФрд░ рдХреЗрд╡рд▓ рдЕрдзреВрд░реЗ рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП default_scope рд╕реЗрдЯ рдХрд░реЗрдВ:
 class Task < ActiveRecord::Base validates_presence_of :name default_scope :conditions => {:done => false} end 

Netzke рдЧреНрд░рд┐рдб рдкреИрдирд▓ рдЬреЛрдбрд╝рдирд╛


рд╣рдорд╛рд░реЗ рдореЙрдбрд▓ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реНрдЯ рдЯреЗрдмрд▓ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдмрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╡рд┐рдЪрд╛рд░ / рд╕реНрд╡рд╛рдЧрдд / index.html.erb рдореЗрдВ Netzke рдЧреНрд░рд┐рдбрдбреЗрд▓ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
 <%= netzke :tasks, :class_name => "Basepack::GridPanel", :model => "Task" %> 

рдЪрд▓реЛ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
> rails s

... рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдкрд░ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: 3000 /:

рдпрд╣ рд╕рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рднреНрдп рджрд┐рдЦрддрд╛ рд╣реИред рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдПрдХ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╕реВрдЪреА рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдПрдВ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рд╕рдордп рд╣реИред

Netzke :: Basepack :: GridPanel рдХреЗ рд╕рд╛рде, рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдХреЙрд▓рдо рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВ)ред рдЖрдЗрдП 2 рд╕рд░рд▓ рдЪреАрдЬреЗрдВ рдХрд░рддреЗ рд╣реИрдВ: 1) рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХреМрди рд╕реЗ рдХреЙрд▓рдо рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рдФрд░ рдЕрдкрдбреЗрдЯ рдХреА рдЧрдИ_рдЯреЗрд▓реНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдФрд░ 2) "рджреЗрдп" рдХреЙрд▓рдо рд╣реЗрдбрд┐рдВрдЧ рдХреЛ "рдбреНрдпреВ рдСрди" рдкрд░ рдмрджрд▓реЗрдВред
 <%= netzke :tasks, :class_name => "Basepack::GridPanel", :model => "Task", :columns => [:done, :name, :notes, :priority, {:name => :due, :header => "Due on"}] %> 

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ред рд╢реЗрд╖ 2 рдорд┐рдирдЯреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо, рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рджреГрд╢реНрдп рд╕рдВрд╢реЛрдзрди рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓рд┐рдП, рдЗрд╕ рдореЛрдЯреА рдиреАрд▓реА рд╣реИрдбрд░ рдХреЗ рдмрд┐рдирд╛, рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде, рд╢реАрд░реНрд╖ рдХреЗ рдиреАрдЪреЗ, рдкреГрд╖реНрда рдХреЗ рдордзреНрдп рдореЗрдВ рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХреБрдЫ рд╕реНрддрдВрднреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪреМрдбрд╝рд╛рдИ рднреА рд╕реЗрдЯ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕рдВрдкреВрд░реНрдг рдЪреМрдбрд╝рд╛рдИ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрдВрдЧреЗред

рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдкреГрд╖реНрда рдХреЗ рдордзреНрдп рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЬрд▓реНрджреА рд╕реЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдХреБрдЫ net рд╕реНрдЯрд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ (netzke_init рд╕рд╣рд╛рдпрдХ рдХреЗ рдмрд╛рдж):
 <style type="text/css" media="screen"> h1 { text-align: center; margin: 10px;} .netzke-component { width: 700px; margin: auto; } </style> 

рдирд╛рдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдлреНрд░реЗрдо рдХреЛ рдЪрд╛рд▓реВ рдХрд░реЗрдВ рдФрд░ рд╣реЗрдбрд░ рдХреЛ рдмрдВрдж рдХрд░реЗрдВ:
 <h1>Incomplete tasks</h1> <%= netzke :tasks, :class_name => "Basepack::GridPanel", :model => "Task", :columns => [:id, :done, :name, {:name => :notes, :width => 200}, {:name => :priority, :width => 50}, {:name => :due, :header => "Due on"} ], # Standard Ext.grid.EditorGridPanel configuration options: :border => true, :header => false, :view_config => { :force_fit => true # force the columns to occupy all the available width } %> 

рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ! рдЕрдкрдиреА рдШрдбрд╝реА рдмрдВрдж рдХрд░реЛ, рдФрд░ рдЪрд▓реЛ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛:


рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдЪрд░реНрдЪрд╛


рдЪреВрдВрдХрд┐ рдиреЗрдЯрдЬрд╝рдХреЗ :: рдмреЗрд╕реЗрдкреИрдХ :: рдЧреНрд░рд┐рдбрдкреИрдирд▓ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдШрдЯрдХ рд╣реИ, рд╣рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рд╛ рд╣реИред

рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдХрд╛ рд╕рдВрдкрд╛рджрди

рд░рд┐рдХреЙрд░реНрдб рдЬреЛрдбрд╝рдирд╛, рдмрджрд▓рдирд╛ рдФрд░ рд╣рдЯрд╛рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛

рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдкрдХреА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣рдЬрд╛рд░реЛрдВ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ, рддреЛ рдпрд╣ рдиреЗрдЯрдЬрд╝рдХреЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреИрдЧрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рдкреНрд░рд╕рдВрдЧ рдореЗрдиреВ

рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдиреАрдЪреЗ рд╕реНрдерд┐рдд рдмрдЯрдиреЛрдВ рдХреА рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдореЗрдВ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ

рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рд╣рдо рдЯрд╛рд╕реНрдХ рдореЙрдбрд▓ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ, рдмреВрд▓рд┐рдпрди, рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдЯреЗрдХреНрд╕реНрдЯ рдФрд░ рджрд┐рдирд╛рдВрдХ рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрддрдВрдн рдкреНрд░рдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрддреНрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рд╕рддреНрдпрд╛рдкрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рд░реЗрд▓ рд╕рддреНрдпрд╛рдкрди рдХреЛ рд╕рдорд░реНрдерди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХрдИ рд╕рдВрдкрд╛рджрдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ!


рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдЫрдБрдЯрд╛рдИ

рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рд╣реЗрдбрд┐рдВрдЧ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ:


рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ

рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЙрд▓рдо рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рд╕реНрдорд╛рд░реНрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕рдХреНрд╖рдо рд╣реЛрддреЗ рд╣реИрдВред
рджрд┐рдирд╛рдВрдХ рдЙрджрд╛рд╣рд░рдг:

рдкреНрд░рд╛рдердорд┐рдХрддрд╛:


рдкреНрд░рдкрддреНрд░ рдореЗрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛ / (рдмрд╣реБ) рдХрд░рдирд╛

рдХрднреА-рдХрднреА рдХрд┐рд╕реА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ / рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдлрд╝реЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдиреЗрдЯрдЬрд╝рдХреЗ рдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рдЕрд╡рд╕рд░ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╣реБ-рд╕рдВрдкрд╛рджрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ "рдлреЙрд░реНрдо рдореЗрдВ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред


рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрдирдд рдЦреЛрдЬ



рдФрд░ рдЕрдзрд┐рдХ ...

рдпрд╣ рд▓реЗрдЦ рдХрд╡рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдиреЗрдЯрдЬрд╝рдХреЗ рдЧреНрд░рд┐рдб рдкреИрдирд▓ рдПрдХ-рд╕реЗ-рдХрдИ ("рдЕрдВрддрд░реНрдЧрдд_рддреЛ") рд╕рдВрдЪрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ (рдиреАрдЪреЗ рдбреЗрдореЛ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ)ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЖрдкрдиреЗ рдЙрди рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕реАрдЦрд╛ рд╣реИ рдЬреЛ Netzke рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ Netzke :: Basepack :: GridPanel, рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдФрд░ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдШрдЯрдХ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ RIA рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдбреЗрдореЛ рдореЗрдВ рдЧреНрд░рд┐рдбрдкреИрдирд▓ рдФрд░ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореВрд▓ рд░реВрдк рд╕реЗ, рдиреЗрдЯрдЬрд╝рдХреЗ рдХреА рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рдереА рдЬреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЦрд░реЛрдВрдЪ рд╕реЗ, рдпрд╛ рдореМрдЬреВрджрд╛ рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред

рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдореЗрд░рд╛ рдЕрдиреБрд╕рд░рдг рдХрд░реЗрдВ рдФрд░ рдиреЗрдЯрдЬрд╝рдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдХрд░реЗрдВ, рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХреЛ рдмреБрдХрдорд╛рд░реНрдХ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
Netzke рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ Google рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ, рдФрд░ (рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо), рдХреГрдкрдпрд╛ рдпрд╛рдж рд░рдЦреЗрдВ: Netzke рдПрдХ рдмрд╣реБрдореБрдЦреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬрд╣рд╛рдВ рдПрдХ рдмрдбрд╝реЗ рд╕рдореБрджрд╛рдп рдХрд╛ рдЕрд░реНрде рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рд╣реЛрдЧрд╛ред рдзрдиреНрдпрд╡рд╛рдж!

UPD d43 рдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐ рдПрдХреНрд╕рдЯрдЬ 4 рдХреЗ рд╕рд╛рде рдбреЗрдореЛ рдХрд╣рд╛рдБ рджреЗрдЦреЗрдВред

Source: https://habr.com/ru/post/In133935/


All Articles