Improved theming for admin vs site.
- Added $theme_path, $base_path - Added CMS_RESPONSE.module_resource_url (...) instead of using hardcoded "/module/" + name + ... - Use base_path rather than base_url (note ROC CMS is not yet working with EWF standalone "base" url option)
This commit is contained in:
@@ -99,7 +99,7 @@ feature {NONE} -- Initialization
|
||||
end
|
||||
|
||||
-- Selected theme's name
|
||||
site_theme_name := text_item_or_default ("theme", "default")
|
||||
site_theme_name := text_item_or_default ("site.theme", "default")
|
||||
set_theme (site_theme_name)
|
||||
|
||||
-- Administration
|
||||
@@ -325,6 +325,18 @@ feature -- Settings
|
||||
is_debug: BOOLEAN
|
||||
-- Is debug mode enabled?
|
||||
|
||||
set_site_mode
|
||||
-- Switch to site mode.
|
||||
--| - Change theme
|
||||
--| - ..
|
||||
do
|
||||
if is_theme_valid (site_theme_name) then
|
||||
set_theme (site_theme_name)
|
||||
else
|
||||
-- Keep previous theme!
|
||||
end
|
||||
end
|
||||
|
||||
set_administration_mode
|
||||
-- Switch to administration mode.
|
||||
--| - Change theme
|
||||
@@ -341,7 +353,7 @@ feature -- Settings
|
||||
-- Set theme to `a_name`.
|
||||
do
|
||||
theme_name := a_name.as_string_32
|
||||
theme_location := themes_location.extended (theme_name)
|
||||
theme_location := theme_location_for (theme_name)
|
||||
end
|
||||
|
||||
feature -- Query
|
||||
@@ -417,7 +429,7 @@ feature -- Access: theme
|
||||
local
|
||||
fu: FILE_UTILITIES
|
||||
do
|
||||
Result := fu.directory_path_exists (themes_location.extended (a_theme_name))
|
||||
Result := fu.directory_path_exists (theme_location_for (a_theme_name))
|
||||
end
|
||||
|
||||
theme_information_location: PATH
|
||||
@@ -437,6 +449,12 @@ feature -- Access: theme
|
||||
-- Default: same as site theme.
|
||||
-- TODO: change to builtin "admin" theme?
|
||||
|
||||
theme_location_for (a_theme_name: READABLE_STRING_GENERAL): PATH
|
||||
-- Theme directory location for theme `a_theme_name`.
|
||||
do
|
||||
Result := themes_location.extended (a_theme_name)
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
mailer: NOTIFICATION_MAILER
|
||||
|
||||
@@ -116,6 +116,7 @@ feature {NONE} -- Initialize
|
||||
initialize_site_url
|
||||
-- Initialize site and base url.
|
||||
local
|
||||
l_base_url: detachable READABLE_STRING_8
|
||||
l_url: detachable STRING_8
|
||||
i,j: INTEGER
|
||||
do
|
||||
@@ -134,12 +135,23 @@ feature {NONE} -- Initialize
|
||||
if i > 0 then
|
||||
j := l_url.index_of ('/', i + 3)
|
||||
if j > 0 then
|
||||
base_url := l_url.substring (j, l_url.count)
|
||||
l_base_url := l_url.substring (j, l_url.count)
|
||||
end
|
||||
end
|
||||
if l_base_url /= Void then
|
||||
base_url := l_base_url
|
||||
if l_base_url.ends_with_general ("/") then
|
||||
create base_path.make_from_string (l_base_url)
|
||||
else
|
||||
create base_path.make_from_string (l_base_url + "/")
|
||||
end
|
||||
else
|
||||
create base_path.make_from_string ("/")
|
||||
end
|
||||
ensure
|
||||
site_url_set: site_url /= Void
|
||||
site_url_ends_with_slash: site_url.ends_with_general ("/")
|
||||
base_path_set: base_path /= Void and then base_path.ends_with_general ("/")
|
||||
end
|
||||
|
||||
initialize_content_types
|
||||
@@ -380,6 +392,9 @@ feature -- Access: url
|
||||
--| Usually it is Void, but it could be
|
||||
--| /project/demo/
|
||||
|
||||
base_path: IMMUTABLE_STRING_8
|
||||
-- Base path, default to "/"
|
||||
|
||||
site_url: IMMUTABLE_STRING_8
|
||||
-- Site url
|
||||
|
||||
@@ -493,10 +508,20 @@ feature -- Helpers: html links
|
||||
|
||||
feature -- Settings
|
||||
|
||||
switch_to_site_mode
|
||||
do
|
||||
if is_administration_mode then
|
||||
setup.set_site_mode
|
||||
is_administration_mode := False
|
||||
end
|
||||
end
|
||||
|
||||
switch_to_administration_mode
|
||||
do
|
||||
setup.set_administration_mode
|
||||
is_administration_mode := True
|
||||
if not is_administration_mode then
|
||||
setup.set_administration_mode
|
||||
is_administration_mode := True
|
||||
end
|
||||
end
|
||||
|
||||
is_administration_mode: BOOLEAN
|
||||
@@ -1101,6 +1126,14 @@ feature -- Environment/ theme
|
||||
Result := setup.files_location
|
||||
end
|
||||
|
||||
files_path: STRING_8
|
||||
do
|
||||
create Result.make_from_string (base_path)
|
||||
Result.append ("files/")
|
||||
ensure
|
||||
ends_with_slash: Result.ends_with ("/")
|
||||
end
|
||||
|
||||
cache_location: PATH
|
||||
-- CMS internal cache location.
|
||||
do
|
||||
@@ -1118,16 +1151,44 @@ feature -- Environment/ theme
|
||||
Result := setup.theme_name
|
||||
end
|
||||
|
||||
theme_path: STRING_8
|
||||
-- URL path to the theme.
|
||||
do
|
||||
Result := theme_path_for (theme_name)
|
||||
ensure
|
||||
ends_with_slash: Result.ends_with ("/")
|
||||
end
|
||||
|
||||
theme_assets_location: PATH
|
||||
-- assets (js, css, images, etc).
|
||||
do
|
||||
debug ("refactor_fixme")
|
||||
fixme ("Check if we really need it")
|
||||
end
|
||||
-- Check how to get this path from the CMS_THEME information.
|
||||
Result := theme_location.extended ("assets")
|
||||
end
|
||||
|
||||
feature -- Theming path helpers
|
||||
|
||||
theme_location_for (a_theme_name: READABLE_STRING_GENERAL): PATH
|
||||
do
|
||||
Result := setup.theme_location_for (a_theme_name)
|
||||
end
|
||||
|
||||
theme_path_for (a_theme_name: READABLE_STRING_GENERAL): STRING_8
|
||||
-- URL path to the theme `a_theme_name`.
|
||||
do
|
||||
create Result.make_from_string (base_path)
|
||||
Result.append ("theme/")
|
||||
Result.append (url_encoded (a_theme_name))
|
||||
Result.append_character ('/')
|
||||
ensure
|
||||
ends_with_slash: Result.ends_with ("/")
|
||||
end
|
||||
|
||||
theme_assets_location_for (a_theme_name: READABLE_STRING_GENERAL): PATH
|
||||
do
|
||||
Result := theme_location_for (a_theme_name).extended ("assets")
|
||||
end
|
||||
|
||||
feature -- Environment/ module
|
||||
|
||||
module_configuration (a_module: CMS_MODULE; a_name: detachable READABLE_STRING_GENERAL): detachable CONFIG_READER
|
||||
|
||||
@@ -195,16 +195,17 @@ feature -- Settings: router
|
||||
configure_api_file_handler (a_router: WSF_ROUTER)
|
||||
local
|
||||
fhdl: WSF_FILE_SYSTEM_HANDLER
|
||||
themehdl: CMS_THEME_FILE_SYSTEM_HANDLER
|
||||
do
|
||||
api.logger.put_information (generator + ".configure_api_file_handler", Void)
|
||||
|
||||
create fhdl.make_hidden_with_path (api.theme_assets_location)
|
||||
fhdl.disable_index
|
||||
fhdl.set_not_found_handler (agent (ia_uri: READABLE_STRING_8; ia_req: WSF_REQUEST; ia_res: WSF_RESPONSE)
|
||||
create themehdl.make (api)
|
||||
themehdl.set_not_found_handler (agent (ia_uri: READABLE_STRING_8; ia_req: WSF_REQUEST; ia_res: WSF_RESPONSE)
|
||||
do
|
||||
execute_default (ia_req, ia_res)
|
||||
end)
|
||||
a_router.handle ("/theme/", fhdl, router.methods_GET)
|
||||
-- See CMS_API.api.theme_path_for (...) for the hardcoded "/theme/" path.
|
||||
a_router.handle ("/theme/{theme_id}{/vars}", themehdl, router.methods_GET)
|
||||
|
||||
-- "/files/.."
|
||||
create fhdl.make_hidden_with_path (api.files_location)
|
||||
@@ -213,7 +214,7 @@ feature -- Settings: router
|
||||
do
|
||||
execute_default (ia_req, ia_res)
|
||||
end)
|
||||
a_router.handle ("/files/", fhdl, router.methods_GET)
|
||||
a_router.handle (api.files_path, fhdl, router.methods_GET)
|
||||
|
||||
-- files folder from specific module.
|
||||
a_router.handle ("/module/{modname}/files{/vars}", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_module_files), a_router.methods_get)
|
||||
@@ -244,6 +245,7 @@ feature -- Request execution
|
||||
initialize_site_execution
|
||||
-- Initialize for site execution.
|
||||
do
|
||||
api.switch_to_site_mode
|
||||
api.initialize_execution
|
||||
setup_router
|
||||
end
|
||||
|
||||
59
src/service/handler/cms_theme_file_system_handler.e
Normal file
59
src/service/handler/cms_theme_file_system_handler.e
Normal file
@@ -0,0 +1,59 @@
|
||||
note
|
||||
description: "Summary description for {CMS_THEME_FILE_SYSTEM_HANDLER}."
|
||||
author: ""
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
class
|
||||
CMS_THEME_FILE_SYSTEM_HANDLER
|
||||
|
||||
inherit
|
||||
WSF_URI_TEMPLATE_HANDLER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- Initialization
|
||||
|
||||
make (a_cms_api: CMS_API)
|
||||
do
|
||||
api := a_cms_api
|
||||
end
|
||||
|
||||
api: CMS_API
|
||||
|
||||
feature -- Execution
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- Execute `req' responding in `res'.
|
||||
local
|
||||
fhdl: WSF_FILE_SYSTEM_HANDLER
|
||||
not_found: NOT_FOUND_ERROR_CMS_RESPONSE
|
||||
do
|
||||
if attached {WSF_STRING} req.path_parameter ("theme_id") as l_theme_id then
|
||||
create fhdl.make_hidden_with_path (api.theme_assets_location_for (l_theme_id.value))
|
||||
fhdl.disable_index
|
||||
fhdl.set_not_found_handler (not_found_handler)
|
||||
fhdl.execute_starts_with (api.theme_path_for (l_theme_id.value), req, res)
|
||||
-- a_router.handle (api.theme_path, fhdl, router.methods_GET)
|
||||
elseif attached not_found_handler as h then
|
||||
h.call (req.percent_encoded_path_info, req, res)
|
||||
else
|
||||
create not_found.make (req, res, api)
|
||||
not_found.execute
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Not found handling
|
||||
|
||||
not_found_handler: detachable PROCEDURE [READABLE_STRING_8, WSF_REQUEST, WSF_RESPONSE]
|
||||
|
||||
set_not_found_handler (h: like not_found_handler)
|
||||
do
|
||||
not_found_handler := h
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -25,7 +25,10 @@ feature {NONE} -- Initialization
|
||||
create header.make
|
||||
create values.make (3)
|
||||
site_url := a_api.site_url
|
||||
base_url := a_api.base_url
|
||||
if attached a_api.base_url as l_base_url then
|
||||
base_url := l_base_url
|
||||
end
|
||||
base_path := a_api.base_path
|
||||
initialize
|
||||
end
|
||||
|
||||
@@ -124,8 +127,8 @@ feature -- URL utilities
|
||||
if attached setup.front_page_path as l_front_page_path then
|
||||
Result := l_front_page_path.same_string (l_path_info)
|
||||
else
|
||||
if attached base_url as l_base_url then
|
||||
Result := l_path_info.same_string (l_base_url)
|
||||
if base_path.same_string (l_path_info) then
|
||||
Result := True
|
||||
else
|
||||
Result := l_path_info.is_empty or else l_path_info.same_string ("/")
|
||||
end
|
||||
@@ -134,12 +137,18 @@ feature -- URL utilities
|
||||
|
||||
site_url: IMMUTABLE_STRING_8
|
||||
-- Absolute site url.
|
||||
-- Always ends with '/'
|
||||
|
||||
base_url: detachable IMMUTABLE_STRING_8
|
||||
-- Base url if any.
|
||||
--| Usually it is Void, but it could be
|
||||
--| /project/demo/
|
||||
|
||||
base_path: IMMUTABLE_STRING_8
|
||||
-- Base path, default to "/".
|
||||
-- Always ends with '/'
|
||||
-- Could be /project/demo/
|
||||
|
||||
feature -- Access: CMS
|
||||
|
||||
site_name: STRING_32
|
||||
@@ -1242,6 +1251,7 @@ feature -- Generation
|
||||
|
||||
-- Variables
|
||||
page.register_variable (absolute_url ("", Void), "site_url")
|
||||
page.register_variable (base_path, "base_path")
|
||||
page.register_variable (absolute_url ("", Void), "host") -- Same as `site_url'.
|
||||
page.register_variable (request.is_https, "is_https")
|
||||
if attached title as l_title then
|
||||
@@ -1253,6 +1263,8 @@ feature -- Generation
|
||||
page.set_is_https (request.is_https)
|
||||
|
||||
-- Variables/Misc
|
||||
page.register_variable (is_administration_mode, "is_administration_mode")
|
||||
page.register_variable (api.theme_path, "theme_path")
|
||||
|
||||
-- FIXME: logo .. could be a settings of theme, managed by admin front-end/database.
|
||||
-- if attached logo_location as l_logo then
|
||||
@@ -1398,6 +1410,14 @@ feature -- Helpers: URLs
|
||||
Result := api.location_url (a_location, opts)
|
||||
end
|
||||
|
||||
module_resource_url (a_module: CMS_MODULE; a_path: READABLE_STRING_8; opts: detachable CMS_API_OPTIONS): STRING_8
|
||||
-- Url for resource `a_path` associated with module `a_module`.
|
||||
require
|
||||
a_valid_valid: a_path.is_empty or else a_path.starts_with ("/")
|
||||
do
|
||||
Result := url ("/module/" + a_module.name + a_path, opts)
|
||||
end
|
||||
|
||||
user_url (u: CMS_USER): like url
|
||||
require
|
||||
u_with_id: u.has_id
|
||||
|
||||
Reference in New Issue
Block a user