drg_cms 0.6.0.1 → 0.6.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/drg_cms/drg_cms.js +54 -7
  3. data/app/assets/javascripts/drg_cms_application.js +1 -1
  4. data/app/assets/javascripts/drg_cms_cms.js +1 -1
  5. data/app/assets/stylesheets/drg_cms/drg_cms.css +32 -1
  6. data/app/controllers/cmsedit_controller.rb +49 -18
  7. data/app/controllers/dc_application_controller.rb +82 -21
  8. data/app/controllers/dc_common_controller.rb +64 -5
  9. data/app/forms/all_options.yml +2 -0
  10. data/app/forms/dc_ad.yml +11 -22
  11. data/app/forms/dc_design.yml +13 -13
  12. data/app/forms/dc_json_ld.yml +59 -0
  13. data/app/forms/dc_key_value.yml +32 -0
  14. data/app/forms/dc_menu_item.yml +1 -0
  15. data/app/forms/dc_page.yml +1 -5
  16. data/app/forms/dc_seo.yml +33 -0
  17. data/app/forms/json_ld_schema.yml +168 -0
  18. data/app/helpers/cmsedit_helper.rb +29 -24
  19. data/app/helpers/dc_application_helper.rb +105 -4
  20. data/app/models/concerns/dc_page_concern.rb +30 -5
  21. data/app/models/concerns/dc_seo_concern.rb +66 -0
  22. data/app/models/dc_design.rb +2 -0
  23. data/app/models/dc_json_ld.rb +152 -0
  24. data/app/models/dc_key_value.rb +48 -0
  25. data/app/models/dc_page.rb +0 -1
  26. data/app/models/drgcms_form_fields/hash_field.rb +86 -0
  27. data/app/models/drgcms_form_fields/select.rb +48 -15
  28. data/app/models/drgcms_form_fields/text_autocomplete.rb +14 -2
  29. data/app/models/drgcms_form_fields/tree_select.rb +4 -1
  30. data/app/{helpers → renderers}/dc_ad_renderer.rb +0 -0
  31. data/app/{helpers → renderers}/dc_big_menu_renderer.rb +0 -0
  32. data/app/{helpers → renderers}/dc_captcha_renderer.rb +0 -0
  33. data/app/{helpers → renderers}/dc_common_renderer.rb +0 -0
  34. data/app/{helpers → renderers}/dc_gallery_renderer.rb +0 -0
  35. data/app/{helpers → renderers}/dc_menu_renderer.rb +10 -4
  36. data/app/{helpers → renderers}/dc_page_renderer.rb +0 -0
  37. data/app/{helpers → renderers}/dc_part_renderer.rb +4 -4
  38. data/app/{helpers → renderers}/dc_piece_renderer.rb +0 -0
  39. data/app/{helpers → renderers}/dc_poll_renderer.rb +13 -5
  40. data/app/{helpers → renderers}/dc_renderer.rb +0 -0
  41. data/app/{helpers → renderers}/dc_simple_menu_renderer.rb +0 -0
  42. data/app/views/cmsedit/_edit_stuff.html.erb +3 -22
  43. data/config/locales/drgcms_en.yml +3 -1
  44. data/config/locales/drgcms_sl.yml +2 -0
  45. data/config/locales/models_en.yml +38 -6
  46. data/config/locales/models_sl.yml +39 -7
  47. data/lib/drg_cms.rb +2 -1
  48. data/lib/drg_cms/version.rb +1 -1
  49. metadata +22 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: de756db4ff8ac1e6dbe88ef41e0d6dd213dbf20c91c7e2ec20b9cacdc5f80a1b
4
- data.tar.gz: 64f7ac1107e10c095e6aa6a60308ae27622b10909c5e5ca529fd74e541e591d3
3
+ metadata.gz: 4b6e9f20a0a4ab04d8c5faa736a556f29a9a9709a324fb5438e66f4563c985de
4
+ data.tar.gz: e6c20a842d10be10c73a4d3129caafc43445a6552d0f6cbabd981b05981d20f2
5
5
  SHA512:
