Class: DcPartRenderer
- Inherits:
-
Object
- Object
- DcPartRenderer
- Includes:
- CmsCommonHelper, DcApplicationHelper
- Defined in:
- app/renderers/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, #json_ld, #menu, #menu_item, #options, #page, #page_title, #part, #parts, #record, #record_footer, #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 CmsCommonHelper
#dc_choices4_field, #dc_choices_for_field, dc_choices_for_field, #dc_date_time, #dc_format_date_time, dc_format_date_time, #dc_format_number, dc_format_number, #dc_help_body, #dc_help_button, #dc_help_fields, #dc_help_for_tab, #dc_icon4_boolean, #dc_icon_for_boolean, #dc_name4_id, #dc_name4_value, #dc_name_for_id, #dc_name_for_value, dc_name_for_value, #dc_steps_menu_get, #t, t, #t_label_for_column, #t_label_for_field, #t_tablename
Methods included from DcApplicationHelper
#_origin, #dc_add2_record_cookie, #dc_add_json_ld, #dc_add_meta_tag, #dc_big_table, #dc_big_table_name_for_value, #dc_choices4, #dc_choices4_all_collections, #dc_choices4_folders_list, #dc_choices4_menu, #dc_choices4_site_policies, #dc_cms_menu, #dc_deprecate, #dc_document_path, #dc_dont?, #dc_edit_mode?, #dc_edit_title, #dc_error_messages_for, #dc_flash_messages, #dc_get_json_ld, #dc_get_link_canonical_tag, #dc_get_seo_meta_tags, #dc_get_site, #dc_icon_for_link, #dc_iframe_edit, #dc_img_alt, #dc_img_alt_tag, #dc_internal_var, #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_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, #dc_warning_messages_for, #decamelize_type
Constructor Details
#initialize(parent, opts = {}) ⇒ DcPartRenderer
Object initialization.
50 51 52 53 54 55 |
# File 'app/renderers/dc_part_renderer.rb', line 50 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>
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'app/renderers/dc_part_renderer.rb', line 129 def default html = "<div class=\"#{@opts[:div_class]}\">" # 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]}", form_name: part[2], table: part[3] ) html << render_particle(part[0], @opts) end end html << "</div>" 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.
162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'app/renderers/dc_part_renderer.rb', line 162 def in_page # Part is in page with id page = if @opts[:page_id] pageclass = @parent.site.page_klass pageclass.find(@opts[:page_id]) # Part is in page with subject link elsif @opts[:page_link] pageclass = @parent.site.page_klass @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, form_name: 'dc_part', table: "#{@parent.site.page_class.underscore};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.
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'app/renderers/dc_part_renderer.rb', line 90 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_class.underscore};#{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.
231 232 233 |
# File 'app/renderers/dc_part_renderer.rb', line 231 def render_css @part_css end |
#render_html ⇒ Object
Renderer dispatcher. Method returns HTML part of code.
223 224 225 226 |
# File 'app/renderers/dc_part_renderer.rb', line 223 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.
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'app/renderers/dc_part_renderer.rb', line 61 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 # =begin 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 =end @part_css << particle.css.to_s html << particle.body end |
#single_sitedoc ⇒ Object
Renderer for single datapage kind of sites.
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'app/renderers/dc_part_renderer.rb', line 188 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, form_name: '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.
207 208 209 210 211 212 213 214 215 216 217 218 |
# File 'app/renderers/dc_part_renderer.rb', line 207 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 |