Merge branch 'master' into es_17_01
This commit is contained in:
@@ -60,6 +60,7 @@ feature -- Access: router
|
|||||||
l_admin_cache_handler: CMS_ADMIN_CACHE_HANDLER
|
l_admin_cache_handler: CMS_ADMIN_CACHE_HANDLER
|
||||||
l_admin_export_handler: CMS_ADMIN_EXPORT_HANDLER
|
l_admin_export_handler: CMS_ADMIN_EXPORT_HANDLER
|
||||||
l_admin_import_handler: CMS_ADMIN_IMPORT_HANDLER
|
l_admin_import_handler: CMS_ADMIN_IMPORT_HANDLER
|
||||||
|
l_admin_path_alias_handler: CMS_ADMIN_PATH_ALIAS_HANDLER
|
||||||
|
|
||||||
l_uri_mapping: WSF_URI_MAPPING
|
l_uri_mapping: WSF_URI_MAPPING
|
||||||
do
|
do
|
||||||
@@ -83,6 +84,10 @@ feature -- Access: router
|
|||||||
create l_uri_mapping.make_trailing_slash_ignored ("/admin/logs", l_admin_logs_handler)
|
create l_uri_mapping.make_trailing_slash_ignored ("/admin/logs", l_admin_logs_handler)
|
||||||
a_router.map (l_uri_mapping, a_router.methods_get)
|
a_router.map (l_uri_mapping, a_router.methods_get)
|
||||||
|
|
||||||
|
create l_admin_path_alias_handler.make (a_api)
|
||||||
|
create l_uri_mapping.make_trailing_slash_ignored ("/admin/path_alias", l_admin_path_alias_handler)
|
||||||
|
a_router.map (l_uri_mapping, a_router.methods_get_post)
|
||||||
|
|
||||||
|
|
||||||
create l_admin_cache_handler.make (a_api)
|
create l_admin_cache_handler.make (a_api)
|
||||||
create l_uri_mapping.make_trailing_slash_ignored ("/admin/cache", l_admin_cache_handler)
|
create l_uri_mapping.make_trailing_slash_ignored ("/admin/cache", l_admin_cache_handler)
|
||||||
@@ -119,14 +124,10 @@ feature -- Security
|
|||||||
Result.force ("admin users")
|
Result.force ("admin users")
|
||||||
Result.force ("admin roles")
|
Result.force ("admin roles")
|
||||||
Result.force ("admin modules")
|
Result.force ("admin modules")
|
||||||
Result.force ("install modules")
|
|
||||||
Result.force ("view logs")
|
|
||||||
Result.force ("admin core caches")
|
Result.force ("admin core caches")
|
||||||
Result.force ("clear blocks cache")
|
Result.force ("clear blocks cache")
|
||||||
Result.force ("admin export")
|
Result.force ("admin export")
|
||||||
Result.force ("admin import")
|
Result.force ("admin import")
|
||||||
Result.force ("export core")
|
|
||||||
Result.force ("import core")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
feature -- Hooks
|
feature -- Hooks
|
||||||
|
|||||||
124
modules/admin/handler/cms_admin_path_alias_handler.e
Normal file
124
modules/admin/handler/cms_admin_path_alias_handler.e
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
note
|
||||||
|
description: "[
|
||||||
|
Administrate path aliases.
|
||||||
|
]"
|
||||||
|
date: "$Date$"
|
||||||
|
revision: "$Revision$"
|
||||||
|
|
||||||
|
class
|
||||||
|
CMS_ADMIN_PATH_ALIAS_HANDLER
|
||||||
|
|
||||||
|
inherit
|
||||||
|
CMS_HANDLER
|
||||||
|
|
||||||
|
WSF_URI_HANDLER
|
||||||
|
rename
|
||||||
|
new_mapping as new_uri_mapping
|
||||||
|
end
|
||||||
|
|
||||||
|
WSF_RESOURCE_HANDLER_HELPER
|
||||||
|
redefine
|
||||||
|
do_get,
|
||||||
|
do_post
|
||||||
|
end
|
||||||
|
|
||||||
|
REFACTORING_HELPER
|
||||||
|
|
||||||
|
create
|
||||||
|
make
|
||||||
|
|
||||||
|
feature -- Execution
|
||||||
|
|
||||||
|
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
-- Execute request handler
|
||||||
|
do
|
||||||
|
execute_methods (req, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
local
|
||||||
|
l_response: CMS_RESPONSE
|
||||||
|
l_sources: ARRAYED_LIST [READABLE_STRING_8]
|
||||||
|
l_alias: detachable READABLE_STRING_8
|
||||||
|
s: STRING
|
||||||
|
b: BOOLEAN
|
||||||
|
do
|
||||||
|
if api.has_permission ("admin path_alias") then
|
||||||
|
create {GENERIC_VIEW_CMS_RESPONSE} l_response.make (req, res, api)
|
||||||
|
if attached api.storage.path_aliases as tb then
|
||||||
|
create s.make_empty
|
||||||
|
s.append ("<h1>Path aliases</h1>%N")
|
||||||
|
s.append ("<ul class=%"path_aliases%">")
|
||||||
|
create l_sources.make (tb.count)
|
||||||
|
l_sources.compare_objects
|
||||||
|
across
|
||||||
|
tb as ic
|
||||||
|
loop
|
||||||
|
b := l_sources.has (ic.item)
|
||||||
|
if b then
|
||||||
|
s.append ("<li class=%"warning%">")
|
||||||
|
else
|
||||||
|
s.append ("<li>")
|
||||||
|
l_sources.force (ic.item)
|
||||||
|
end
|
||||||
|
if ic.key.is_valid_as_string_8 then
|
||||||
|
l_alias := ic.key.to_string_8
|
||||||
|
s.append (l_response.link (ic.key, l_alias, Void))
|
||||||
|
else
|
||||||
|
l_alias := Void
|
||||||
|
s.append (l_response.html_encoded (ic.key))
|
||||||
|
end
|
||||||
|
s.append (" => ")
|
||||||
|
s.append (l_response.link (ic.item, ic.item, Void))
|
||||||
|
if b then
|
||||||
|
s.append (" <span class=%"warning%">(archived)</span>")
|
||||||
|
if l_alias /= Void then
|
||||||
|
s.append ("<form action=%"%" method=%"POST%"><input type=%"hidden%" name=%"path_alias%" value=%"" + l_alias + "%"/><input type=%"hidden%" name=%"source%" value=%"" + ic.item + "%"/><input type=%"submit%" name=%"op%" value=%"unset%"/></form>")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
s.append ("</li>")
|
||||||
|
end
|
||||||
|
s.append ("</ul>")
|
||||||
|
end
|
||||||
|
l_response.set_main_content (s)
|
||||||
|
else
|
||||||
|
create {FORBIDDEN_ERROR_CMS_RESPONSE} l_response.make (req, res, api)
|
||||||
|
end
|
||||||
|
l_response.execute
|
||||||
|
end
|
||||||
|
|
||||||
|
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||||
|
local
|
||||||
|
l_response: CMS_RESPONSE
|
||||||
|
s: STRING
|
||||||
|
do
|
||||||
|
if api.has_permission ("admin path_alias") then
|
||||||
|
create {GENERIC_VIEW_CMS_RESPONSE} l_response.make (req, res, api)
|
||||||
|
create s.make_empty
|
||||||
|
|
||||||
|
if
|
||||||
|
attached {WSF_STRING} req.form_parameter ("op") as p_op and then p_op.same_string ("unset") and then
|
||||||
|
attached {WSF_STRING} req.form_parameter ("path_alias") as p_alias and then
|
||||||
|
attached {WSF_STRING} req.form_parameter ("source") as p_source
|
||||||
|
then
|
||||||
|
api.unset_path_alias (p_source.value.to_string_8, p_alias.value.to_string_8) -- FIXME: avoid `to_string_8`
|
||||||
|
if api.has_error then
|
||||||
|
s.append ("<div class=%"error%">ERROR: Path alias %"" + l_response.html_encoded (p_alias.value) + "%" raised error!</div>")
|
||||||
|
else
|
||||||
|
s.append ("<div class=%"success%">Path alias %"" + l_response.html_encoded (p_alias.value) + "%" is now unset!</div>")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
s.append ("<p><a href=%"%">Back to list of path aliases ...</a><p>")
|
||||||
|
s.append ("(in 3 seconds...)")
|
||||||
|
l_response.set_main_content (s)
|
||||||
|
|
||||||
|
l_response.set_redirection (l_response.location)
|
||||||
|
l_response.set_redirection_delay (3)
|
||||||
|
else
|
||||||
|
create {FORBIDDEN_ERROR_CMS_RESPONSE} l_response.make (req, res, api)
|
||||||
|
l_response.set_redirection (l_response.location)
|
||||||
|
end
|
||||||
|
l_response.execute
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -27,9 +27,10 @@ feature -- Process
|
|||||||
l_admin_links.force (["core", <<"admin roles">>, local_link ("Roles", "admin/roles"), "View/Edit/Add Roles"])
|
l_admin_links.force (["core", <<"admin roles">>, local_link ("Roles", "admin/roles"), "View/Edit/Add Roles"])
|
||||||
l_admin_links.force (["core", <<"admin modules">>, local_link ("Modules", "admin/modules"), "(un)Install modules"])
|
l_admin_links.force (["core", <<"admin modules">>, local_link ("Modules", "admin/modules"), "(un)Install modules"])
|
||||||
l_admin_links.force (["core", <<"view logs">>, local_link ("Logs", "admin/logs"), "View logs"])
|
l_admin_links.force (["core", <<"view logs">>, local_link ("Logs", "admin/logs"), "View logs"])
|
||||||
|
l_admin_links.force (["core", <<"admin path_alias">>, local_link ("Path Alias", "admin/path_alias"), "Manage path aliases"])
|
||||||
l_admin_links.force (["support", <<"admin cache">>, local_link ("Cache", "admin/cache"), "Clear caches"])
|
l_admin_links.force (["support", <<"admin cache">>, local_link ("Cache", "admin/cache"), "Clear caches"])
|
||||||
l_admin_links.force (["support", <<"admin export">>, local_link ("Export", "admin/export"), "Export CMS contents, and modules contents."])
|
l_admin_links.force (["support", <<"admin export">>, local_link ("Export", "admin/export"), "Export CMS contents, and modules contents."])
|
||||||
l_admin_links.force (["support", <<"admin import">>, local_link ("Export", "admin/import"), "Import CMS contents, and modules contents."])
|
l_admin_links.force (["support", <<"admin import">>, local_link ("Import", "admin/import"), "Import CMS contents, and modules contents."])
|
||||||
create categories.make_caseless (3)
|
create categories.make_caseless (3)
|
||||||
across
|
across
|
||||||
l_admin_links as ic
|
l_admin_links as ic
|
||||||
|
|||||||
@@ -151,6 +151,10 @@ feature -- Forms ...
|
|||||||
end
|
end
|
||||||
end(?, response, a_node)
|
end(?, response, a_node)
|
||||||
)
|
)
|
||||||
|
if not cms_api.has_permission ("edit path_alias") then
|
||||||
|
-- FIXME: should we have an input field or just a raw text?
|
||||||
|
ti.set_is_readonly (True)
|
||||||
|
end
|
||||||
if
|
if
|
||||||
attached f.fields_by_name ("title") as l_title_fields and then
|
attached f.fields_by_name ("title") as l_title_fields and then
|
||||||
attached l_title_fields.first as l_title_field
|
attached l_title_fields.first as l_title_field
|
||||||
|
|||||||
@@ -253,7 +253,8 @@ feature -- Form
|
|||||||
l_preview: BOOLEAN
|
l_preview: BOOLEAN
|
||||||
l_node: detachable CMS_NODE
|
l_node: detachable CMS_NODE
|
||||||
s: STRING
|
s: STRING
|
||||||
l_path_alias: detachable READABLE_STRING_8
|
l_node_path: READABLE_STRING_8
|
||||||
|
l_path_alias, l_existing_path_alias: detachable READABLE_STRING_8
|
||||||
do
|
do
|
||||||
fixme ("Refactor code per operacion: Preview, Save")
|
fixme ("Refactor code per operacion: Preview, Save")
|
||||||
l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
|
||||||
@@ -301,14 +302,34 @@ feature -- Form
|
|||||||
add_success_message ("Node #" + l_node.id.out + " saved.")
|
add_success_message ("Node #" + l_node.id.out + " saved.")
|
||||||
end
|
end
|
||||||
|
|
||||||
if
|
if attached fd.string_item ("path_alias") as f_path_alias then
|
||||||
attached fd.string_item ("path_alias") as f_path_alias and then
|
l_node_path := node_api.node_path (l_node)
|
||||||
not f_path_alias.is_empty
|
|
||||||
then
|
|
||||||
l_path_alias := percent_encoder.partial_encoded_string (f_path_alias, <<'/'>>)
|
l_path_alias := percent_encoder.partial_encoded_string (f_path_alias, <<'/'>>)
|
||||||
-- Path alias, are always from the root of the cms.
|
l_existing_path_alias := api.location_alias (l_node_path)
|
||||||
api.set_path_alias (node_api.node_path (l_node), l_path_alias, False)
|
if
|
||||||
l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_path_alias))
|
l_existing_path_alias /= Void and then
|
||||||
|
l_path_alias.same_string (l_existing_path_alias)
|
||||||
|
then
|
||||||
|
-- Same path alias
|
||||||
|
l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_path_alias))
|
||||||
|
elseif l_existing_path_alias /= Void and then l_path_alias.is_whitespace then
|
||||||
|
-- Reset to builtin alias.
|
||||||
|
if api.has_permission ("edit path_alias") then
|
||||||
|
api.set_path_alias (l_node_path, l_node_path, True)
|
||||||
|
else
|
||||||
|
add_error_message ("Permission denied to reset path alias on node #" + l_node.id.out + "!")
|
||||||
|
end
|
||||||
|
l_node.set_link (node_api.node_link (l_node))
|
||||||
|
else
|
||||||
|
if api.has_permission ("edit path_alias") then
|
||||||
|
-- Path alias, are always from the root of the cms.
|
||||||
|
api.set_path_alias (l_node_path, l_path_alias, True)
|
||||||
|
l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_path_alias))
|
||||||
|
else
|
||||||
|
add_error_message ("Permission denied to set path alias on node #" + l_node.id.out + "!")
|
||||||
|
l_node.set_link (node_api.node_link (l_node))
|
||||||
|
end
|
||||||
|
end
|
||||||
else
|
else
|
||||||
l_node.set_link (node_api.node_link (l_node))
|
l_node.set_link (node_api.node_link (l_node))
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ inherit
|
|||||||
CMS_MODULE
|
CMS_MODULE
|
||||||
redefine
|
redefine
|
||||||
initialize,
|
initialize,
|
||||||
install
|
install,
|
||||||
|
permissions
|
||||||
end
|
end
|
||||||
|
|
||||||
create
|
create
|
||||||
@@ -102,6 +103,20 @@ feature -- Router
|
|||||||
do
|
do
|
||||||
end
|
end
|
||||||
|
|
||||||
|
feature -- Security
|
||||||
|
|
||||||
|
permissions: LIST [READABLE_STRING_8]
|
||||||
|
-- List of permission ids, used by this module, and declared.
|
||||||
|
do
|
||||||
|
Result := Precursor
|
||||||
|
Result.force ("install modules")
|
||||||
|
Result.force ("view logs")
|
||||||
|
Result.force ("export core")
|
||||||
|
Result.force ("import core")
|
||||||
|
Result.force ("admin path_alias")
|
||||||
|
Result.force ("edit path_alias")
|
||||||
|
end
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ feature -- URL aliases
|
|||||||
sql_finalize
|
sql_finalize
|
||||||
end
|
end
|
||||||
|
|
||||||
sql_select_all_path_alias: STRING = "SELECT source, alias, lang FROM path_aliases;"
|
sql_select_all_path_alias: STRING = "SELECT source, alias, lang FROM path_aliases ORDER BY pid DESC;"
|
||||||
-- SQL select all path aliases.
|
-- SQL select all path aliases.
|
||||||
|
|
||||||
sql_select_path_alias: STRING = "SELECT source FROM path_aliases WHERE alias=:alias ;"
|
sql_select_path_alias: STRING = "SELECT source FROM path_aliases WHERE alias=:alias ;"
|
||||||
@@ -411,6 +411,6 @@ feature -- Misc
|
|||||||
|
|
||||||
|
|
||||||
note
|
note
|
||||||
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user