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, #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).
Methods included from DcApplicationHelper
#_origin, #dc_add2_record_cookie, #dc_big_table, #dc_choices4, #dc_choices4_all_collections, #dc_choices4_cmsmenu, #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_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_name4_id, #dc_name4_value, #dc_new_title, #dc_page_class, #dc_page_edit_menu, #dc_render, #dc_render_design, #dc_replace_in_design, #dc_submit_tag, #dc_table_title, #dc_user_can_view, #dc_user_has_role, #decamelize_type, #forms_merge, #iframe_edit1, #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>
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'app/helpers/dc_part_renderer.rb', line 120 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 in 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.
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'app/helpers/dc_part_renderer.rb', line 153 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 |
# 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 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.
187 188 189 |
# File 'app/helpers/dc_part_renderer.rb', line 187 def render_css @part_css end |
#render_html ⇒ Object
Renderer dispatcher. Method returns HTML part of code.
179 180 181 182 |
# File 'app/helpers/dc_part_renderer.rb', line 179 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 |