diff --git a/cms/src/configuration/cms_setup.e b/cms/src/configuration/cms_setup.e index 6659735..58b0e31 100644 --- a/cms/src/configuration/cms_setup.e +++ b/cms/src/configuration/cms_setup.e @@ -45,6 +45,10 @@ feature -- Access: Site files_location: PATH + front_page_path: detachable READABLE_STRING_8 + -- Optional path defining the front page. + -- By default "" or "/". + feature -- Access: Theme themes_location: PATH diff --git a/cms/src/hooks/cms_hook_block.e b/cms/src/hooks/cms_hook_block.e index 54b493a..89d001c 100644 --- a/cms/src/hooks/cms_hook_block.e +++ b/cms/src/hooks/cms_hook_block.e @@ -13,10 +13,12 @@ inherit feature -- Hook block_list: ITERABLE [like {CMS_BLOCK}.name] + -- List of block names, managed by current object. deferred end - get_block_view (a_block_id: detachable READABLE_STRING_8; a_response: CMS_RESPONSE) + get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE) + -- Get block object identified by `a_block_id' and associate with `a_response'. deferred end diff --git a/cms/src/kernel/link/cms_menu_system.e b/cms/src/kernel/link/cms_menu_system.e index 470aba3..5565c5d 100644 --- a/cms/src/kernel/link/cms_menu_system.e +++ b/cms/src/kernel/link/cms_menu_system.e @@ -20,9 +20,9 @@ feature {NONE} -- Initialization do to_implement ("Refactor, take the info from a Database or Configuration file.") create items.make (5) - force (create {CMS_MENU}.make ("primary_nav", 3)) -- primary menu - force (create {CMS_MENU}.make_with_title ("management_nav", "Management", 3)) -- secondary in admin view. - force (create {CMS_MENU}.make_with_title ("secondary_nav", "Navigation", 3)) -- secondary + force (create {CMS_MENU}.make ("primary", 3)) -- primary menu + force (create {CMS_MENU}.make_with_title ("management", "Management", 3)) -- secondary in admin view. + force (create {CMS_MENU}.make_with_title ("secondary", "Navigation", 3)) -- secondary force (create {CMS_MENU}.make_with_title ("user", "User", 3)) -- first_side_bar end @@ -41,18 +41,30 @@ feature -- Access end main_menu: CMS_MENU + obsolete + "Use `primary_menu' [Nov/2014]" do - Result := item ("primary_nav") + Result := primary_menu + end + + primary_menu: CMS_MENU + do + Result := item ("primary") + end + + secondary_menu: CMS_MENU + do + Result := item ("secondary") end management_menu: CMS_MENU do - Result := item ("management_nav") + Result := item ("management") end navigation_menu: CMS_MENU do - Result := item ("secondary_nav") + Result := item ("navigation") end user_menu: CMS_MENU diff --git a/cms/src/modules/basic_auth/basic_auth_module.e b/cms/src/modules/basic_auth/basic_auth_module.e index a198ed7..555d2cb 100644 --- a/cms/src/modules/basic_auth/basic_auth_module.e +++ b/cms/src/modules/basic_auth/basic_auth_module.e @@ -70,10 +70,4 @@ feature {NONE} -- Implementation: routes a_router.handle_with_request_methods ("/basic_auth_logoff", l_bal_handler, l_methods) end -feature -- Hooks - - register_hooks (a_response: CMS_RESPONSE) - do - end - end diff --git a/cms/src/modules/cms_module.e b/cms/src/modules/cms_module.e index 6632eba..ce0a9a2 100644 --- a/cms/src/modules/cms_module.e +++ b/cms/src/modules/cms_module.e @@ -33,7 +33,7 @@ feature -- Hooks configuration -- Module hooks configuration. require is_enabled: is_enabled - deferred + do end feature -- Filter diff --git a/cms/src/modules/node/node_module.e b/cms/src/modules/node/node_module.e index d69e527..f5c7349 100644 --- a/cms/src/modules/node/node_module.e +++ b/cms/src/modules/node/node_module.e @@ -9,6 +9,9 @@ class inherit CMS_MODULE + redefine + register_hooks + end CMS_HOOK_MENU_ALTER @@ -68,6 +71,7 @@ feature {NONE} -- Implementation: routes l_methods.enable_put l_methods.enable_delete a_router.handle_with_request_methods ("/node/{id}", l_node_handler, l_methods) + a_router.handle_with_request_methods ("/nodes/", create {WSF_URI_AGENT_HANDLER}.make (agent do_get_nodes (?,?, api)), a_router.methods_get) end configure_api_nodes (api: CMS_API; a_router: WSF_ROUTER) @@ -94,7 +98,6 @@ feature {NONE} -- Implementation: routes a_router.handle_with_request_methods ("/node/{id}/summary", l_report_handler, l_methods) end - configure_api_node_title (api: CMS_API; a_router: WSF_ROUTER) local l_report_handler: NODE_TITLE_HANDLER @@ -134,17 +137,12 @@ feature -- Hooks Result := <<"node-info">> end - get_block_view (a_block_id: detachable READABLE_STRING_8; a_response: CMS_RESPONSE) --- local + get_block_view (a_block_id: READABLE_STRING_8; a_response: CMS_RESPONSE) + local -- b: CMS_CONTENT_BLOCK do --- if --- a_execution.is_front and then --- attached a_execution.user as u --- then --- create b.make ("node-info", "Node", "Node ...", a_execution.formats.plain_text) --- a_execution.add_block (b, Void) --- end +-- create b.make (a_block_id, "Block::node", "This is a block test", Void) +-- a_response.add_block (b, "sidebar_second") end menu_alter (a_menu_system: CMS_MENU_SYSTEM; a_response: CMS_RESPONSE) @@ -152,8 +150,20 @@ feature -- Hooks lnk: CMS_LOCAL_LINK -- perms: detachable ARRAYED_LIST [READABLE_STRING_8] do - create lnk.make ("List of nodes", "/nodes") - a_menu_system.main_menu.extend (lnk) + create lnk.make ("List of nodes", a_response.url ("/nodes", Void)) + a_menu_system.primary_menu.extend (lnk) + end + +feature -- Handler + + do_get_nodes (req: WSF_REQUEST; res: WSF_RESPONSE; a_api: CMS_API) + local + r: CMS_RESPONSE + do + create {NOT_IMPLEMENTED_ERROR_CMS_RESPONSE} r.make (req, res, a_api) + r.set_main_content ("Sorry: listing the CMS nodes is not yet implemented.") + r.add_block (create {CMS_CONTENT_BLOCK}.make ("nodes_warning", Void, "/nodes/ is not yet implemented", Void), "highlighted") + r.execute end end diff --git a/cms/src/service/cms_api_options.e b/cms/src/service/cms_api_options.e new file mode 100644 index 0000000..1a5dc6e --- /dev/null +++ b/cms/src/service/cms_api_options.e @@ -0,0 +1,17 @@ +note + description: "Summary description for {CMS_API_OPTIONS}." + author: "" + date: "$Date$" + revision: "$Revision$" + +class + CMS_API_OPTIONS + +inherit + WSF_API_OPTIONS + +create + make, + make_from_manifest + +end diff --git a/cms/src/service/cms_request_util.e b/cms/src/service/cms_request_util.e index e9e26c8..e6a1be6 100644 --- a/cms/src/service/cms_request_util.e +++ b/cms/src/service/cms_request_util.e @@ -9,6 +9,8 @@ deferred class inherit + CMS_ENCODERS + REFACTORING_HELPER feature -- User @@ -21,8 +23,6 @@ feature -- User if attached {CMS_USER} current_user (req) as l_user then Result := l_user.name end - - end current_user (req: WSF_REQUEST): detachable CMS_USER diff --git a/cms/src/service/cms_url_utilities.e b/cms/src/service/cms_url_utilities.e new file mode 100644 index 0000000..8fff472 --- /dev/null +++ b/cms/src/service/cms_url_utilities.e @@ -0,0 +1,129 @@ +note + description: "Summary description for {CMS_URL_UTILITIES}." + author: "" + date: "$Date$" + revision: "$Revision$" + +deferred class + CMS_URL_UTILITIES + +inherit + CMS_REQUEST_UTIL + +feature -- Core + + site_url: READABLE_STRING_8 + deferred + end + + base_url: detachable READABLE_STRING_8 + -- Base url if any. + deferred + end + + based_path (p: STRING): STRING + -- Path `p' in the context of the `base_url' + do + if attached base_url as l_base_url then + create Result.make_from_string (l_base_url) + if p.is_empty then + else + if p[1] = '/' then + Result.append (p.substring (2, p.count)) + else + Result.append (p) + end + end + else + Result := p + end + end + +feature -- Url + + absolute_url (a_path: STRING; opts: detachable CMS_API_OPTIONS): STRING + local + l_opts: detachable CMS_API_OPTIONS + do + l_opts := opts + if l_opts = Void then + create l_opts.make (1) + end + l_opts.force (True, "absolute") + Result := url (a_path, l_opts) + end + + url (a_path: READABLE_STRING_8; opts: detachable CMS_API_OPTIONS): STRING + -- URL for path `a_path' and optional parameters from `opts'. + --| Options `opts' could be + --| - absolute: True|False => return absolute url + --| - query: string => append "?query" + --| - fragment: string => append "#fragment" + local + q,f: detachable STRING_8 + l_abs: BOOLEAN + do + l_abs := False + + if opts /= Void then + l_abs := opts.boolean_item ("absolute", l_abs) + if attached opts.item ("query") as l_query then + if attached {READABLE_STRING_8} l_query as s_value then + q := s_value + elseif attached {ITERABLE [TUPLE [key, value: READABLE_STRING_GENERAL]]} l_query as lst then + create q.make_empty + across + lst as c + loop + if q.is_empty then + else + q.append_character ('&') + end + q.append (url_encoded (c.item.key)) + q.append_character ('=') + q.append (url_encoded (c.item.value)) + end + end + end + if attached opts.string_item ("fragment") as s_frag then + f := s_frag + end + end + if l_abs then + if a_path.substring_index ("://", 1) = 0 then + create Result.make_from_string (site_url) + if a_path.is_empty then + elseif Result.ends_with ("/") then + if a_path[1] = '/' then + Result.append_string (a_path.substring (2, a_path.count)) + else + Result.append_string (a_path) + end + else + if a_path[1] = '/' then + Result.append_string (a_path) + else + Result.append_character ('/') + Result.append_string (a_path) + end + end + else + Result := a_path + end + else + Result := based_path (a_path) + end + if q /= Void then + Result.append ("?" + q) + end + if f /= Void then + Result.append ("#" + f) + end + end + + checked_url (a_url: READABLE_STRING_8): READABLE_STRING_8 + do + Result := a_url + end + +end diff --git a/cms/src/service/response/cms_response.e b/cms/src/service/response/cms_response.e index 6ec8bf8..14894ab 100644 --- a/cms/src/service/response/cms_response.e +++ b/cms/src/service/response/cms_response.e @@ -7,15 +7,13 @@ deferred class CMS_RESPONSE inherit - CMS_ENCODERS - - CMS_REQUEST_UTIL + CMS_URL_UTILITIES REFACTORING_HELPER feature {NONE} -- Initialization - make(req: WSF_REQUEST; res: WSF_RESPONSE; a_api: like api) + make (req: WSF_REQUEST; res: WSF_RESPONSE; a_api: like api) do status_code := {HTTP_STATUS_CODE}.ok api := a_api @@ -79,6 +77,36 @@ feature -- Access additional_page_head_lines: detachable LIST [READABLE_STRING_8] -- HTML>head>...extra lines +feature -- URL utilities + + is_front: BOOLEAN + -- Is current response related to "front" page? + local + l_path_info: READABLE_STRING_8 + do + l_path_info := request.path_info + 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) + else + Result := l_path_info.is_empty or else l_path_info.same_string ("/") + end + end + end + + site_url: READABLE_STRING_8 + do + Result := absolute_host (request, "") + end + + base_url: detachable READABLE_STRING_8 + -- Base url if any. + --| Usually it is Void, but it could be + --| /project/demo/ + --| FIXME: for now, no way to change that. Always at the root "/" + feature -- Access: CMS site_name: STRING_32 @@ -94,6 +122,8 @@ feature -- Access: CMS values: CMS_VALUE_TABLE -- Associated values indexed by string name. + + feature -- Permission -- FIXME: to be implemented has_permissions and has_permission. @@ -206,8 +236,15 @@ feature -- Menu menu_system: CMS_MENU_SYSTEM main_menu: CMS_MENU + obsolete + "Use `primary_menu' [Nov/2014]" do - Result := menu_system.main_menu + Result := primary_menu + end + + primary_menu: CMS_MENU + do + Result := menu_system.primary_menu end management_menu: CMS_MENU @@ -323,7 +360,6 @@ feature -- Blocks if attached navigation_menu_block as l_block then add_block (l_block, "first_sidebar") end - if attached user_menu_block as l_block then add_block (l_block, "first_sidebar") end @@ -335,9 +371,9 @@ feature -- Blocks hook_block_view end - main_menu_block: detachable CMS_MENU_BLOCK + primary_menu_block: detachable CMS_MENU_BLOCK do - if attached main_menu as m and then not m.is_empty then + if attached primary_menu as m and then not m.is_empty then create Result.make (m) end end @@ -384,17 +420,17 @@ feature -- Blocks s: STRING l_hb: STRING do - create s.make_from_string (theme.menu_html (main_menu, True)) + create s.make_from_string (theme.menu_html (primary_menu, True)) create l_hb.make_empty create Result.make ("header", Void, l_hb, formats.full_html) Result.set_is_raw (True) end - horizontal_main_menu_html: STRING + horizontal_primary_menu_html: STRING do create Result.make_empty Result.append ("
") end @@ -564,11 +600,15 @@ feature -- Hook: block feature -- Menu: change add_to_main_menu (lnk: CMS_LINK) + obsolete + "use add_to_primary_menu [Nov/2014]" do --- if attached {CMS_LOCAL_LINK} lnk as l_local then --- l_local.get_is_active (request) --- end - main_menu.extend (lnk) + add_to_primary_menu (lnk) + end + + add_to_primary_menu (lnk: CMS_LINK) + do + add_to_menu (lnk, primary_menu) end add_to_menu (lnk: CMS_LINK; m: CMS_MENU) @@ -646,7 +686,7 @@ feature -- Message feature -- Theme theme: CMS_THEME - -- Current theme + -- Current theme get_theme local @@ -681,106 +721,112 @@ feature -- Generation prepare (page: CMS_HTML_PAGE) do + -- Menu + add_to_primary_menu (create {CMS_LOCAL_LINK}.make ("Home", "/")) + call_menu_alter_hooks (menu_system) + prepare_menu_system (menu_system) + + -- Blocks + get_blocks + across + regions as reg_ic + loop + across + reg_ic.item.blocks as ic + loop + if attached {CMS_MENU_BLOCK} ic.item as l_menu_block then + recursive_get_active (l_menu_block.menu, request) + end + end + end + + -- Values common_prepare (page) custom_prepare (page) - -- Menu - add_to_main_menu (create {CMS_LOCAL_LINK}.make ("Home", "/")) - call_menu_alter_hooks (menu_system) - prepare_menu_system (menu_system) + -- Cms values + call_value_alter_hooks (values) - -- Blocks - get_blocks + -- Predefined values + page.register_variable (page, "page") -- DO NOT REMOVE + + -- Values Associated with current Execution object. + across + values as ic + loop + page.register_variable (ic.item, ic.key) + end + + -- Block rendering + across + regions as reg_ic + loop across - regions as reg_ic + reg_ic.item.blocks as ic loop - across - reg_ic.item.blocks as ic - loop - if attached {CMS_MENU_BLOCK} ic.item as l_menu_block then - recursive_get_active (l_menu_block.menu, request) - end - end + page.add_to_region (theme.block_html (ic.item), reg_ic.item.name) end + end - -- Values - if attached current_user_name (request) as l_user then - page.register_variable (l_user, "user") - end - - -- Cms values - call_value_alter_hooks (values) - - - -- Predefined values - if attached title as l_title then - page.set_title (l_title) - else - page.set_title ("CMS::" + request.path_info) - end - page.register_variable (page, "page") - - -- page.register_variable (is_front, "is_front") - page.register_variable (request.absolute_script_url (""), "site_url") - page.register_variable (title, "site_title") - -- page.register_variable (site_name_and_slogan, "site_name_and_slogan") - -- if attached logo_location as l_logo then - -- page.register_variable (l_logo, "logo") - -- end - page.register_variable (horizontal_main_menu_html, "primary_nav") - - -- Values Associated with current Execution object. + -- Additional lines in -+ if attached additional_page_head_lines as l_head_lines then across - values as ic + l_head_lines as hl loop - page.register_variable (ic.item, ic.key) + page.head_lines.force (hl.item) end - - -- Block rendering - across - regions as reg_ic - loop - across - reg_ic.item.blocks as ic - loop - page.add_to_region (theme.block_html (ic.item), reg_ic.item.name) - end - end - - -- Additional lines in
- if attached additional_page_head_lines as l_head_lines then
- across
- l_head_lines as hl
- loop
- page.head_lines.force (hl.item)
- end
- end
-
- end
-
- common_prepare (page: CMS_HTML_PAGE)
- do
- fixme ("Fix generacion common")
- page.register_variable (request.absolute_script_url (""), "host")
- page.register_variable (setup.is_web, "web")
- page.register_variable (setup.is_html, "html")
- if attached current_user_name (request) as l_user then
- page.register_variable (l_user, "user")
end
end
+ common_prepare (page: CMS_HTML_PAGE)
+ -- Common preparation for page `page'.
+ do
+ fixme ("Fix generation common")
+
+ -- Information
+ page.set_title (title)
+ debug ("cms")
+ if title = Void then
+ page.set_title ("CMS::" + request.path_info) --| FIXME: probably, should be removed and handled by theme.
+ end
+ end
+
+ -- Variables
+ page.register_variable (request.absolute_script_url (""), "site_url")
+ page.register_variable (request.absolute_script_url (""), "host") -- Same as `site_url'.
+ if attached current_user_name (request) as l_user then
+ page.register_variable (l_user, "user")
+ end
+ page.register_variable (title, "site_title")
+ page.set_is_front (is_front)
+
+ -- Variables/Setup
+ page.register_variable (setup.is_web, "web")
+ page.register_variable (setup.is_html, "html")
+
+ -- Variables/Misc
+
+-- FIXME: logo .. could be a settings of theme, managed by admin front-end/database.
+-- if attached logo_location as l_logo then
+-- page.register_variable (l_logo, "logo")
+-- end
+
+ -- Menu...
+ page.register_variable (horizontal_primary_menu_html, "primary_nav")
+ end
+
custom_prepare (page: CMS_HTML_PAGE)
+ -- Common preparation for page `page' that can be redefined by descendants.
do
end
-
prepare_menu_system (a_menu_system: CMS_MENU_SYSTEM)
do
--- across
--- a_menu_system as c
--- loop
--- prepare_links (c.item)
--- end
+ across
+ a_menu_system as c
+ loop
+ prepare_links (c.item)
+ end
end
prepare_links (a_menu: CMS_LINK_COMPOSITE)
@@ -796,7 +842,7 @@ feature -- Generation
-- to_remove.force (lm)
-- else
-- if lm.permission_arguments is Void , this is permitted
--- lm.get_is_active (request)
+ get_local_link_active_status (lm)
if attached {CMS_LINK_COMPOSITE} lm as comp then
prepare_links (comp)
end
@@ -823,7 +869,7 @@ feature -- Generation
loop
ln := ic.item
if attached {CMS_LOCAL_LINK} ln as l_local then
--- l_local.get_is_active (request)
+ get_local_link_active_status (l_local)
end
if (ln.is_expanded or ln.is_collapsed) and then attached {CMS_LINK_COMPOSITE} ln as l_comp then
recursive_get_active (l_comp, req)
@@ -832,6 +878,23 @@ feature -- Generation
end
end
+ get_local_link_active_status (a_lnk: CMS_LOCAL_LINK)
+ -- Get `a_lnk.is_active' value according to `request' data.
+ local
+ qs: STRING
+ l_is_active: BOOLEAN
+ do
+ create qs.make_from_string (request.percent_encoded_path_info)
+ l_is_active := qs.same_string (a_lnk.location)
+ if not l_is_active then
+ if attached request.query_string as l_query_string and then not l_query_string.is_empty then
+ qs.append_character ('?')
+ qs.append (l_query_string)
+ end
+ l_is_active := qs.same_string (a_lnk.location)
+ end
+ a_lnk.set_is_active (l_is_active)
+ end
feature -- Custom Variables
diff --git a/cms/src/service/response/error_500_cms_response.e b/cms/src/service/response/error_500_cms_response.e
index 24c908e..7bfea99 100644
--- a/cms/src/service/response/error_500_cms_response.e
+++ b/cms/src/service/response/error_500_cms_response.e
@@ -21,8 +21,8 @@ feature -- Generation
custom_prepare (page: CMS_HTML_PAGE)
do
page.register_variable (request.absolute_script_url (request.path_info), "request")
- page.register_variable ("500", "code")
- page.set_status_code (500)
+ page.set_status_code ({HTTP_STATUS_CODE}.internal_server_error)
+ page.register_variable (page.status_code.out, "code")
end
feature -- Execution
diff --git a/cms/src/service/response/not_implemented_error_cms_response.e b/cms/src/service/response/not_implemented_error_cms_response.e
new file mode 100644
index 0000000..2d37558
--- /dev/null
+++ b/cms/src/service/response/not_implemented_error_cms_response.e
@@ -0,0 +1,37 @@
+note
+ description: "Summary description for {NOT_IMPLEMENTED_ERROR_CMS_RESPONSE}."
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ NOT_IMPLEMENTED_ERROR_CMS_RESPONSE
+
+inherit
+
+ CMS_RESPONSE
+ redefine
+ custom_prepare
+ end
+
+create
+ make
+
+feature -- Generation
+
+ custom_prepare (page: CMS_HTML_PAGE)
+ do
+ page.register_variable (request.absolute_script_url (request.path_info), "request")
+ page.register_variable ("501", "code")
+ page.set_status_code (501)
+ end
+
+feature -- Execution
+
+ process
+ -- Computed response message.
+ do
+ set_title ("Not Implemented")
+ set_page_title (Void)
+ end
+end
+
diff --git a/cms/src/theme/cms_html_page.e b/cms/src/theme/cms_html_page.e
index 1565d07..3b06281 100644
--- a/cms/src/theme/cms_html_page.e
+++ b/cms/src/theme/cms_html_page.e
@@ -38,7 +38,9 @@ feature -- Access
-- Optional page type.
-- such as "front", "about", ... that could be customized by themes.
- title: detachable STRING
+ is_front: BOOLEAN
+
+ title: detachable READABLE_STRING_32
language: STRING
@@ -59,6 +61,7 @@ feature -- Access
feature -- Status
+
status_code: INTEGER
feature -- Header
@@ -87,6 +90,12 @@ feature -- Region
feature -- Element change
+ set_is_front (b: BOOLEAN)
+ -- Set `is_front' to `b'.
+ do
+ is_front := b
+ end
+
register_variable (a_value: detachable ANY; k: READABLE_STRING_GENERAL)
do
variables.force (a_value, k)
diff --git a/cms/src/theme/smarty_theme/smarty_cms_html_page_inspector.e b/cms/src/theme/smarty_theme/smarty_cms_html_page_inspector.e
index 45d57c8..cbe3c4a 100644
--- a/cms/src/theme/smarty_theme/smarty_cms_html_page_inspector.e
+++ b/cms/src/theme/smarty_theme/smarty_cms_html_page_inspector.e
@@ -13,6 +13,8 @@ inherit
internal_data
end
+ CMS_ENCODERS
+
create
register
@@ -29,7 +31,13 @@ feature {TEMPLATE_ROUTINES}
if attached l_page.variables.item (l_fn) as v then
Result := cell_of (v)
elseif l_fn.is_case_insensitive_equal ("title") then
- Result := cell_of (l_page.title)
+ if attached l_page.title as l_title then
+ Result := cell_of (html_encoded (l_title))
+ else
+ Result := cell_of (Void)
+ end
+ elseif l_fn.is_case_insensitive_equal ("is_front") then
+ Result := cell_of (l_page.is_front)
elseif l_fn.starts_with_general ("region_") then
l_fn.remove_head (7) -- remove "region_"
Result := cell_of (l_page.region (l_fn))
diff --git a/cms/src/theme/smarty_theme/smarty_cms_page_template.e b/cms/src/theme/smarty_theme/smarty_cms_page_template.e
index 188a743..d5b45ab 100644
--- a/cms/src/theme/smarty_theme/smarty_cms_page_template.e
+++ b/cms/src/theme/smarty_theme/smarty_cms_page_template.e
@@ -9,6 +9,8 @@ class
inherit
CMS_PAGE_TEMPLATE
+ CMS_ENCODERS
+
SHARED_TEMPLATE_CONTEXT
create
@@ -41,12 +43,13 @@ feature -- Access
variables.force (ic.item, ic.key)
end
+ -- FIXME: review variables !
if attached page.title as l_title then
- variables.force (l_title, "page_title")
- variables.force (l_title, "head_title")
+ variables.force (html_encoded (l_title), "head_title")
+ variables.force (html_encoded (l_title), "page_title")
else
+ variables.force ("CMS", "head_title")
variables.force ("", "page_title")
- variables.force ("", "head_title")
end
variables.force (page.language, "language")
diff --git a/examples/roc_api/modules/demo/cms_demo_module-safe.ecf b/examples/roc_api/modules/demo/cms_demo_module-safe.ecf
index dd678f2..a954561 100644
--- a/examples/roc_api/modules/demo/cms_demo_module-safe.ecf
+++ b/examples/roc_api/modules/demo/cms_demo_module-safe.ecf
@@ -12,6 +12,7 @@