From 13d0927c588cadbed6f415d01bd315e82481c5da Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Tue, 28 Feb 2017 17:35:18 +0100 Subject: [PATCH] Added default path alias for node. Fixed set path alias, when alias already exists in the history. --- modules/node/cms_node_api.e | 79 +++++++++++++++++++ .../handler/cms_node_type_webform_manager.e | 21 ++++- modules/node/handler/node_form_response.e | 20 ++++- modules/node/node-safe.ecf | 1 + modules/node/node.ecf | 1 + src/persistence/core/cms_core_storage_sql_i.e | 23 +++++- 6 files changed, 133 insertions(+), 12 deletions(-) diff --git a/modules/node/cms_node_api.e b/modules/node/cms_node_api.e index 54c4834..8e580fc 100644 --- a/modules/node/cms_node_api.e +++ b/modules/node/cms_node_api.e @@ -367,6 +367,85 @@ feature -- Change: Node error_handler.append (node_storage.error_handler) end +feature -- path_alias suggestion + + path_alias_uri_suggestion (a_node: detachable CMS_NODE; a_content_type: CMS_CONTENT_TYPE): STRING + local + dt: DATE_TIME + uri: URI + do + create uri.make_from_string ("/") + uri.add_unencoded_path_segment (a_content_type.name) + if a_node /= Void then + dt := a_node.creation_date + else + create dt.make_now_utc + end + if attached cms_api.user as u and then not cms_api.user_api.is_admin_user (u) then + uri.add_unencoded_path_segment (cms_api.user_api.user_display_name (u)) + end + uri.add_unencoded_path_segment (dt.year.out) + if dt.month <= 9 then + uri.add_unencoded_path_segment ("0" + dt.month.out) + else + uri.add_unencoded_path_segment (dt.month.out) + end + if a_node /= Void and then attached a_node.title as l_title then + uri.add_unencoded_path_segment (safe_path_alias_uri_segment_text (l_title)) + else + uri.add_unencoded_path_segment ("") + end + + Result := uri.string + end + + safe_path_alias_uri_segment_text (s: READABLE_STRING_GENERAL): STRING_32 + local + i,n: INTEGER + c, prev: CHARACTER_32 + l_words: ITERABLE [READABLE_STRING_GENERAL] + w: STRING_32 + do + l_words := << "a", "an", "as", "at", "before", "but", "by", "for", "from", "is", "in", "into", "like", "of", "off", "on", "onto", "per", "since", "than", "the", "this", "that", "to", "up", "via", "with" >> + from + i := 1 + n := s.count + create Result.make (n) + create w.make_empty + until + i > n + loop + c := s[i].as_lower + if c.is_alpha_numeric then + w.append_character (c) + prev := c + else + if w.is_empty then + -- Ignore + else + if across l_words as ic some w.same_string_general (ic.item) end then + -- Ignore + w.wipe_out + else + if not Result.is_empty then + Result.append_character ('-') + end + Result.append (w) + w.wipe_out + end + end + end + i := i + 1 + end + if not w.is_empty then + if not Result.is_empty then + Result.append_character ('-') + end + Result.append (w) + w.wipe_out + end + end + feature -- Node status Not_published: INTEGER = 0 diff --git a/modules/node/handler/cms_node_type_webform_manager.e b/modules/node/handler/cms_node_type_webform_manager.e index fa2d80a..2ff79f4 100644 --- a/modules/node/handler/cms_node_type_webform_manager.e +++ b/modules/node/handler/cms_node_type_webform_manager.e @@ -107,10 +107,14 @@ feature -- Forms ... populate_form_with_path_alias (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable CMS_NODE) local ti: WSF_FORM_TEXT_INPUT + thi: WSF_FORM_HIDDEN_INPUT l_uri: detachable READABLE_STRING_8 l_iri: detachable READABLE_STRING_32 + l_auto_path_alias: READABLE_STRING_8 do -- Path alias + l_auto_path_alias := node_api.path_alias_uri_suggestion (a_node, content_type) + create ti.make ("path_alias") ti.set_label ("Path") ti.set_pattern ("^([A-Za-z0-9-_+ ]).+") @@ -119,13 +123,19 @@ feature -- Forms ... if a_node /= Void and then a_node.has_id then if attached a_node.link as lnk then l_uri := lnk.location + if l_uri.same_string (node_api.node_path (a_node)) then + l_uri := "" + end else l_iri := percent_encoder.percent_decoded_string (response.api.location_alias (response.node_api.node_path (a_node))) l_uri := l_iri.to_string_8 end - ti.set_text_value (l_uri) - ti.set_description ("Optionally specify an alternative URL path by which this content can be accessed. For example, type 'about' when writing an about page. Use a relative path or the URL alias won't work.") + ti.set_description ("Optionally specify an alternative URL path by which this content can be accessed.
%NFor example, type 'about' when writing an about page. Use a relative path or the URL alias won't work.") + else + l_uri := "" end + ti.set_text_value (l_uri) + ti.set_placeholder (l_auto_path_alias) ti.set_validation_action (agent (fd: WSF_FORM_DATA; ia_response: NODE_RESPONSE; ia_node: detachable CMS_NODE) do if @@ -163,6 +173,11 @@ feature -- Forms ... else f.extend (ti) end + -- Auto path alias / suggestion + create thi.make ("auto_path_alias") + thi.set_text_value (l_auto_path_alias) + thi.set_is_readonly (True) + f.insert_after (thi, ti) end update_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: CMS_NODE) @@ -443,6 +458,4 @@ feature -- Output end a_output.append ("") end - end - diff --git a/modules/node/handler/node_form_response.e b/modules/node/handler/node_form_response.e index d6e3e1a..804fef6 100644 --- a/modules/node/handler/node_form_response.e +++ b/modules/node/handler/node_form_response.e @@ -253,7 +253,7 @@ feature -- Form l_node: detachable CMS_NODE s: STRING l_node_path: READABLE_STRING_8 - l_path_alias, l_existing_path_alias: detachable READABLE_STRING_8 + l_path_alias, l_existing_path_alias, l_auto_path_alias: detachable READABLE_STRING_8 do 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") @@ -301,10 +301,13 @@ feature -- Form add_success_message ("Node #" + l_node.id.out + " saved.") end + -- Path aliase + l_node_path := node_api.node_path (l_node) + l_existing_path_alias := api.location_alias (l_node_path) + + l_auto_path_alias := node_api.path_alias_uri_suggestion (l_node, a_type) if attached fd.string_item ("path_alias") as f_path_alias then - l_node_path := node_api.node_path (l_node) l_path_alias := percent_encoder.partial_encoded_string (f_path_alias, <<'/'>>) - l_existing_path_alias := api.location_alias (l_node_path) if l_existing_path_alias /= Void and then l_path_alias.same_string (l_existing_path_alias) @@ -314,7 +317,10 @@ feature -- Form 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) + api.set_path_alias (l_node_path, l_auto_path_alias, True) + elseif l_existing_path_alias.same_string (l_node_path) then + -- not aliased! Use default. + api.set_path_alias (l_node_path, l_auto_path_alias, True) else add_error_message ("Permission denied to reset path alias on node #" + l_node.id.out + "!") end @@ -329,6 +335,12 @@ feature -- Form l_node.set_link (node_api.node_link (l_node)) end end + elseif l_existing_path_alias /= Void then + l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_existing_path_alias)) + elseif l_auto_path_alias /= Void then + -- Use auto path alias + api.set_path_alias (l_node_path, l_auto_path_alias, True) + l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_auto_path_alias)) else l_node.set_link (node_api.node_link (l_node)) end diff --git a/modules/node/node-safe.ecf b/modules/node/node-safe.ecf index b0322d5..713054f 100644 --- a/modules/node/node-safe.ecf +++ b/modules/node/node-safe.ecf @@ -23,6 +23,7 @@ + diff --git a/modules/node/node.ecf b/modules/node/node.ecf index 8593493..aa2908d 100644 --- a/modules/node/node.ecf +++ b/modules/node/node.ecf @@ -22,6 +22,7 @@ + diff --git a/src/persistence/core/cms_core_storage_sql_i.e b/src/persistence/core/cms_core_storage_sql_i.e index 1329cd3..6e5a877 100644 --- a/src/persistence/core/cms_core_storage_sql_i.e +++ b/src/persistence/core/cms_core_storage_sql_i.e @@ -24,19 +24,34 @@ feature -- URL aliases -- local l_parameters: STRING_TABLE [detachable ANY] + l_source: like source_of_path_alias + l_continue: BOOLEAN do error_handler.reset create l_parameters.make (2) l_parameters.put (a_source, "source") l_parameters.put (a_alias, "alias") - if attached source_of_path_alias (a_alias) as l_path then - if a_source.same_string (l_path) then - -- already up to date + l_source := source_of_path_alias (a_alias) + l_continue := True + if + l_source /= Void -- Alias exists! + then + if a_source.same_string (l_source) then + if attached path_alias (l_source) as l_alias and then l_alias.same_string (a_alias) then + -- already up to date + l_continue := False + else + -- multiple alias and a_alias is not the default alias + -- then unset, and set again ! + unset_path_alias (a_source, a_alias) + end else + l_continue := False error_handler.add_custom_error (0, "alias exists", "Path alias %"" + a_alias + "%" already exists!") end - else + end + if l_continue then sql_insert (sql_insert_path_alias, l_parameters) sql_finalize end