Class: Alchemy::Admin::PagesController

Inherits:
ResourcesController show all
Includes:
CurrentLanguage, OnPageLayout::CallbacksRunner
Defined in:
app/controllers/alchemy/admin/pages_controller.rb

Constant Summary

Constants inherited from ResourcesController

ResourcesController::COMMON_SEARCH_FILTER_EXCLUDES

Instance Method Summary collapse

Methods inherited from ResourcesController

#resource_filters, #resource_filters_for_select, #resource_has_deprecated_filters, #resource_has_filters

Methods included from ResourcesHelper

#contains_relations?, #edit_resource_path, #new_resource_path, #render_attribute, #render_resources, #resource_attribute_field_options, #resource_has_tags, #resource_instance_variable, #resource_model, #resource_name, #resource_path, #resource_relations_names, #resource_scope, #resource_url_proxy, #resource_window_size, #resources_instance_variable, #resources_path, #sortable_resource_header_column

Methods inherited from BaseController

#leave

Methods included from Modules

included, #module_definition_for, register_module

Methods included from Alchemy::AbilityHelper

#current_ability

Methods included from ConfigurationMethods

#configuration, #multi_language?, #multi_site?, #prefix_locale?

Instance Method Details

#configureObject

Set page configuration like page names, meta tags and states.

[View source]

121
122
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 121

def configure
end

#copy_language_treeObject

[View source]

209
210
211
212
213
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 209

def copy_language_tree
  language_root_to_copy_from.copy_children_to(copy_of_language_root)
  flash[:notice] = Alchemy.t(:language_pages_copied)
  redirect_to admin_pages_path
end

#createObject

[View source]

86
87
88
89
90
91
92
93
94
95
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 86

def create
  @page = paste_from_clipboard || Page.new(page_params)
  if @page.save
    flash[:notice] = Alchemy.t("Page created", name: @page.name)
    do_redirect_to(redirect_path_after_create_page)
  else
    new
    render :new
  end
end

#destroyObject

Fetches page via before filter, destroys it and redirects to page tree

[View source]

147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 147

def destroy
  if @page.destroy
    flash[:notice] = Alchemy.t("Page deleted", name: @page.name)

    # Remove page from clipboard
    clipboard = get_clipboard("pages")
    clipboard.delete_if { |item| item["id"] == @page.id.to_s }
  else
    flash[:warning] = @page.errors.full_messages.to_sentence
  end

  respond_to do |format|
    format.js do
      @redirect_url = if @page.layoutpage?
        alchemy.admin_layoutpages_path
      else
        alchemy.admin_pages_path
      end

      render :redirect
    end
  end
end

#editObject

Edit the content of the page and all its elements and ingredients.

Locks the page to current user to prevent other users from editing it meanwhile.

[View source]

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 101

def edit
  # fetching page via before filter
  if page_is_locked?
    flash[:warning] = Alchemy.t("This page is locked", name: @page.locker_name)
    redirect_to admin_pages_path
  elsif page_needs_lock?
    @page.lock_to!(current_alchemy_user)
  end
  @preview_urls = Alchemy.preview_sources.map do |klass|
    [
      klass.model_name.human,
      klass.new(routes: Alchemy::Engine.routes).url_for(@page)
    ]
  end
  @preview_url = @preview_urls.first.last
  @layoutpage = @page.layoutpage?
  Alchemy::Current.language = @page.language
end

#flushObject

[View source]

215
216
217
218
219
220
221
222
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 215

def flush
  @current_language.pages.flushables.update_all(published_at: Time.current)
  # We need to ensure, that also all layoutpages get the +published_at+ timestamp set,
  # but not set to public true, because the cache_key for an element is +published_at+
  # and we don't want the layout pages to be present in +Page.published+ scope.
  @current_language.pages.flushable_layoutpages.update_all(published_at: Time.current)
  respond_to { |format| format.js }
end

#foldObject

[View source]

175
176
177
178
179
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 175

def fold
  # @page is fetched via before filter
  @page.fold!(current_alchemy_user.id, !@page.folded?(current_alchemy_user.id))
  render json: serialized_page_tree
end

#indexObject

[View source]

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 40

def index
  @query = @current_language.pages.contentpages.ransack(search_filter_params[:q])

  if @view == "list"
    @query.sorts = default_sort_order if @query.sorts.empty?
    items = @query.result

    if search_filter_params[:tagged_with].present?
      items = items.tagged_with(search_filter_params[:tagged_with])
    end

    if search_filter_params[:filter].present?
      items = apply_filters(items)
    end

    items = items.page(params[:page] || 1).per(items_per_page)
    @pages = items
  end
end

#infoObject

[View source]

75
76
77
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 75

def info
  render layout: !request.xhr?
end
[View source]

171
172
173
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 171

def link
  render LinkDialog::Tabs.new(**link_dialog_params)
end

#newObject

[View source]

79
80
81
82
83
84
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 79

def new
  @page ||= Page.new(layoutpage: params[:layoutpage] == "true", parent_id: params[:parent_id])
  @page_layouts = Page.layouts_for_select(@current_language.id, layoutpages: @page.layoutpage?)
  @clipboard = get_clipboard("pages")
  @clipboard_items = Page.all_from_clipboard_for_select(@clipboard, @current_language.id, layoutpages: @page.layoutpage?)
end

#publishObject

Sets the page public and updates the published_at attribute that is used as cache_key

[View source]

201
202
203
204
205
206
207
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 201

def publish
  # fetching page via before filter
  @page.publish!

  flash[:notice] = Alchemy.t(:page_published, name: @page.name)
  redirect_back(fallback_location: admin_pages_path)
end

#showObject

Used by page preview iframe in Page#edit view.

[View source]

68
69
70
71
72
73
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 68

def show
  Current.preview_page = @page
  # Setting the locale to pages language, so the page content has it's correct translations.
  ::I18n.locale = @page.language.locale
  render(layout: Alchemy::Config.get(:admin_page_preview_layout) || "application")
end

#treeObject

Returns all pages as a tree from the root given by the id parameter

[View source]

62
63
64
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 62

def tree
  render json: serialized_page_tree
end

#unlockObject

Leaves the page editing mode and unlocks the page for other users

[View source]

182
183
184
185
186
187
188
189
190
191
192
193
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 182

def unlock
  # fetching page via before filter
  @page.unlock!
  flash[:notice] = Alchemy.t(:unlocked_page, name: @page.name)
  @pages_locked_by_user = Page.from_current_site.locked_by(current_alchemy_user)
  respond_to do |format|
    format.js
    format.html do
      redirect_to(unlock_redirect_path, allow_other_host: true)
    end
  end
end

#unlock_redirect_pathObject

[View source]

195
196
197
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 195

def unlock_redirect_path
  safe_redirect_path(fallback: admin_pages_path)
end

#updateObject

Updates page

  • fetches page via before filter

[View source]

128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'app/controllers/alchemy/admin/pages_controller.rb', line 128

def update
  @old_parent_id = @page.parent_id
  if @page.update(page_params)
    @notice = Alchemy.t("Page saved", name: @page.name)
    @while_page_edit = request.referer.include?("edit")

    if @view == "list"
      flash[:notice] = @notice
    end

    unless @while_page_edit
      @tree = serialized_page_tree
    end
  else
    render :configure, status: :unprocessable_entity
  end
end