6
- metadata.gz: 7fbfc08b2186e653b4a4cd09b21b9ff2435a5e14622559a4ae2301b41a59189fba6fb455cf67a93feff1676ed016f21dc8b47691e36337ae0ff9968bedc229d4
7
- data.tar.gz: 2a7f6bcc224965503f491b50b598d4e45bc60e7cdb6524b29ed85c3f51ad3d3b096f1d62f50d9fa945995f64717db09365c5c36788be4cd51aa613e9dd1d7644
6
+ metadata.gz: fd974c1b182db06f63cd0f7673b979bbbb4a0c0d2b200e9f6cd9fe428dfabc3d879348046882e97a7400e41961bfe6cbea4c147193bb0de2aca50e2bdbb7b738
7
+ data.tar.gz: bd4a6d8897a424ea22b403f70f4b4a12228798564ebe0023f5596e6a987de798ca304ee25c590966e688ba5588243ee566b6d4d897127ef37350b0c0aef55526
@@ -28,6 +28,7 @@
28
28
  *******************************************************************/
29
29
  $.getUrlParam = function(name) {
30
30
  var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
31
+ if (results == null) return null;
31
32
  return results[1] || 0;
32
33
  };
33
34
 
@@ -52,6 +53,31 @@ remove_background_from_iframe = function(obj) {
52
53
  $(head).append(css);
53
54
  };
54
55
 
