drg_cms 0.6.0.1 → 0.6.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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