switching layouts on page form loads proper fields

Oleg committed Sep 02, 2010
commit 38300c1674900022cd067523021bd2cb0c25068f
Showing 12 changed files with 81 additions and 41 deletions
app/controllers/cms_admin/pages_controller.rb +6 -0
@@ @@ -27,6 +27,12 @@ class CmsAdmin::PagesController < CmsAdmin::BaseController
# TODO
end
+ def form_blocks
+ @cms_page = CmsPage.find_by_id(params[:id]) || CmsPage.new
+ @cms_page.cms_layout = CmsLayout.find_by_id(params[:layout_id])
+ @cms_page.initialize_tags
+ end
+
protected
def build_cms_page
app/helpers/cms_helper.rb +29 -0
@@ @@ -5,4 +5,33 @@ module CmsHelper
form_for(record_or_name_or_array, *(args << options.merge(:builder => CmsFormBuilder)), &proc)
end
+ # Helper method for all block tags. You can define your own method based
+ # on tag type. Example:
+ # tag.type = CmsTag::MyAwesomeTag
+ # def my_awesome_tag ... end
+ def cms_block_field(block, *args)
+ block_method = block.type.split('::').last.underscore.downcase
+ return send(block_method, block) if self.respond_to? block_method
+
+ form_method = case block
+ when CmsTag::PageText
+ :text_area_tag
+ when CmsTag::PageString
+ :text_field_tag
+ when CmsTag::PageInteger
+ :number_field_tag
+ end
+
+ %(
+ <div class='form_element #{block_method}_element'>
+ <div class='label'>#{block.label.to_s.titleize}</div>
+ <div class='value'>
+ #{send(form_method, 'cms_page[cms_blocks_attributes][][content]', block.content)}
+ #{hidden_field_tag('cms_page[cms_blocks_attributes][][label]', block.label)}
+ #{hidden_field_tag('cms_page[cms_blocks_attributes][][type]', block.type)}
+ </div>
+ </div>
+ ).html_safe
+ end
+
end
app/views/cms_admin/layouts/_tree_branch.html.erb +1 -3
@@ @@ -2,9 +2,7 @@
<%= link_to tree_branch.label, edit_cms_admin_layout_path(tree_branch) %>
<% if tree_branch.children.count > 0 %>
<ul>
- <% tree_branch.children.each do |child| %>
- <%= render :partial => 'tree_branch', :object => child %>
- <% end %>
+ <%= render :partial => 'tree_branch', :object => tree_branch.children %>
</ul>
<% end %>
</li>
\ No newline at end of file
app/views/cms_admin/layouts/index.html.erb +1 -3
@@ @@ -3,7 +3,5 @@
<%= link_to 'Create New Layout', new_cms_admin_layout_path %>
<ul>
- <% @cms_layouts.each do |layout| %>
- <%= render :partial => 'tree_branch', :object => layout %>
- <% end %>
+ <%= render :partial => 'tree_branch', :collection => @cms_layouts %>
</ul>
\ No newline at end of file
app/views/cms_admin/pages/_form.html.erb +7 -3
@@ @@ -1,10 +1,14 @@
+ <% content_for :head do %>
+ <script type="text/javascript" charset="utf-8">
+ var cms_page_id = <%= @cms_page.new_record?? 0 : @cms_page.id %>;
+ </script>
+ <% end %>
+
<%= form.select :cms_layout_id, CmsLayout.options_for_select, {} %>
<%= form.text_field :label, :id => 'slugify' %>
<%= form.text_field :slug, :id => 'slug' %>
- <% @cms_page.cms_blocks.each do |block| %>
- <%= form.cms_block_field(block) %>
- <% end %>
+ <%= render :partial => 'form_blocks' %>
<h2>Assets</h2>
<%= render :partial => 'cms_admin/assets/index' %>
\ No newline at end of file
app/views/cms_admin/pages/_form_blocks.html.erb +5 -0
@@ @@ -0,0 +1,5 @@
+ <div id='form_blocks'>
+ <% @cms_page.cms_blocks.each do |block| %>
+ <%= cms_block_field(block) %>
+ <% end %>
+ </div>
\ No newline at end of file
app/views/cms_admin/pages/form_blocks.js.erb +1 -0
@@ @@ -0,0 +1 @@
+ $('#form_blocks').replaceWith('<%= escape_javascript(render(:partial => "form_blocks")) %>')
\ No newline at end of file
app/views/cms_admin/pages/index.html.erb +2 -0
@@ @@ -1,3 +1,5 @@
<h1>Pages</h1>
+ <%= link_to 'Create New Page', new_cms_admin_page_path %>
+
<%= debug @cms_pages.all %>
\ No newline at end of file
config/routes.rb +5 -1
@@ @@ -2,7 +2,11 @@ Rails.application.routes.draw do
namespace :cms_admin, :path => 'cms-admin', :except => :show do
resources :layouts
- resources :pages
+ resources :pages do
+ member do
+ match :form_blocks
+ end
+ end
resources :snippets
resources :assets
end
comfortable_mexican_sofa/cms_form_builder.rb b/lib/comfortable_mexican_sofa/cms_form_builder.rb +0 -29
@@ @@ -29,33 +29,4 @@ class CmsFormBuilder < ActionView::Helpers::FormBuilder
"<label for=\"#{object_name}_#{field}\">#{label}</label>".html_safe
end
- # Helper method for all block tags. You can define your own method based
- # on tag type. Example:
- # tag.type = CmsTag::MyAwesomeTag
- # def my_awesome_tag ... end
- def cms_block_field(block, *args)
- block_method = block.type.split('::').last.underscore.downcase
- return send(block_method, block) if self.respond_to? block_method
-
- form_method = case block
- when CmsTag::PageText
- :text_area_tag
- when CmsTag::PageString
- :text_field_tag
- when CmsTag::PageInteger
- :number_field_tag
- end
-
- %(
- <div class='form_element #{block_method}_element'>
- <div class='label'>#{block.label.to_s.titleize}</div>
- <div class='value'>
- #{@template.send(form_method, 'cms_page[cms_blocks_attributes][][content]', block.content)}
- #{@template.hidden_field_tag('cms_page[cms_blocks_attributes][][label]', block.label)}
- #{@template.hidden_field_tag('cms_page[cms_blocks_attributes][][type]', block.type)}
- </div>
- </div>
- ).html_safe
- end
-
end
\ No newline at end of file
public/javascripts/cms/cms.js +2 -2
@@ @@ -1,6 +1,6 @@
$.CMS = function(){
var current_path = window.location.pathname;
-
+
$(document).ready(function(){
// Slugify
$('input#slugify').bind('keyup.cms', function() {
@@ @@ -31,7 +31,7 @@ $.CMS = function(){
// Load Page Blocks on layout change
$('select#cms_page_cms_layout_id').bind('change.cms', function() {
- $.ajax({url: ['/cms-admin/pages', page_id, 'form_blocks'].join('/'), data: ({ layout_id: $(this).val()})})
+ $.ajax({url: ['/cms-admin/pages', cms_page_id, 'form_blocks'].join('/'), data: ({ layout_id: $(this).val()})})
})
}); // End $(document).ready()
test/functional/cms_admin/pages_controller_test.rb +22 -0
@@ @@ -54,4 +54,26 @@ class CmsAdmin::PagesControllerTest < ActionController::TestCase
flunk
end
+ def test_get_form_blocks
+ xhr :get, :form_blocks, :id => cms_pages(:default), :layout_id => cms_layouts(:nested).id
+ assert_response :success
+ assert assigns(:cms_page)
+ assert_equal 2, assigns(:cms_page).cms_blocks.size
+ assert_template 'form_blocks'
+
+ xhr :get, :form_blocks, :id => cms_pages(:default), :layout_id => cms_layouts(:default).id
+ assert_response :success
+ assert assigns(:cms_page)
+ assert_equal 3, assigns(:cms_page).cms_blocks.size
+ assert_template 'form_blocks'
+ end
+
+ def test_get_form_blocks_for_new_page
+ xhr :get, :form_blocks, :id => 0, :layout_id => cms_layouts(:default).id
+ assert_response :success
+ assert assigns(:cms_page)
+ assert_equal 3, assigns(:cms_page).cms_blocks.size
+ assert_template 'form_blocks'
+ end
+
end
\ No newline at end of file