OSDN Git Service

rename model name
[pettanr/pettanr.git] / lib / locmare / form.rb
1 require_dependency "locmare/form/field"
2 require_dependency "locmare/form/extend_field"
3
4 module Locmare
5   class FormBase
6     include FormModule
7     attr :manifest, :form_name, :item, :mounted, :operators, :template_dir, 
8       :fields
9     def initialize form_name_with_sub_form, item, mounted, operators
10       if form_name_with_sub_form =~ /\./
11         @sub_form_names = form_name_with_sub_form.split '.'
12         @form_name = @sub_form_names.last
13         @root_form_name = @sub_form_names.shift
14       else
15         @sub_form_names = []
16         @form_name = form_name_with_sub_form
17         @root_form_name = @form_name
18       end
19       @item = item
20       @mounted = mounted
21       @operators = operators
22       
23       @manifest = LocalManifest.manifest.forms[@form_name]
24       @template_dir = 'templates/r/form/'
25       @fields = {}
26     end
27     
28     def fold_extend_settings params
29       @item.class.fold_extend_settings params[@item.item_name]
30     end
31     
32     def sub_form_name
33       @sub_form_names.map{|name| '[' + name + '_attributes' + ']'}.join
34     end
35     
36     def form_field_name field_name
37       @root_form_name + self.sub_form_name + '[' + field_name + ']'
38     end
39     
40     def each_field
41       @manifest.field_names.each do |field_name| 
42         yield field_name, @fields[field_name]
43       end
44     end
45     
46     def template_file_name
47       "form"
48     end
49     
50     def template_name
51       self.template_dir + self.template_file_name
52     end
53     
54     def fields_template_name
55       self.template_dir + 'fields'
56     end
57     
58     def image_dir
59       '/images/'
60     end
61     
62   end
63   
64   class Form < FormBase
65     attr :submit
66     
67     def initialize form_name, item, mounted, submit, operators
68       super form_name, item, mounted, operators
69       @submit = submit
70       @item.boosts 'post'
71       self.init_fields
72     end
73     
74     def init_fields
75       @manifest.each_field do |field_name, field_manifest|
76         boost_name = @item.class.find_boost_name(field_name)
77         extend_model = if boost_name 
78           @item.boosters[boost_name].extend_model
79         else
80           nil
81         end
82         if boost_name and extend_model # field is extend setting AND template has a extend model
83           extend_form_name = @item.boosters[boost_name].item_name
84           extend_item = @item.boosters[boost_name].extend_item
85           @fields[field_name] = ExtendForm.new self, extend_form_name, extend_item, @mounted, @operators, field_name
86         else
87           @fields[field_name] = Field.new self, field_name, field_manifest
88         end
89       end
90     end
91     
92     def submit_name
93       if @item.new_record?
94         @item.table_name + '.submit.new'
95       else
96         @item.table_name + '.submit.edit'
97       end
98     end
99     
100     def submit_template_dir
101       self.template_dir + 'submit/'
102     end
103     
104     def submit_template_name
105       if @submit
106         self.submit_template_dir + 'submit'
107       else
108         self.submit_template_dir + 'none'
109       end
110     end
111     
112   end
113   
114   class ExtendForm < FormBase
115     include FieldModule
116     attr :parent, :field_name, :field, :label
117     
118     def initialize parent, form_name, item, mounted, operators, field_name
119       @parent = parent
120       @field_name = field_name
121       super form_name, item, mounted, operators
122       @field = Field.new @parent, @field_name, @parent.manifest.fields[@field_name]
123       @label = @field.label
124       self.init_fields
125     end
126     
127     def init_fields
128       @manifest.each_field do |field_name, field_manifest| 
129         @fields[field_name] = ExtendField.new self, field_name, field_manifest
130       end
131     end
132     
133     def form_field_name extend_field_name
134       # parent is field
135       @parent.form_field_name(@field_name)  + '[' + extend_field_name + ']'
136     end
137     
138     def template_file_name
139       "extend_form"
140     end
141     
142     def template_option
143       {:form=> self}
144     end
145     
146   end
147   
148 end
149