56
+ /*******************************************************************
57
+ * Will update select field on the form which select options are dependend on other field
58
+ *******************************************************************/
59
+ update_select_depend = function(select_name, depend_name, method) {
60
+ var select_field = $('#'+select_name);
61
+ var depend_field = $('#'+depend_name);
62
+ /*
63
+ $.ajax({
64
+ url: "/dc_common/autocomplete",
65
+ type: "POST",
66
+ dataType: "json",
67
+ data: { input: request.term, table: "#{table}", search: "#{search}" #{(',id: "'+@yaml['id'] + '"') if @yaml['id']} },
68
+ success: function(data) {
69
+ response( $.map( data, function(key) {
70
+ return key;
71
+ }));
72
+ }
73
+ });
74
+ */
75
+
76
+ };
77
+
78
+ /*******************************************************************
79
+ * Format number input field according to data
80
+ *******************************************************************/
55
81
  format_number_field = function(e) {
56
82
  var decimals = e.attr("data-decimal") || 2;
57
83
  var delimiter = e.attr("data-delimiter") || '.';
@@ -99,10 +125,10 @@ $(function() {
99
125
  *
100
126
  * Protocol consists of operation and value which are returned as json by
101
127
  * called controller. Controller will return an ajax call usually like this:
102
- * render json: {operation: value}.to_json
128
+ * render json: {operation: value}
103
129
  *
104
130
  * Operation is further divided into source and determinator which are divided by underline char.
105
- * render json: {#div_status: 'OK!'}.to_json
131
+ * render json: {#div_status: 'OK!'}
106
132
  * will replace html in div="status" with value 'OK!'. Source is '#div' determinator is 'status'.
107
133
  *
108
134
  * Possible operators are:
@@ -144,7 +170,7 @@ process_json_result = function(json) {
144
170
  operation = key;
145
171
  what = '';
146
172
  }
147
- //
173
+ //
148
174
  switch (operation) {
149
175
  // update field
150
176
  case 'record':
@@ -195,6 +221,9 @@ process_json_result = function(json) {
195
221
  w = window.open(val, what);
196
222
  w.focus();
197
223
  break;
224
+ case 'eval':
225
+ eval (val);
226
+ break;
198
227
  case 'reload':
199
228
  location.reload();
200
229
  break;
@@ -248,6 +277,13 @@ $(document).ready( function() {
248
277
  // select_first_input_field('.dc-form');
249
278
  }
250
279
  */
280
+ /*******************************************************************
281
+ * It will scroll display to ypos if return_to_ypos parameter is present
282
+ *******************************************************************/
283
+ if (window.location.href.match(/return_to_ypos=/))
284
+ {
285
+ window.scrollTo(0, $.getUrlParam('return_to_ypos'));
286
+ }
251
287
 
252
288
  /*******************************************************************
253
289
  * Register ad clicks
@@ -257,6 +293,17 @@ $(document).ready( function() {
257
293
  return true;
258
294
  });
259
295
 
296
+ /*****************************************************************
297
+ * Toggle CMS mode. When clicked on left 30 pixels, window will be scrolled approximately
298
+ * to the position wher toggle was clicked. When clicked from pixel 31 and on it will
299
+ * stay on the top of window.
300
+ ******************************************************************/
301
+ $('.cms-toggle').bind('click', function(e) {
302
+ var url = '/dc_common/toggle_edit_mode?return_to=' + window.location.href;
303
+ if (e.pageX < 30) url = url + '&return_to_ypos=' + e.pageY ;
304
+ window.location.href = url;
305
+ });
306
+
260
307
  /*******************************************************************
261
308
  * Popup or close CMS edit menu on icon click
262
309
  *******************************************************************/
@@ -319,7 +366,7 @@ $(document).ready( function() {
319
366
  * Resize iframe_cms to the size of its contents. Make at least 500 px high
320
367
  * unless on initial display.
321
368
  *******************************************************************/
322
- $('#iframe_cms').load( function() {
369
+ $('#iframe_cms').on('load', function() {
323
370
  // alert('bla 1');
324
371
  new_height = this.contentWindow.document.body.offsetHeight + 50;
325
372
  if (new_height < 500 && new_height > 60) new_height = 500;
@@ -332,7 +379,7 @@ $(document).ready( function() {
332
379
  * Same goes for editiframe. Resize it + 30px
333
380
  * unless on initial display with no data
334
381
  *******************************************************************/
335
- $('#iframe_edit').load( function() {
382
+ $('#iframe_edit').on('load', function() {
336
383
  // console.log(this.contentWindow.document.body.offsetHeight);
337
384
  if (this.contentWindow.document.body.offsetHeight > 10) {
338
385
  this.style.height = (this.contentWindow.document.body.offsetHeight + 30) + 'px';
@@ -534,7 +581,7 @@ element = $(this).find(':first').attr('id');
534
581
  /*******************************************************************
535
582
  * Experimental. Force reload of parent page if this div appears.
536
583
  *******************************************************************/
537
- $('#div-reload-parent').load( function() {
584
+ $('#div-reload-parent').on('load', function() {
538
585
  // alert('div-reload-parent 1');
539
586
  parent.location.href = parent.location.href;
540
587
  });
@@ -544,7 +591,7 @@ element = $(this).find(':first').attr('id');
544
591
  *
545
592
  * Just an Idea. Not needed yet.
546
593
  *******************************************************************/
547
- $('#div-reload').load( function() {
594
+ $('#div-reload').on('load', function() {
548
595
  alert('div-reload 1');
549
596
  // location.href = location.href;
550
597
  });
@@ -4,7 +4,7 @@
4
4
  // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
5
5
  // the compiled file.
6
6
  //
7
- //= require jquery2
7
+ //= require jquery3
8
8
  //= require drg_cms/jquery-migrate
9
9
  //= require jquery_ujs
10
10
  //= require drg_cms/drg_cms
@@ -5,7 +5,7 @@
5
5
  // the compiled file.
6
6
 
7
7
  //= #require_self
8
- //= require jquery2
8
+ //= require jquery3
9
9
  //= require drg_cms/jquery-migrate.js
10
10
  //= require jquery_ujs
11
11
 
@@ -647,8 +647,39 @@ padding: 5px 0;
647
647
  border-top: 2px solid #ddd;
648
648
  }
649
649
 
650
+ /*** CMS toggle button */
651
+ .cms-toggle {
652
+ z-index: 1000000;
653
+ position: fixed;
654
+ top: 1px; left: 1px;
655
+ padding: 4px;
656
+ color: #fff;
657
+ background-color: #000;
658
+ font-weight: bold;
659
+ font-size: 14px;
660
+ box-shadow: 2px 2px 6px #666;
661
+ border-radius: 3px;
662
+ }
663
+
664
+ .cms-toggle:hover {
665
+ color: #000;
666
+ background-color: #fff;
667
+ cursor: pointer;
668
+ }
669
+
670
+ .cms-toggle.mode-1:before {
671
+ font-family: 'FontAwesome';
672
+ content: '\f06e\20';
673
+ color: lightskyblue;
674
+ }
675
+ .cms-toggle.mode-2:before {
676
+ font-family: 'FontAwesome';
677
+ content: '\f040\20';
678
+ color: lightcoral;
679
+ }
680
+
650
681
  #cmsedit-div {
651
- font-family: helvetica;
682
+ font-family: Arial, sans-serif;
652
683
  font-size: 13px;
653
684
  line-height: 13px;
654
685
  }
@@ -246,7 +246,9 @@ def process_collections #:nodoc
246
246
  if @tables.size > 1
247
247
  rec = @tables.first[0].find(@ids.first) # top most document.id
248
248
  1.upto(@tables.size - 2) { |i| rec = rec.send(@tables[i][1].pluralize).find(@ids[i]) } # find embedded childrens by ids
249
- @records = rec.send(@tables.last[1].pluralize) # current embedded set
249
+ # TO DO. When field name is different then pluralized class name. Not working yet.
250
+ embedded_field_name = @tables.last[0] ? @tables.last[1].pluralize : @tables.last[1]
251
+ @records = rec.send(embedded_field_name) # current embedded set
250
252
  # sort by order if order field is present in model
251
253
  if @tables.last[1].classify.constantize.respond_to?(:order)
252
254
  @records = @records.order_by('order asc')
@@ -275,9 +277,10 @@ def process_in_memory #:nodoc
275
277
  end
276
278
 
277
279
  ########################################################################
278
- # Indx action
280
+ # Index action
279
281
  ########################################################################
280
282
  def index
283
+ @form['result_set'] ||= {}
281
284
  redirected = (@form['table'] == 'dc_memory' ? process_in_memory : process_collections)
282
285
  return if redirected
283
286
  #
@@ -321,7 +324,7 @@ end
321
324
  ########################################################################
322
325
  def login
323
326
  if params[:id] == 'test' then set_test_site
324
- elsif params[:ok] then redirect_to '/'
327
+ elsif params[:ok] then render action: 'login', layout: 'cms'
325
328
  else
326
329
  session[:edit_mode] = 0
327
330
  render action: 'login', layout: 'cms'
@@ -460,15 +463,14 @@ def create
460
463
  session[:form_time_stamp] = params[:form_time_stamp]
461
464
  #
462
465
  create_new_empty_record
463
- params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
464
466
  if save_data
465
- flash[:info] = t('drgcms.doc_saved')
467
+ flash[:info] = t('drgcms.doc_saved')
468
+ params[:return_to] = 'index' if params[:commit] == t('drgcms.save&back') # save & back
466
469
  return process_return_to(params[:return_to]) if params[:return_to]
467
470
 
468
471
  @parms['id'] = @record.id # must be set, for proper update link
469
472
  params[:id] = @record.id # must be set, for find_record
470
473
  edit
471
- # render action: :edit
472
474
  else # error
473
475
  return process_return_to(params[:return_to]) if params[:return_to]
474
476
  render action: :new
@@ -642,29 +644,58 @@ def forms_merge(hash1, hash2)
642
644
  target.delete_if{ |k,v| v.nil? }
643
645
  end
644
646
 
647
+ ########################################################################
648
+ # Extends DRGCMS form file. Extended file is processed first and then merged
649
+ # with code in this form file. Form can extend only single form file.
650
+ #
651
+ # [Parameters:]
652
+ # [extend_option] : Value of @form['extend'] option
653
+ ########################################################################
654
+ def extend_drg_cms_form(extend_option)
655
+ form = YAML.load_file( dc_find_form_file(extend_option) )
656
+ @form = forms_merge(form, @form)
657
+ # If combined form contains tabs and fields options, merge fields into tabs
658
+ if @form['form']['tabs'] and @form['form']['fields']
659
+ @form['form']['tabs']['fields'] = @form['form']['fields']
660
+ @form['form']['fields'] = nil
661
+ end
662
+ end
663
+
664
+ ########################################################################
665
+ # Include code from another DRGCMS form file. Included code is merged
666
+ # with current form file code. Form can include more than one other DRGCMS forms.
667
+ #
668
+ # [Parameters:]
669
+ # [include_option] : Value of @form['include'] option
670
+ ########################################################################
671
+ def include_drg_cms_form(include_option)
672
+ includes = include_option.class == Array ? include_option : include_option.split(/\,|\;/)
673
+ includes.each do |include_file|
674
+ form = YAML.load_file( dc_find_form_file(include_file) )
675
+ @form = forms_merge(@form, form)
676
+ end
677
+ end
678
+
645
679
  ########################################################################
646
680
  # Read drgcms form into yaml object. Subroutine of check_authorization.
647
681
  ########################################################################
648
682
  def read_drg_cms_form
649
683
  table_name = decamelize_type(params[:table].strip)
650
- @tables = table_name.split(';').inject([]) { |r,v| r << [v.classify.constantize, v] }
684
+ @tables = table_name.split(';').inject([]) { |r,v| r << [(v.classify.constantize rescue nil), v] }
651
685
  # split ids passed when embedded document
652
686
  ids = params[:ids].to_s.strip.downcase
653
687
  @ids = ids.split(';').inject([]) { |r,v| r << v }
654
688
  # form_name defaults to last table specified
655
689
  form_name = params[:form_name] || @tables.last[1]
656
- @form = YAML.load_file( dc_find_form_file(form_name) ) rescue nil
657
- return unless @form
658
- # when form extends another form file.
659
- if @form['extend']
660
- form = YAML.load_file( dc_find_form_file(@form['extend']) )
661
- @form = forms_merge(form, @form)
662
- # If combined form contains tabs and fields options, merge fields into tabs
663
- if @form['form']['tabs'] and @form['form']['fields']
664
- @form['form']['tabs']['fields'] = @form['form']['fields']
665
- @form['form']['fields'] = nil
666
- end
690
+ # dynamicaly generated form
691
+ @form = if params[:form_name] == 'method'
692
+ dc_eval_class_method(params[:form_method], params)
693
+ else
694
+ YAML.load_file( dc_find_form_file(form_name) ) rescue nil
667
695
  end
696
+ # form includes or extends another form file
697
+ include_drg_cms_form(@form['include']) if @form['include']
698
+ extend_drg_cms_form(@form['extend']) if @form['extend']
668
699
  # add readonly key to form if readonly parameter is passed in url
669
700
  @form['readonly'] = 1 if params['readonly'] #and %w(1 yes true).include?(params['readonly'].to_s.downcase.strip)
670
701
  # !!!!!! Always use strings for key names since @parms['table'] != @parms[:table]
@@ -105,7 +105,8 @@ end
105
105
  # Sets internal @page_title variable.
106
106
  ##########################################################################
107
107
  def set_page_title()
108
- @page_title = @page.title.blank? ? "#{@page.subject} - #{@site.page_title}" : @page.title
108
+ @page_title = @page.title.blank? ? @page.subject : @page.title
109
+ dc_add_meta_tag(:name, 'description', @page.meta_description)
109
110
  end
110
111
 
111
112
  ########################################################################
@@ -127,7 +128,7 @@ def dc_find_form_file(form_file)
127
128
  f = "#{path}/#{form_file}.yml"
128
129
  return f if File.exist?(f) and (form_path.nil? or path.to_s.match(/\/#{form_path}\//i))
129
130
  end
130
- p "Form file #{form_file} not found!"
131
+ logger.error "Form file #{form_file} not found!"
131
132
  nil
132
133
  end
133
134
 
@@ -141,7 +142,7 @@ end
141
142
  # return dc_render_404('Site') unless site
142
143
  ########################################################################
143
144
  def dc_render_404(where_the_error_is=nil)
144
- logger.info("Error 404;#{request.env['REQUEST_URI']};#{request.referer};#{where_the_error_is}")
145
+ logger.info("Error 404;#{request.env['REQUEST_URI'] rescue ''};#{request.referer};#{where_the_error_is}")
145
146
  render(file: Rails.root.join('public/404.html'), status: 404)
146
147
  end
147
148
 
@@ -286,23 +287,27 @@ def get_design_and_render(design_doc)
286
287
  extend controller if controller
287
288
  return send @options[:action] if respond_to?(@options[:action])
288
289
  end
289
- #
290
+ # design doc present
290
291
  if design_doc
291
- if !design_doc.rails_view.blank?
292
- if design_doc.rails_view.downcase != 'site'
293
- return render design_doc.rails_view, layout: layout
294
- end
295
- elsif !design_doc.body.blank?
296
- design = site_top + design_doc.body + site_bottom
297
- return render(inline: design, layout: layout)
292
+ # defined as rails view
293
+ design = if design_doc.rails_view.blank? or design_doc.rails_view == 'site'
294
+ @site.rails_view
295
+ else
296
+ design_doc.rails_view
298
297
  end
298
+ return render design, layout: layout unless design.blank?
299
+ # defined as inline code
300
+ design = design_doc.body.blank? ? @site.design : design_doc.body
301
+ design = site_top + design + site_bottom
302
+ return render(inline: design, layout: layout) unless design.blank?
299
303
  end
300
- #
304
+ # Design doc not defined
301
305
  if @site.rails_view.blank?
302
306
  design = site_top + @site.design + site_bottom
303
- return render(inline: design, layout: layout)
304
- end
305
- render @site.rails_view, layout: layout
307
+ render(inline: design, layout: layout)
308
+ else
309
+ render @site.rails_view, layout: layout
310
+ end
306
311
  end
307
312
 
308
313
  ##########################################################################
@@ -331,13 +336,13 @@ def dc_process_default_request()
331
336
  dc_set_options(@site.settings)
332
337
  # HOMEPAGE. When no parameters is set
333
338
  params[:path] = @site.homepage_link if params[:id].nil? and params[:path].nil?
334
- @options[:path] = params[:path].to_s.split('/')
339
+ @options[:path] = params[:path].to_s.downcase.split('/')
335
340
  params[:path] = @options[:path].first if @options[:path].size > 1
336
341
  # some other process request. It should fail if not defined
337
342
  return send(@site.request_processor) unless @site.request_processor.blank?
338
343
 
339
344
  # Search for page
340
- pageclass = @site.page_table.classify.constantize
345
+ pageclass = @site.page_klass
341
346
  if params[:id]
342
347
  #Page.where(id: params[:id]).or(subject_link: params[:id]).first
343
348
  @page = pageclass.find_by(:dc_site_id.in => [@site._id, nil], subject_link: params[:id], active: true)
@@ -357,17 +362,19 @@ def dc_process_default_request()
357
362
  end
358
363
  # if @page is not found render 404 error
359
364
  return dc_render_404('Page!') unless @page
360
- dc_set_options @page.params
361
365
  dc_set_is_mobile unless session[:is_mobile] # do it only once per session
362
366
  # find design if defined. Otherwise design MUST be declared in site
363
367
  if @page.dc_design_id
364
368
  @design = DcDesign.find(@page.dc_design_id)
365
369
  return dc_render_404('Design!') unless @design
366
370
  end
371
+ dc_set_options @design.params if @design
372
+ dc_set_options @page.params
373
+ dc_add_json_ld(@page.get_json_ld)
367
374
  # Add edit menu
368
375
  if session[:edit_mode] > 0
369
376
  session[:site_id] = @site.id
370
- session[:site_page_table] = @site.page_table
377
+ session[:site_page_class] = @site.page_class
371
378
  session[:page_id] = @page.id
372
379
  else
373
380
  # Log only visits from non-editors
@@ -529,11 +536,11 @@ def dc_render_ajax(opts)
529
536
  end
530
537
  key << "_#{opts[:div]}#{opts[:class]}"
531
538
  else
532
- p 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
539
+ logger.error 'Error: dc_render_ajax. Operation is not set!' if opts[:operation].nil?
533
540
  key = "#{opts[:operation]}_"
534
541
  end
535
542
  result[key] = opts[:value] || opts[:url] || ''
536
- render inline: result.to_json, formats: 'js'
543
+ render json: result
537
544
  end
538
545
 
539
546
  ########################################################################
@@ -654,4 +661,58 @@ def dc_check_user_still_valid(repeat_after=1.day)
654
661
  end
655
662
  end
656
663
 
664
+ ##########################################################################
665
+ # Evaluates Class.method in more predictable context then just calling eval
666
+ #
667
+ # @param [String] class_method defined as MyClass.method_name
668
+ # @param [Object] optional parameters send to class_method
669
+ ##########################################################################
670
+ def dc_eval_class_method(class_method, params=nil)
671
+ klass, method = class_method.split('.')
672
+ # check if class exists
673
+ klass = klass.classify.constantize rescue nil
674
+ if klass.nil?
675
+ logger.error " Class in #{class_method} not defined!"
676
+ return nil
677
+ end
678
+ # call method
679
+ if klass.respond_to?(method)
680
+ klass.send(method, params)
681
+ else
682
+ logger.error "Method in #{class_method} not defined!"
683
+ nil
684
+ end
685
+ end
686
+
687
+ ##########################################################################
688
+ # Will add new element to json_ld structure
689
+ #
690
+ # Parameters:
691
+ # [element] Hash or Array of hashes:
692
+ ##########################################################################
693
+ def dc_add_json_ld(element)
694
+ @json_ld ||= []
695
+ if element.class == Array
696
+ @json_ld += element
697
+ else
698
+ @json_ld << element
699
+ end
700
+ end
701
+
702
+ ########################################################################
703
+ # Will add a meta tag to internal hash structure. If meta tag already exists it
704
+ # will be overwritten.
705
+ #
706
+ # Parameters:
707
+ # [name] String: meta name
708
+ # [content] String: meta content
709
+ #
710
+ ########################################################################
711
+ def dc_add_meta_tag(type, name, content)
712
+ return if content.blank?
713
+ @meta_tags ||= {}
714
+ key = "#{type}=\"#{name}\""
715
+ @meta_tags[key] = content
716
+ end
717
+
657
718
  end