Class: DcPartRenderer
- Inherits:
-
Object
- Object
- DcPartRenderer
- Includes:
- DcApplicationHelper
- Defined in:
- app/helpers/dc_part_renderer.rb
Overview
Renders one or multiple parts grouped by div_id field. Parts are scoped from design, page and dc_pieces documents.
Example (as used in design):
<div id='div-main'>
<div id='div-left'> <%= dc_render(:dc_part, position: 'left') %></div>
<div id='page'> <%= dc_render(:dc_page) %></div>
<div id='div-right'>
<%= dc_render(:dc_part, method: 'in_page', name: 'welcome')
<%= dc_render(:dc_part, position: 'right')</div>
</div>
</div>
Main page division in example is divided into 3 divisions. div-left, page and div-right. div-left and div-right are populated with parts containing ‘left’ and ‘right’ div_id value. In addition part with name ‘welcome’ is located above ‘right’ parts.
Instance Attribute Summary
Attributes included from DcApplicationHelper
#design, #form, #ids, #options, #page, #page_title, #part, #parts, #site, #tables
Instance Method Summary collapse
-
#default ⇒ Object
Default method collects all parts with the div_id field value defined by position option.
-
#in_page ⇒ Object
This method will search and render single part defined in pages file.
-
#initialize(parent, opts = {}) ⇒ DcPartRenderer
constructor
Object initialization.
-
#load_parts ⇒ Object
Load all parts defined in design, page or piece collection into memory.
-
#render_css ⇒ Object
Return CSS part of code.
-
#render_html ⇒ Object
Renderer dispatcher.
-
#render_particle(particle, opts) ⇒ Object
Method returns output from single part(icle).
-
#single_sitedoc ⇒ Object
Renderer for single datapage kind of sites.
-
#single_sitedoc_menu ⇒ Object
Render menu for single datapage kind of sites.
Methods included from DcApplicationHelper
#_origin, #dc_add2_record_cookie, #dc_big_table, #dc_choices4, #dc_choices4_all_collections, #dc_choices4_cmsmenu, #dc_choices4_field, #dc_choices4_folders_list, #dc_choices4_menu, #dc_choices4_site_policies, #dc_date_time, #dc_deprecate, #dc_dont?, #dc_edit_mode?, #dc_edit_title, #dc_error_messages_for, #dc_flash_messages, #dc_format_date_time, #dc_get_site, #dc_icon4_boolean, #dc_iframe_edit, #dc_label_for, #dc_limit_string, #dc_link_for_create, #dc_link_for_edit, #dc_link_for_edit1, #dc_link_menu_tag, #dc_link_to, #dc_menu_class, #dc_name4_id, #dc_name4_value, #dc_new_title, #dc_page_bottom, #dc_page_class, #dc_page_edit_menu, #dc_page_top, #dc_render, #dc_render_design, #dc_render_design_part, #dc_render_from_site, #dc_render_partial, #dc_replace_in_design, #dc_submit_tag, #dc_table_title, #dc_user_can_view, #dc_user_has_role, #decamelize_type, #forms_merge, #t, #t_name, #t_tablename
Constructor Details
#initialize(parent, opts = {}) ⇒ DcPartRenderer
Object initialization.
49 50 51 52 53 54 |
# File 'app/helpers/dc_part_renderer.rb', line 49 def initialize( parent, opts={} ) #:nodoc: @parent = parent @opts = opts @part_css = '' self end |
Instance Method Details
#default ⇒ Object
Default method collects all parts with the div_id field value defined by position option. If more then one parts have same div_id they will be sorted by order field. Method also loads all parts from design, page and pieces collections and cache them for consecutive calls.
Options:
- position
-
String. Position (value of div_id) where parts will be rendered.
Example (as used in design):
<div id='div-right'>
<%= dc_render(:dc_part, position: 'right')
</div>
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
# File 'app/helpers/dc_part_renderer.rb', line 125 def default html = '' # Load all parts only once per call load_parts if @parent.parts.nil? dc_deprecate 'DcPart: Parameter location will be deprecated! Please use position keyword.' if @opts['location'] @opts[:position] ||= @opts['position'] # symbols are not strings. Ensure that it works. # Select parts parts = [] @parent.parts.each { |v| parts << v if v[0].div_id == @opts[:position] } # Edit link @opts[:editparams].merge!( { controller: 'cmsedit', action: 'edit' } ) if parts.size > 0 parts.sort! {|a,b| a[0].order <=> b[0].order } parts.each do |part| @opts[:editparams].merge!( id: part[0], ids: "#{part[1]}", formname: part[2], table: part[3] ) html << render_particle(part[0], @opts) end end html end |
#in_page ⇒ Object
This method will search and render single part defined in pages file. Part may be defined in current page document or in any page document found in pages file. Parameters are send through options hash.
Options:
- name
-
String. dc_parts name.
- page_id
-
String. Page document _id where part document is saved. Defaults to current page.
- page_link
-
String. Page may alternatively be found by subject_link field.
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
# File 'app/helpers/dc_part_renderer.rb', line 158 def in_page # Part is in page with id page = if @opts[:page_id] pageclass = @parent.site.page_table.classify.constantize pageclass.find(@opts[:page_id]) # Part is in page with subject link elsif @opts[:page_link] pageclass = @parent.site.page_table.classify.constantize @page = pageclass.find_by(dc_site_id: @parent.site._id, subject_link: @opts[:page_link]) # Part is in current page else @parent.page end return "Error DcPart: Page not found!" if page.nil? # if part = page.dc_parts.find_by(name: @opts[:name]) @opts[:editparams].merge!(id: part, ids: page._id, formname: 'dc_part', table: "#{@parent.site.page_table};dc_part" ) render_particle(part, @opts) else "Part with name #{@opts[:name]} not found in page!" end end |
#load_parts ⇒ Object
Load all parts defined in design, page or piece collection into memory. Subroutine of default method.
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'app/helpers/dc_part_renderer.rb', line 86 def load_parts #:nodoc: @parent.parts = [] # Start with parts in design. Collect to array and add values needed for editing if @parent.design @parent.design.dc_parts.where(active: true).each do |part| type = decamelize_type(part._type) || 'dc_part' @parent.parts << [part, @parent.design.id, type, "dc_design;#{type}"] end end # add parts in page @parent.page.dc_parts.where(active: true).each do |part| type = decamelize_type(part._type) || 'dc_part' @parent.parts << [part, @parent.page.id, type, "#{@parent.site.page_table};#{type}"] end # add parts in site @parent.site.dc_parts.where(active: true).each do |part| type = decamelize_type(part._type) || 'dc_part' @parent.parts << [part, @parent.site.id, type, "dc_site;#{type}"] end # add parts belonging to site, defined in dc_pieces DcPiece.where(site_id: @parent.site._id, active: true).each do |part| @parent.parts << [part, part._id, 'dc_piece', 'dc_piece'] end end |
#render_css ⇒ Object
Return CSS part of code.
227 228 229 |
# File 'app/helpers/dc_part_renderer.rb', line 227 def render_css @part_css end |
#render_html ⇒ Object
Renderer dispatcher. Method returns HTML part of code.
219 220 221 222 |
# File 'app/helpers/dc_part_renderer.rb', line 219 def render_html method = @opts[:method] || 'default' respond_to?(method) ? send(method) : "Error DcPart: Method #{method} doesn't exist!" end |
#render_particle(particle, opts) ⇒ Object
Method returns output from single part(icle). It checks if policy allows part to be viewed on page and ads links for editing when in edit mode.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'app/helpers/dc_part_renderer.rb', line 60 def render_particle(particle, opts) # Check if policy allows to view page can_view, msg = dc_user_can_view(@parent, particle) return msg unless can_view html = '' if @opts[:edit_mode] > 1 opts[:editparams].merge!(title: "#{t('drgcms.edit')}: #{particle.name}", controller: :cmsedit) html << dc_link_for_edit( opts[:editparams] ) end # if particle.piece_id opts[:id] = particle.piece_id piece = DcPieceRenderer.new(@parent, opts) html << piece.render_html @part_css << piece.render_css else html << particle.body @part_css << particle.css.to_s end html end |
#single_sitedoc ⇒ Object
Renderer for single datapage kind of sites.
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'app/helpers/dc_part_renderer.rb', line 184 def single_sitedoc # if div_id option specified search for part with this div_id. # This can be used to render footer or header of site. part = if @opts[:div_id] @parent.parts.find_by(div_id: @opts[:div_id]) else @parent.part end # part not found. Render error message. return "Part #{@opts[:div_id]} not found!" if part.nil? # prepare edit parameters @opts[:editparams].merge!(id: part, ids: @parent.site._id, formname: 'dc_part', table: "dc_site;dc_part", record_div_id: 'document' ) render_particle(part, @opts) end |
#single_sitedoc_menu ⇒ Object
Render menu for single datapage kind of sites.
203 204 205 206 207 208 209 210 211 212 213 214 |
# File 'app/helpers/dc_part_renderer.rb', line 203 def # prepare div markup = @opts[:menu_div] ? "id=#{@opts[:menu_div]}" : '' html = "<div #{}><ul>\n" # collect all dc_part documents which make menu @parent.parts.where(div_id: 'document').order_by(order: 1).each do |part| # mark selected item selected = (part == @parent.part) ? 'class="menu-selected"' : '' html << "<li #{selected}>#{ @parent.link_to(part.name, part.link ) }</li>\n" end html << "</ul></div>\n" end |