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 | |