OSDN Git Service

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