/app/controllers/caboose/blocks_controller.rb

https://github.com/billyswifty/caboose-cms · Ruby · 395 lines · 298 code · 57 blank · 40 comment · 30 complexity · 6b8b3039b740f1c30c3dcb3dbf4b1767 MD5 · raw file

  1. require 'nokogiri'
  2. module Caboose
  3. class BlocksController < ApplicationController
  4. helper :application
  5. #===========================================================================
  6. # Admin actions
  7. #===========================================================================
  8. # GET /admin/pages/:page_id/blocks
  9. def admin_index
  10. return if !user_is_allowed('pages', 'view')
  11. blocks = Block.where(:page_id => params[:page_id]).reorder(:sort_order)
  12. render :json => blocks
  13. end
  14. # GET /admin/pages/:page_id/blocks/:id/new
  15. # GET /admin/pages/:page_id/blocks/new
  16. def admin_new
  17. return unless user_is_allowed('pages', 'add')
  18. if params[:id]
  19. block_type_id = params[:block_type_id]
  20. block_type_id = Block.find(params[:id]).block_type.default_child_block_type_id if block_type_id.nil?
  21. if block_type_id
  22. b = Block.new
  23. b.page_id = params[:page_id].to_i
  24. b.parent_id = params[:id]
  25. b.block_type_id = block_type_id
  26. b.sort_order = Block.where(:parent_id => params[:id]).count
  27. b.save
  28. b.create_children
  29. redirect_to "/admin/pages/#{b.page_id}/blocks/#{b.id}/edit"
  30. return
  31. end
  32. end
  33. @page = Page.find(params[:page_id])
  34. @block = params[:id] ? Block.find(params[:id]) : Block.new(:page_id => params[:page_id])
  35. @after_id = params[:after_id] ? params[:after_id] : nil
  36. @before_id = params[:before_id] ? params[:before_id] : nil
  37. render :layout => 'caboose/modal'
  38. end
  39. # GET /admin/pages/:page_id/blocks/:id
  40. def admin_show
  41. return unless user_is_allowed('pages', 'edit')
  42. block = Block.find(params[:id])
  43. render :json => block
  44. end
  45. # GET /admin/pages/:page_id/blocks/tree
  46. # GET /admin/pages/:page_id/blocks/:id/tree
  47. def admin_tree
  48. return unless user_is_allowed('pages', 'edit')
  49. blocks = []
  50. if params[:id]
  51. b = Block.find(params[:id])
  52. blocks << { 'id' => b.id, 'children' => admin_tree_helper(b), 'field_type' => b.block_type.field_type }
  53. else
  54. Block.where("parent_id is null and page_id = ?", params[:page_id]).reorder(:sort_order).all.each do |b|
  55. blocks << { 'id' => b.id, 'allow_child_blocks' => b.block_type.allow_child_blocks, 'children' => admin_tree_helper(b), 'field_type' => b.block_type.field_type }
  56. end
  57. end
  58. render :json => blocks
  59. end
  60. def admin_tree_helper(b)
  61. arr = []
  62. b.children.each do |b2|
  63. arr << { 'id' => b2.id, 'allow_child_blocks' => b2.block_type.allow_child_blocks, 'children' => admin_tree_helper(b2), 'field_type' => b2.block_type.field_type }
  64. end
  65. return arr
  66. end
  67. # GET /admin/pages/:page_id/blocks/:id/render
  68. def admin_render
  69. return unless user_is_allowed('pages', 'edit')
  70. b = Block.find(params[:id])
  71. bt = b.block_type
  72. if bt.nil?
  73. bt = BlockType.where(:name => 'richtext').first
  74. b.block_type_id = bt.id
  75. b.save
  76. end
  77. #b.create_children
  78. html = b.render(b, {
  79. :empty_text => params[:empty_text],
  80. :editing => true
  81. })
  82. render :json => html
  83. end
  84. # GET /admin/pages/:page_id/blocks/render
  85. def admin_render_all
  86. return unless user_is_allowed('pages', 'edit')
  87. p = Page.find(params[:page_id])
  88. blocks = Block.where("page_id = ? and parent_id is null", p.id).reorder(:sort_order).collect do |b|
  89. #bt = b.block_type
  90. #if bt.nil?
  91. # bt = BlockType.where(:name => 'richtext').first
  92. # b.block_type_id = bt.id
  93. # b.save
  94. #end
  95. #b.create_children
  96. {
  97. :id => b.id,
  98. :block_type_id => b.block_type.id,
  99. :sort_order => b.sort_order,
  100. :html => b.render(b, {
  101. :empty_text => params[:empty_text],
  102. :editing => true
  103. })
  104. }
  105. end
  106. render :json => blocks
  107. end
  108. # GET /admin/pages/:page_id/blocks/render-second-level
  109. def admin_render_second_level
  110. return unless user_is_allowed('pages', 'edit')
  111. p = Page.find(params[:page_id])
  112. @p = p
  113. blocks = p.block.children.collect do |b|
  114. {
  115. :id => b.id,
  116. :block_type_id => b.block_type.id,
  117. :sort_order => b.sort_order,
  118. :html => b.render(b, {
  119. :view => nil,
  120. :controller_view_content => nil,
  121. :modal => false,
  122. :editing => true,
  123. :empty_text => params[:empty_text],
  124. :css => '|CABOOSE_CSS|',
  125. :js => '|CABOOSE_JAVASCRIPT|',
  126. :csrf_meta_tags => '|CABOOSE_CSRF|',
  127. :csrf_meta_tags2 => '|CABOOSE_CSRF|',
  128. :logged_in_user => @logged_in_user,
  129. :site => @site
  130. })
  131. }
  132. end
  133. render :json => blocks
  134. #render :layout => false
  135. #respond_to do |format|
  136. # format.json
  137. #end
  138. end
  139. # GET /admin/pages/:page_id/blocks/:id/edit
  140. def admin_edit
  141. return unless user_is_allowed('pages', 'edit')
  142. @page = Page.find(params[:page_id])
  143. @block = Block.find(params[:id])
  144. @block.create_children
  145. @modal = true
  146. @document_domain = request.host
  147. @document_domain.gsub('http://', '')
  148. @document_domain.gsub('https://', '')
  149. begin
  150. render "caboose/blocks/admin_edit_#{@block.block_type.full_name}", :layout => 'caboose/modal'
  151. rescue
  152. render :layout => 'caboose/modal'
  153. end
  154. end
  155. # GET /admin/pages/:page_id/blocks/:id/advanced
  156. def admin_edit_advanced
  157. return unless user_is_allowed('pages', 'edit')
  158. @page = Page.find(params[:page_id])
  159. @block = Block.find(params[:id])
  160. @block.create_children
  161. render :layout => 'caboose/modal'
  162. end
  163. # POST /admin/pages/:page_id/blocks
  164. # POST /admin/pages/:page_id/blocks/:id
  165. def admin_create
  166. return unless user_is_allowed('pages', 'add')
  167. resp = Caboose::StdClass.new({
  168. 'error' => nil,
  169. 'redirect' => nil
  170. })
  171. b = Block.new
  172. b.page_id = params[:page_id].to_i
  173. b.parent_id = params[:id] ? params[:id] : nil
  174. b.block_type_id = params[:block_type_id]
  175. if !params[:index].nil?
  176. b.sort_order = params[:index].to_i
  177. i = 1
  178. b.parent.children.where('sort_order >= ?', b.sort_order).reorder(:sort_order).all.each do |b3|
  179. b3.sort_order = b.sort_order + i
  180. b3.save
  181. i = i + 1
  182. end
  183. elsif params[:before_id]
  184. b2 = Block.find(params[:before_id].to_i)
  185. b.sort_order = b2.sort_order
  186. i = 1
  187. b2.parent.children.where('sort_order >= ?', b.sort_order).reorder(:sort_order).all.each do |b3|
  188. b3.sort_order = b.sort_order + i
  189. b3.save
  190. i = i + 1
  191. end
  192. elsif params[:after_id]
  193. b2 = Block.find(params[:after_id].to_i)
  194. b.sort_order = b2.sort_order + 1
  195. i = 1
  196. b2.parent.children.where('sort_order >= ?', b.sort_order).reorder(:sort_order).all.each do |b3|
  197. b3.sort_order = b.sort_order + i
  198. b3.save
  199. i = i + 1
  200. end
  201. elsif params[:id]
  202. b.sort_order = Block.where(:parent_id => params[:id]).count
  203. end
  204. # Save the block
  205. b.save
  206. # Ensure that all the children are created for the block
  207. b.create_children
  208. # Set the global values if necessary
  209. if b.block_type.is_global
  210. b.get_global_value(@site.id)
  211. end
  212. # Send back the response
  213. #resp.block = b
  214. resp.redirect = "/admin/pages/#{b.page_id}/blocks/#{b.id}/edit"
  215. render :json => resp
  216. end
  217. # PUT /admin/pages/:page_id/blocks/:id
  218. def admin_update
  219. return unless user_is_allowed('pages', 'edit')
  220. resp = StdClass.new({'attributes' => {}})
  221. b = Block.find(params[:id])
  222. save = true
  223. params.each do |k,v|
  224. case k
  225. #when 'page_id' then b.page_id = v
  226. when 'parent_id' then
  227. b.parent_id = v
  228. b.sort_order = Block.where(:parent_id => v).count
  229. when 'block_type_id' then b.block_type_id = v
  230. when 'sort_order' then b.sort_order = v
  231. when 'name' then b.name = v
  232. when 'value' then
  233. if b.block_type.is_global
  234. b.value = v
  235. b.update_global_value(v, @site.id)
  236. else
  237. if Caboose::parse_richtext_blocks == true && b.block_type.field_type == 'richtext' && (b.name.nil? || b.name.strip.length == 0) && (b.block_type.name != 'richtext2')
  238. b = RichTextBlockParser.parse(b, v, request.host_with_port)
  239. else
  240. b.value = v
  241. end
  242. end
  243. end
  244. end
  245. resp.success = save && b.save
  246. b.create_children
  247. render :json => resp
  248. end
  249. # POST /admin/pages/:page_id/blocks/:id/image
  250. def admin_update_image
  251. return unless user_is_allowed('pages', 'edit')
  252. resp = StdClass.new({'attributes' => {}})
  253. b = Block.find(params[:id])
  254. b.image = params[:value]
  255. b.save
  256. resp.success = true
  257. resp.attributes = { 'value' => { 'value' => b.image.url(:tiny) }}
  258. render :json => resp
  259. end
  260. # POST /admin/pages/:page_id/blocks/:id/file
  261. def admin_update_file
  262. return unless user_is_allowed('pages', 'edit')
  263. resp = StdClass.new({'attributes' => {}})
  264. b = Block.find(params[:id])
  265. b.file = params[:value]
  266. b.save
  267. resp.success = true
  268. resp.attributes = { 'value' => { 'value' => b.file.url }}
  269. render :json => resp
  270. end
  271. # DELETE /admin/pages/:page_id/blocks/:id
  272. def admin_delete
  273. return unless user_is_allowed('pages', 'delete')
  274. resp = StdClass.new
  275. b = Block.find(params[:id])
  276. parent_id = b.parent_id
  277. if b.parent_id
  278. resp.redirect = "/admin/pages/#{b.page_id}/blocks/#{b.parent_id}/edit"
  279. else
  280. resp.close = true
  281. end
  282. b.destroy
  283. if parent_id
  284. i = 0
  285. Block.where(:parent_id => parent_id).reorder(:sort_order).all.each do |b2|
  286. b2.sort_order = i
  287. b2.save
  288. i = i + 1
  289. end
  290. end
  291. render :json => resp
  292. end
  293. # PUT /admin/pages/:page_id/blocks/:id/move-up
  294. def admin_move_up
  295. return unless user_is_allowed('pages', 'delete')
  296. resp = StdClass.new
  297. b = Block.find(params[:id])
  298. if b.sort_order == 0
  299. resp.error = "The block is already at the top."
  300. else
  301. b2 = nil
  302. new_sort_order = b.sort_order - 1
  303. while new_sort_order > 0 do
  304. b2 = Block.where("parent_id = ? and sort_order = ?", b.parent_id, new_sort_order).first
  305. break if b2
  306. new_sort_order = new_sort_order - 1
  307. end
  308. if b2
  309. b2.sort_order = new_sort_order + 1
  310. b2.save
  311. else
  312. new_sort_order = 1
  313. end
  314. b.sort_order = new_sort_order
  315. b.save
  316. resp.success = "The block has been moved up successfully."
  317. end
  318. render :json => resp
  319. end
  320. # PUT /admin/pages/:page_id/blocks/:id/move-down
  321. def admin_move_down
  322. return unless user_is_allowed('pages', 'delete')
  323. resp = StdClass.new
  324. b = Block.find(params[:id])
  325. b2 = Block.where("parent_id = ? and sort_order = ?", b.parent_id, b.sort_order + 1).first
  326. if b2.nil?
  327. resp.error = "The block is already at the bottom."
  328. else
  329. b2.sort_order = b.sort_order
  330. b2.save
  331. b.sort_order = b.sort_order + 1
  332. b.save
  333. resp.success = "The block has been moved down successfully."
  334. end
  335. render :json => resp
  336. end
  337. end
  338. end