page.rb
4.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
require 'acts_as_list'
require 'acts_as_tree'
module Kanjai
class Page < ActiveRecord::Base
extend ActsAsTree::TreeWalker
include ActiveRecord::Acts::Tree
include ActiveRecord::Acts::List
belongs_to :domain
acts_as_tree order: 'position', scope: :domain_id
acts_as_list :scope => :parent_id
belongs_to :page_template
has_many :images, as: :object
has_many :page_data, dependent: :destroy
accepts_nested_attributes_for :page_data
validates :title, presence: true, :if => lambda { |o| o.new_record? }
#serialize :template_content, Array
attr_accessor :title
enum status: {
active: 0,
block: 1
}
def full_url(scheme, lang = nil)
"#{scheme}#{domain.title}#{menu_url(scheme, lang)}"
end
def menu_url(scheme, lang = nil)
lang = I18n.locale.to_s if lang.nil?
url = self.lang_attributes(lang, :url)
if url.present?
return self.generate_url(scheme, url, lang)
else
url = self.lang_attributes(ADMIN_CONFIG['default_lang'], :url)
if url.present?
return self.generate_url(scheme, url, ADMIN_CONFIG['default_lang'])
else
''
end
end
end
def generate_url(scheme, url, lang)
lang = I18n.locale.to_s if lang.nil?
if /(http|https):\/\//.match url
url
elsif url[0] == '/'
url == '/' ? "/#{lang}" : "/#{lang}#{url}"
else
current_page = self
segments = []
loop do
current_page_url = current_page.lang_attributes(lang, :url)
segments << current_page_url.gsub(/^\//, '').gsub(/\/$/, '') if current_page_url.to_s.present?
break if current_page_url.to_s.present? && current_page_url[0] == '/'
break if current_page.parent.nil?
current_page = current_page.parent
end
url = segments.reverse.join('/')
url = "/#{url}" unless url[0] == '/'
"/#{lang}#{url}"
end
end
def generate_url_old(scheme, url, lang)
lang = I18n.locale.to_s if lang.nil?
if /(http|https):\/\//.match url
url
else
if /\//.match url
if url == '/'
'/' + lang
else
'/' + lang + url
end
else
'/' + lang + '/' + url
end
end
end
def lang_attributes(lang_code, attributes)
data = self.page_data.find_by_lang(lang_code)
if data
data[attributes]
else
''
end
end
def clone
Page.transaction do
new_page = self.dup
new_page.save(validate: false)
self.page_data.each do |item|
new_item = item.dup
new_item.page = new_page
new_item.title = "Copy #{item.title}"
new_item.save(validate: false)
item.page_contents.each do |page_content|
new_page_content = page_content.dup
new_page_content.page = new_page
new_page_content.page_datum = new_item
new_page_content.save(validate: false)
page_content.page_content_markers.each do |page_content_marker|
new_page_content_marker = page_content_marker.dup
new_page_content_marker.page_content = new_page_content
new_page_content_marker.save(validate: false)
end
end
end
new_page.insert_at(self.position + 1)
end
end
def added_to_sitemap?(lang)
url = self.lang_attributes(lang, :url)
count_contents = page_data.joins(:page_contents).where(lang: lang)
url != ":param" && count_contents.any?
end
def plugin_sitemap_pages
lang = I18n.locale.to_s
page_url = full_url('https://', lang)
[].tap do |n|
page_data.where(lang: lang).each do |item|
item.page_contents.each do |page_content|
if page_content.type_content == 'plugin'
controller = page_content.controller_name.constantize.new
response = controller.send 'generate_sitemap'
if response
response.each do |plugin_page|
if plugin_page[:segment].present?
n << "#{page_url}/#{plugin_page[:segment]}"
end
end
end
end
end
end
end
end
def self.default_public_page_url(scheme)
page = Page.where(private_flag: false, root_page: true).first
if page
return page.menu_url(scheme)
end
return '/'
end
def self.default_private_page_url(scheme)
page = Page.where(private_flag: true, default_private_page: true).first
if page
return page.menu_url(scheme)
end
return '/'
end
def self.pages_for_choose(domain)
[].tap do |n|
domain.pages.walk_tree do |page, level|
n << {title: page.lang_attributes(PageLang.default(domain), :title), level: level, id: page.id}
end
end
end
end
end