Class: DcPartRenderer

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

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_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, #t, t, #t_name, #t_tablename

Methods included from DcApplicationHelper

#_origin, #dc_add2_record_cookie, #dc_add_json_ld, #dc_add_meta_tag, #dc_big_table, #dc_choices4, #dc_choices4_all_collections, #dc_choices4_cmsmenu, #dc_choices4_folders_list, #dc_choices4_menu, #dc_choices4_site_policies, #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_seo_meta_tags, #dc_get_site, #dc_icon_for_link, #dc_iframe_edit, #dc_img_alt, #dc_img_alt_tag, #dc_internal_var, #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_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, #forms_merge

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

#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>


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_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.



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_partsObject

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_cssObject

Return CSS part of code.



231
232
233
# File 'app/renderers/dc_part_renderer.rb', line 231

def render_css
  @part_css
end

#render_htmlObject

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_sitedocObject

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_menuObject

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 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