TheSortableTree - рдПрдХ рдордгрд┐ рдЬреЛ рднрдпрд╛рдирдХ_nested_set рдпрд╛ nested_set рд░рддреНрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдП рдЧрдП рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

2008 рдореЗрдВ, рдЬрдм рд╣рдордиреЗ рд░реЗрд▓ рдкрд░ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд╕рд╛рдорд╛рдЬрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рдпрд╛, рддрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ рдмреЗрд╣рддрд░_рдирд┐рд╡реЗрд╢рд┐рдд_рд╕реЗрдЯ рдордгрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ред рдордгрд┐ рд╕реБрдВрджрд░ рдерд╛ (рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрднреА рднреА рд▓рдВрдЧрдбрд╝рд╛ рдерд╛) рдФрд░, рд╢рд╛рдпрдж, рдпрд╣ рдЕрдХреЗрд▓реЗ рдореБрдЭреЗ рдмреБрд░реЗ рд╕рдкрдиреЗ рдХреА рддрд░рд╣, PHP рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рднреВрд▓ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛ред
рд╣рдордиреЗ рдПрдХ рдмрд╣реБ-рд╕реНрддрд░реАрдп рдЯрд┐рдкреНрдкрдгреА рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдордгрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдмрд╛рдд рдереА рд▓реЗрдХрд┐рди ... рдЙрд╕ рдкрд▓ рдореЗрдВ рдПрдХ рднреА рд╕рд╣рд╛рдпрдХ рдирд╣реАрдВ рдерд╛ рдЬреЛ рдЗрди рдкреЗрдбрд╝реЛрдВ рдХреЛ рдЦреАрдВрдЪ рд╕рдХреЗред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ рдореБрдЭреЗ рдЕрдкрдиреА рдмрд╛рдЗрдХреНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВрдиреЗ рдЕрдкрдиреА рдмрд╛рдЗрдХ рднреА рдмрдирд╛рдИред
рдирд╣реАрдВ, рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд╛рдЯрдХреАрдп рдмрдирд╛рдиреЗ рдФрд░ рдЬрдЯрд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рдирд╣реАрдВ рд╣реВрдВред рд╣рдо рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдБ рд╣реИрдВред рддреЛ рдореИрдВрдиреЗ рд╕рдмрд╕реЗ рдЖрдо рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА, рдЬреЛ рдкрд╛рд░реНрд╢рд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкреЗрдбрд╝ рдЦреАрдВрдЪрддрд╛ рд╣реИред
рд╣рд╛рдВ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореЗрд░реА рдЖрд▓реЛрдЪрдирд╛ рдХреА - рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ 10,000 рддрддреНрд╡реЛрдВ рдХреЗ рдкреЗрдбрд╝ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ (рд╕рд╛рдорд╛рдиреНрдп ...
рд╣рд╛рд▓рд╛рдВрдХрд┐, 2008 рдХреЗ рдмрд╛рдж рд╕реЗ, рдореИрдВрдиреЗ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕рд╕реНрддреА, рддреЗрдЬ рдФрд░ рд╕рд░рд▓ред рд╢рд╛рдпрдж рдореИрдВ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ред
рдФрд░ рдЗрд╕рд▓рд┐рдП, рдиреАрдЪреЗ рджреЗрдЦрд╛ рдФрд░ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдПрдХ рд░реВрдорд╛рд▓ рдХреЛ рдЙрдБрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рджрдмрд╛рддреЗ рд╣реБрдП, рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рд░реЗрд▓ рдЗрдВрдЬрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдордгрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдкреБрдирд░реНрдЬрдиреНрдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред
рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдЫреЛрдЯреЗ рдкреЗрдбрд╝реЛрдВ (100 рддрддреНрд╡реЛрдВ рддрдХ) рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдЫреЛрдЯреЗ рд╕реАрдПрдордПрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдЖрдк рдкреЗрдбрд╝ рдХреЛ рдПрдХ рд╕рд░рд▓ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдХреЗ рд╕рд╛рде рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдореЗрд░рд╛ рд╕рд╣рд╛рдпрдХ рд╕рд╣реА рд╣реИред
https://github.com/the-teacher/the_sortable_treeрд╡рд░реНрддрдорд╛рди рдореЗрдВ рджреЛ рдкреНрд░рддрд┐рдкрд╛рджрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- рдЫрдВрдЯрдиреА рдХрд╛ рдкреЗрдбрд╝ (рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕)
- рд╕рд╛рджрд╛ рдкреЗрдбрд╝ (рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕)
рдпрд╣ рд╡рд╣ рд╣реИ рдЬреЛ рдПрдХ рдкреЗрдбрд╝ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрддрд╛ рд╣реИ

рдордгрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рдЕрдкрдирд╛ рд░рддреНрди рдкреВрд░рд╛ рдХрд░реЗрдВред рд╣рдо HAML рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рд╕реЗрдЯ, рдФрд░ the_sortable_tree рдкреНрд░рддрд┐рдкрд╛рджрди рд╕рд╣рд╛рдпрдХред
gem 'haml' gem 'awesome_nested_set'
рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдПрдЪрдПрдПрдордПрд▓ рдкрд░ рдХрдбрд╝реА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рддрд╛рдХрд┐ рдИрдЖрд░рдмреА рдпрд╛ рдПрд╕рдПрд▓рдЖрдИрдПрдо рдкреНрд░рд╢рдВрд╕рдХ рд╕рд╣рд╛рдпрдХ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рд▓реЗрдХрд┐рди рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдЦреБрдж рдХреЛ рдПрдЪрдПрдордПрд▓ рд╕реЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рднреА рдЬреЗрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ
рдПрдкреНрд▓рд┐рдХреЗрд╢рди / рд╕рдВрдкрддреНрддрд┐ / javascripts / application.js //= require jquery //= require jquery-ui //= require jquery_ujs
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрдЬ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдордгрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдореЙрдбрд▓ рдореЗрдВ рдУрд╕реНрдкреНрд░реЗ рдЬреЛрдбрд╝реЗрдВ
class Page < ActiveRecord::Base acts_as_nested_set include TheSortableTree::Scopes end
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдПрдХ рдЯреНрд░реА рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ
class PagesController < ApplicationController include TheSortableTreeController::Rebuild end
рдпрджрд┐ рдЖрдк рдПрдХ рд░рд┐рд╡рд░реНрд╕ рдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдХрднреА-рдХрднреА рдПрдХ рдЙрд▓реНрдЯреЗ рдкреЗрдбрд╝ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдЪрд╛рд░ рдХреА рд╕реВрдЪреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдорд╛рд╡реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
class PagesController < ApplicationController include TheSortableTreeController::ReversedRebuild end
рдорд╛рд░реНрдЧреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВред
рд╣рдореЗрдВ рдкреЗрдбрд╝ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд┐рд╕реЗ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ
: рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВрдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдПрдХ рдкреЗрдбрд╝ рдХреА рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рд╕реНрдерд┐рддрд┐ рд╕реЗ рджреВрд╕рд░реЗ рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рд╣реАрдо рдореЗрдВ рд╕реАрд╡рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
resources :pages do collection do get :manage post :rebuild end end
рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЛрдб рдЦрддреНрдо рдХрд░реЗрдВред
рдкреВрд░реЗ рдкреЗрдбрд╝ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ (рдкреНрд░рддреНрдпрдХреНрд╖ рдирдореВрдирд╛рдХрд░рдг рдЖрджреЗрд╢)
class PagesController < ApplicationController include TheSortableTreeController::Rebuild def manage @pages = Page.nested_set.all end end
рд░рд┐рд╡рд░реНрд╕ рд╕реИрдВрдкрд▓рд┐рдВрдЧ рдСрд░реНрдбрд░
class PagesController < ApplicationController include TheSortableTreeController::ReversedRebuild def manage @pages = Page.reversed_nested_set.all end end
рд╣рдо рдХреЛрдб рдХреЛ рджреГрд╢реНрдп рдореЗрдВ рд░рдЦрдХрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдХреЗ рд▓рд┐рдП рдкреЗрдбрд╝ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред
- content_for :css do = stylesheet_link_tag 'the_sortable_tree', :media => :screen - content_for :js do = javascript_include_tag 'jquery.ui.nestedSortable' = sortable_tree @pages, :new_url => new_page_path, :max_levels => 4
рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рдПрдВред
- content_for :css do = stylesheet_link_tag 'the_sortable_tree_min', :media => :screen = sortable_tree @pages, :new_url => new_page_path, :path => 'the_sortable_tree_min'
Content_for: css рдФрд░
content_for: js рдХреЗ рд▓рд┐рдП рдХрд╛рдо
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рд▓реЗрдЖрдЙрдЯ / application.xxx рдореЗрдВ рдЙрдкрдЬ (: js) рдФрд░
рдЙрдкрдЬ (: css) рдЬреЛрдбрд╝реЗрдВ ред
рдмреЗрд╢рдХ, рдЖрдк рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ js рдФрд░ css рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣ рдЖрдкрдХреЗ рдКрдкрд░ рд╣реИред
рд╡рд╣ рд╕рдм рд╣реИ! рдкреЗрдбрд╝ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдФрд░ рдЦреАрдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ
LiveDemo рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред
рдЕрдиреБрдХреВрд▓рди рдкреНрд░рджрд░реНрд╢рди
рд╡реНрдпреВ рдЬреЗрдирд░реЗрдЯрд░ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЗрд╕реЗ рдХрдВрдЯреНрд░реЛрд▓рд░ рдХрд╛ рдирд╛рдо рджреЗрдВред
rails g the_sortable_tree:views pages
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЯреНрд░реА рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рдиреНрдпреВрдирддрдо рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
rails g the_sortable_tree:views pages min
рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рд╣рд╛рдпрдХ рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рд╡реЗ рдХрд╣рд╛рдВ рд╣реИрдВ:
= sortable_tree @pages, :new_url => new_page_path, :path => 'pages/the_sortable_tree'
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдореЙрдбрд▓реЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред
https://github.com/the-teacher/the_sortable_treeрдкреБрдирд╢реНрдЪ: рдпрджрд┐ рдЖрдкрдХреЛ рд╕реНрдкреЗрд▓рд┐рдВрдЧ рдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рддреНрд░реБрдЯрд┐, рдХреЛрдб рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдкреАрдПрдо рдореЗрдВ рдмрддрд╛рдПрдВ, рдореИрдВ рдЖрдкрдХрд╛ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред рдЕрдЧреНрд░рд┐рдо рдзрдиреНрдпрд╡рд╛рдж!