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

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


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

Return CSS part of code.



187
188
189
# File 'app/helpers/dc_part_renderer.rb', line 187

def render_css
  @part_css
end

#render_htmlObject

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