Class: DcPartRenderer

Inherits:
Object
  • Object
show all
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

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

#defaultObject

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_pageObject

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_partsObject

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_cssObject

Return CSS part of code.



227
228
229
# File 'app/helpers/dc_part_renderer.rb', line 227

def render_css
  @part_css
end

#render_htmlObject

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_sitedocObject

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_menuObject

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 single_sitedoc_menu
# prepare div markup
  menu_div = @opts[:menu_div] ? "id=#{@opts[:menu_div]}" : ''
  html = "<div #{menu_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