Moved taxonomy integration for web form inside CMS_TAXONOMY_API.
Moved a few helpers routine from CMS_RESPONSE to CMS_API. Added CMS_CONTENT.identifier: detachable READABLE_STRING_32 .
This commit is contained in:
@@ -9,10 +9,10 @@ class
|
|||||||
inherit
|
inherit
|
||||||
CMS_MODULE
|
CMS_MODULE
|
||||||
redefine
|
redefine
|
||||||
setup_hooks
|
setup_hooks,
|
||||||
|
permissions
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
CMS_HOOK_AUTO_REGISTER
|
CMS_HOOK_AUTO_REGISTER
|
||||||
|
|
||||||
CMS_HOOK_VALUE_TABLE_ALTER
|
CMS_HOOK_VALUE_TABLE_ALTER
|
||||||
@@ -52,6 +52,13 @@ feature -- Access
|
|||||||
|
|
||||||
name: STRING = "auth"
|
name: STRING = "auth"
|
||||||
|
|
||||||
|
permissions: LIST [READABLE_STRING_8]
|
||||||
|
-- List of permission ids, used by this module, and declared.
|
||||||
|
do
|
||||||
|
Result := Precursor
|
||||||
|
Result.force ("account register")
|
||||||
|
end
|
||||||
|
|
||||||
feature -- Access: docs
|
feature -- Access: docs
|
||||||
|
|
||||||
root_dir: PATH
|
root_dir: PATH
|
||||||
@@ -228,6 +235,7 @@ feature -- Handler
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
create {FORBIDDEN_ERROR_CMS_RESPONSE} r.make (req, res, api)
|
create {FORBIDDEN_ERROR_CMS_RESPONSE} r.make (req, res, api)
|
||||||
|
r.set_main_content ("You can also contact the webmaster to ask for an account.")
|
||||||
end
|
end
|
||||||
|
|
||||||
r.execute
|
r.execute
|
||||||
|
|||||||
@@ -11,8 +11,10 @@ deferred class
|
|||||||
|
|
||||||
inherit
|
inherit
|
||||||
CMS_CONTENT
|
CMS_CONTENT
|
||||||
|
rename
|
||||||
|
has_identifier as has_id
|
||||||
redefine
|
redefine
|
||||||
debug_output
|
debug_output, has_id
|
||||||
end
|
end
|
||||||
|
|
||||||
REFACTORING_HELPER
|
REFACTORING_HELPER
|
||||||
@@ -63,6 +65,12 @@ feature -- Conversion
|
|||||||
|
|
||||||
feature -- Access
|
feature -- Access
|
||||||
|
|
||||||
|
identifier: detachable IMMUTABLE_STRING_32
|
||||||
|
-- Optional identifier.
|
||||||
|
do
|
||||||
|
create Result.make_from_string_general (id.out)
|
||||||
|
end
|
||||||
|
|
||||||
id: INTEGER_64 assign set_id
|
id: INTEGER_64 assign set_id
|
||||||
-- Unique id.
|
-- Unique id.
|
||||||
--| Should we use NATURAL_64 instead?
|
--| Should we use NATURAL_64 instead?
|
||||||
|
|||||||
@@ -92,246 +92,15 @@ feature -- Forms ...
|
|||||||
|
|
||||||
f.extend (fset)
|
f.extend (fset)
|
||||||
|
|
||||||
-- Path alias
|
-- Path alias
|
||||||
populate_form_with_taxonomy (response, f, a_node)
|
populate_form_with_taxonomy (response, f, a_node)
|
||||||
populate_form_with_path_alias (response, f, a_node)
|
populate_form_with_path_alias (response, f, a_node)
|
||||||
end
|
end
|
||||||
|
|
||||||
populate_form_with_taxonomy (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable CMS_NODE)
|
populate_form_with_taxonomy (response: CMS_RESPONSE; f: CMS_FORM; a_content: detachable CMS_CONTENT)
|
||||||
local
|
|
||||||
ti: detachable WSF_FORM_TEXT_INPUT
|
|
||||||
th: WSF_FORM_HIDDEN_INPUT
|
|
||||||
w_set: WSF_FORM_FIELD_SET
|
|
||||||
w_select: WSF_FORM_SELECT
|
|
||||||
w_opt: WSF_FORM_SELECT_OPTION
|
|
||||||
w_cb: WSF_FORM_CHECKBOX_INPUT
|
|
||||||
w_voc_set: WSF_FORM_FIELD_SET
|
|
||||||
s: STRING_32
|
|
||||||
voc: CMS_VOCABULARY
|
|
||||||
t: detachable CMS_TERM
|
|
||||||
l_terms: detachable CMS_TERM_COLLECTION
|
|
||||||
l_has_edit_permission: BOOLEAN
|
|
||||||
do
|
do
|
||||||
if
|
if attached {CMS_TAXONOMY_API} response.api.module_api ({CMS_TAXONOMY_MODULE}) as l_taxonomy_api then
|
||||||
attached {CMS_TAXONOMY_API} response.api.module_api ({CMS_TAXONOMY_MODULE}) as l_taxonomy_api and then
|
l_taxonomy_api.populate_edit_form (response, f, content_type.name, a_content)
|
||||||
attached l_taxonomy_api.vocabularies_for_type (content_type.name) as l_vocs and then not l_vocs.is_empty
|
|
||||||
then
|
|
||||||
|
|
||||||
l_has_edit_permission := response.has_permissions (<<"update any taxonomy", "update " + content_type.name + " taxonomy">>)
|
|
||||||
|
|
||||||
-- Handle Taxonomy fields, if any associated with `content_type'.
|
|
||||||
create w_set.make
|
|
||||||
w_set.add_css_class ("taxonomy")
|
|
||||||
l_vocs.sort
|
|
||||||
across
|
|
||||||
l_vocs as vocs_ic
|
|
||||||
loop
|
|
||||||
voc := vocs_ic.item
|
|
||||||
create th.make_with_text ({STRING_32} "taxonomy_vocabularies[" + voc.id.out + "]", voc.name)
|
|
||||||
w_set.extend (th)
|
|
||||||
|
|
||||||
l_terms := Void
|
|
||||||
if a_node /= Void and then a_node.has_id then
|
|
||||||
l_terms := l_taxonomy_api.terms_of_entity (a_node.content_type, a_node.id.out, voc)
|
|
||||||
if l_terms /= Void then
|
|
||||||
l_terms.sort
|
|
||||||
end
|
|
||||||
end
|
|
||||||
create w_voc_set.make
|
|
||||||
w_set.extend (w_voc_set)
|
|
||||||
|
|
||||||
if voc.is_tags then
|
|
||||||
w_voc_set.set_legend (response.translation (voc.name, Void))
|
|
||||||
|
|
||||||
create ti.make ({STRING_32} "taxonomy_" + voc.id.out)
|
|
||||||
w_voc_set.extend (ti)
|
|
||||||
if voc.is_term_required then
|
|
||||||
ti.enable_required
|
|
||||||
end
|
|
||||||
if attached voc.description as l_desc then
|
|
||||||
ti.set_description (response.html_encoded (response.translation (l_desc, Void)))
|
|
||||||
else
|
|
||||||
ti.set_description (response.html_encoded (response.translation (voc.name, Void)))
|
|
||||||
end
|
|
||||||
ti.set_size (70)
|
|
||||||
if l_terms /= Void then
|
|
||||||
create s.make_empty
|
|
||||||
across
|
|
||||||
l_terms as ic
|
|
||||||
loop
|
|
||||||
t := ic.item
|
|
||||||
if not s.is_empty then
|
|
||||||
s.append_character (',')
|
|
||||||
s.append_character (' ')
|
|
||||||
end
|
|
||||||
if ic.item.text.has (' ') then
|
|
||||||
s.append_character ('"')
|
|
||||||
s.append (t.text)
|
|
||||||
s.append_character ('"')
|
|
||||||
else
|
|
||||||
s.append (t.text)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
ti.set_text_value (s)
|
|
||||||
end
|
|
||||||
if not l_has_edit_permission then
|
|
||||||
ti.set_is_readonly (True)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
l_taxonomy_api.fill_vocabularies_with_terms (voc)
|
|
||||||
if not voc.terms.is_empty then
|
|
||||||
if voc.multiple_terms_allowed then
|
|
||||||
if attached voc.description as l_desc then
|
|
||||||
w_voc_set.set_legend (response.html_encoded (l_desc))
|
|
||||||
else
|
|
||||||
w_voc_set.set_legend (response.html_encoded (voc.name))
|
|
||||||
end
|
|
||||||
across
|
|
||||||
voc as voc_terms_ic
|
|
||||||
loop
|
|
||||||
t := voc_terms_ic.item
|
|
||||||
create w_cb.make_with_value ({STRING_32} "taxonomy_" + voc.id.out + "[]", t.text)
|
|
||||||
w_cb.set_title (t.text)
|
|
||||||
w_voc_set.extend (w_cb)
|
|
||||||
if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
|
|
||||||
w_cb.set_checked (True)
|
|
||||||
end
|
|
||||||
if not l_has_edit_permission then
|
|
||||||
w_cb.set_is_readonly (True)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
create w_select.make ({STRING_32} "taxonomy_" + voc.id.out)
|
|
||||||
w_voc_set.extend (w_select)
|
|
||||||
|
|
||||||
if attached voc.description as l_desc then
|
|
||||||
w_select.set_description (response.html_encoded (l_desc))
|
|
||||||
else
|
|
||||||
w_select.set_description (response.html_encoded (voc.name))
|
|
||||||
end
|
|
||||||
w_voc_set.set_legend (response.html_encoded (voc.name))
|
|
||||||
|
|
||||||
across
|
|
||||||
voc as voc_terms_ic
|
|
||||||
loop
|
|
||||||
t := voc_terms_ic.item
|
|
||||||
create w_opt.make (response.html_encoded (t.text), response.html_encoded (t.text))
|
|
||||||
w_select.add_option (w_opt)
|
|
||||||
|
|
||||||
if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
|
|
||||||
w_opt.set_is_selected (True)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not l_has_edit_permission then
|
|
||||||
w_select.set_is_readonly (True)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
f.submit_actions.extend (agent taxonomy_submit_action (response, l_taxonomy_api, l_vocs, a_node, ?))
|
|
||||||
|
|
||||||
if
|
|
||||||
attached f.fields_by_name ("title") as l_title_fields and then
|
|
||||||
attached l_title_fields.first as l_title_field
|
|
||||||
then
|
|
||||||
f.insert_after (w_set, l_title_field)
|
|
||||||
else
|
|
||||||
f.extend (w_set)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
taxonomy_submit_action (a_response: CMS_RESPONSE; a_taxonomy_api: CMS_TAXONOMY_API; a_vocs: CMS_VOCABULARY_COLLECTION; a_node: detachable CMS_NODE fd: WSF_FORM_DATA)
|
|
||||||
require
|
|
||||||
vocs_not_empty: not a_vocs.is_empty
|
|
||||||
local
|
|
||||||
l_voc_name: READABLE_STRING_32
|
|
||||||
l_terms_to_remove: ARRAYED_LIST [CMS_TERM]
|
|
||||||
l_new_terms: LIST [READABLE_STRING_32]
|
|
||||||
l_text: READABLE_STRING_GENERAL
|
|
||||||
l_found: BOOLEAN
|
|
||||||
t: detachable CMS_TERM
|
|
||||||
vid: INTEGER_64
|
|
||||||
do
|
|
||||||
if
|
|
||||||
a_node /= Void and then a_node.has_id and then
|
|
||||||
attached fd.table_item ("taxonomy_vocabularies") as fd_vocs
|
|
||||||
then
|
|
||||||
if a_response.has_permissions (<<{STRING_32} "update any taxonomy", {STRING_32} "update " + content_type.name + " taxonomy">>) then
|
|
||||||
across
|
|
||||||
fd_vocs.values as ic
|
|
||||||
loop
|
|
||||||
vid := ic.key.to_integer_64
|
|
||||||
l_voc_name := ic.item.string_representation
|
|
||||||
|
|
||||||
if attached a_vocs.item_by_id (vid) as voc then
|
|
||||||
if attached fd.string_item ("taxonomy_" + vid.out) as l_string then
|
|
||||||
l_new_terms := a_taxonomy_api.splitted_string (l_string, ',')
|
|
||||||
elseif attached fd.table_item ("taxonomy_" + vid.out) as fd_terms then
|
|
||||||
create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (fd_terms.count)
|
|
||||||
across
|
|
||||||
fd_terms as t_ic
|
|
||||||
loop
|
|
||||||
l_new_terms.force (t_ic.item.string_representation)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (0)
|
|
||||||
end
|
|
||||||
|
|
||||||
create l_terms_to_remove.make (0)
|
|
||||||
if attached a_taxonomy_api.terms_of_entity (content_type.name, a_node.id.out, voc) as l_existing_terms then
|
|
||||||
across
|
|
||||||
l_existing_terms as t_ic
|
|
||||||
loop
|
|
||||||
l_text := t_ic.item.text
|
|
||||||
from
|
|
||||||
l_found := False
|
|
||||||
l_new_terms.start
|
|
||||||
until
|
|
||||||
l_new_terms.after
|
|
||||||
loop
|
|
||||||
if l_new_terms.item.same_string_general (l_text) then
|
|
||||||
-- Already associated with term `t_ic.text'.
|
|
||||||
l_found := True
|
|
||||||
l_new_terms.remove
|
|
||||||
else
|
|
||||||
l_new_terms.forth
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if not l_found then
|
|
||||||
-- Remove term
|
|
||||||
l_terms_to_remove.force (t_ic.item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
across
|
|
||||||
l_terms_to_remove as t_ic
|
|
||||||
loop
|
|
||||||
a_taxonomy_api.unassociate_term_from_entity (t_ic.item, content_type.name, a_node.id.out)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
across
|
|
||||||
l_new_terms as t_ic
|
|
||||||
loop
|
|
||||||
t := a_taxonomy_api.term_by_text (t_ic.item, voc)
|
|
||||||
if
|
|
||||||
t = Void and voc.is_tags
|
|
||||||
then
|
|
||||||
-- Create new term!
|
|
||||||
create t.make (t_ic.item)
|
|
||||||
a_taxonomy_api.save_term (t, voc)
|
|
||||||
if a_taxonomy_api.has_error then
|
|
||||||
t := Void
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if t /= Void then
|
|
||||||
a_taxonomy_api.associate_term_with_entity (t, content_type.name, a_node.id.out)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -573,7 +342,7 @@ feature -- Output
|
|||||||
vocs as ic
|
vocs as ic
|
||||||
loop
|
loop
|
||||||
if
|
if
|
||||||
attached l_taxonomy_api.terms_of_entity (content_type.name, a_node.id.out, ic.item) as l_terms and then
|
attached l_taxonomy_api.terms_of_content (a_node, ic.item) as l_terms and then
|
||||||
not l_terms.is_empty
|
not l_terms.is_empty
|
||||||
then
|
then
|
||||||
a_output.append ("<ul class=%"taxonomy term-" + ic.item.id.out + "%">")
|
a_output.append ("<ul class=%"taxonomy term-" + ic.item.id.out + "%">")
|
||||||
|
|||||||
@@ -109,6 +109,17 @@ feature -- Access node
|
|||||||
Result := taxonomy_storage.term_count_from_vocabulary (a_vocab)
|
Result := taxonomy_storage.term_count_from_vocabulary (a_vocab)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
terms_of_content (a_content: CMS_CONTENT; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM_COLLECTION
|
||||||
|
-- Terms related to `a_content', and if `a_vocabulary' is set
|
||||||
|
-- constrain to be part of `a_vocabulary'.
|
||||||
|
require
|
||||||
|
content_with_identifier: a_content.has_identifier
|
||||||
|
do
|
||||||
|
if attached a_content.identifier as l_id then
|
||||||
|
Result := terms_of_entity (a_content.content_type, l_id, a_vocabulary)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
terms_of_entity (a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM_COLLECTION
|
terms_of_entity (a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL; a_vocabulary: detachable CMS_VOCABULARY): detachable CMS_TERM_COLLECTION
|
||||||
-- Terms related to `(a_type_name,a_entity)', and if `a_vocabulary' is set
|
-- Terms related to `(a_type_name,a_entity)', and if `a_vocabulary' is set
|
||||||
-- constrain to be part of `a_vocabulary'.
|
-- constrain to be part of `a_vocabulary'.
|
||||||
@@ -179,6 +190,30 @@ feature -- Write
|
|||||||
error_handler.append (taxonomy_storage.error_handler)
|
error_handler.append (taxonomy_storage.error_handler)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
associate_term_with_content (a_term: CMS_TERM; a_content: CMS_CONTENT)
|
||||||
|
-- Associate term `a_term' with `a_content'.
|
||||||
|
require
|
||||||
|
content_with_identifier: a_content.has_identifier
|
||||||
|
do
|
||||||
|
reset_error
|
||||||
|
if attached a_content.identifier as l_id then
|
||||||
|
taxonomy_storage.associate_term_with_entity (a_term, a_content.content_type, l_id)
|
||||||
|
error_handler.append (taxonomy_storage.error_handler)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
unassociate_term_from_content (a_term: CMS_TERM; a_content: CMS_CONTENT)
|
||||||
|
-- Unassociate term `a_term' from `a_content'.
|
||||||
|
require
|
||||||
|
content_with_identifier: a_content.has_identifier
|
||||||
|
do
|
||||||
|
reset_error
|
||||||
|
if attached a_content.identifier as l_id then
|
||||||
|
taxonomy_storage.unassociate_term_from_entity (a_term, a_content.content_type, l_id)
|
||||||
|
error_handler.append (taxonomy_storage.error_handler)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
associate_term_with_entity (a_term: CMS_TERM; a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL)
|
associate_term_with_entity (a_term: CMS_TERM; a_type_name: READABLE_STRING_GENERAL; a_entity: READABLE_STRING_GENERAL)
|
||||||
-- Associate term `a_term' with `(a_type_name, a_entity)'.
|
-- Associate term `a_term' with `(a_type_name, a_entity)'.
|
||||||
do
|
do
|
||||||
@@ -215,6 +250,244 @@ feature -- Write
|
|||||||
error_handler.append (taxonomy_storage.error_handler)
|
error_handler.append (taxonomy_storage.error_handler)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
feature -- Web forms
|
||||||
|
|
||||||
|
populate_edit_form (a_response: CMS_RESPONSE; a_form: CMS_FORM; a_content_type_name: READABLE_STRING_8; a_content: detachable CMS_CONTENT)
|
||||||
|
local
|
||||||
|
ti: detachable WSF_FORM_TEXT_INPUT
|
||||||
|
th: WSF_FORM_HIDDEN_INPUT
|
||||||
|
w_set: WSF_FORM_FIELD_SET
|
||||||
|
w_select: WSF_FORM_SELECT
|
||||||
|
w_opt: WSF_FORM_SELECT_OPTION
|
||||||
|
w_cb: WSF_FORM_CHECKBOX_INPUT
|
||||||
|
w_voc_set: WSF_FORM_FIELD_SET
|
||||||
|
s: STRING_32
|
||||||
|
voc: CMS_VOCABULARY
|
||||||
|
t: detachable CMS_TERM
|
||||||
|
l_terms: detachable CMS_TERM_COLLECTION
|
||||||
|
l_has_edit_permission: BOOLEAN
|
||||||
|
do
|
||||||
|
if
|
||||||
|
attached vocabularies_for_type (a_content_type_name) as l_vocs and then not l_vocs.is_empty
|
||||||
|
then
|
||||||
|
l_has_edit_permission := a_response.has_permissions (<<"update any taxonomy", "update " + a_content_type_name + " taxonomy">>)
|
||||||
|
|
||||||
|
-- Handle Taxonomy fields, if any associated with `content_type'.
|
||||||
|
create w_set.make
|
||||||
|
w_set.add_css_class ("taxonomy")
|
||||||
|
l_vocs.sort
|
||||||
|
across
|
||||||
|
l_vocs as vocs_ic
|
||||||
|
loop
|
||||||
|
voc := vocs_ic.item
|
||||||
|
create th.make_with_text ({STRING_32} "taxonomy_vocabularies[" + voc.id.out + "]", voc.name)
|
||||||
|
w_set.extend (th)
|
||||||
|
|
||||||
|
l_terms := Void
|
||||||
|
if a_content /= Void then
|
||||||
|
l_terms := terms_of_content (a_content, voc)
|
||||||
|
if l_terms /= Void then
|
||||||
|
l_terms.sort
|
||||||
|
end
|
||||||
|
end
|
||||||
|
create w_voc_set.make
|
||||||
|
w_set.extend (w_voc_set)
|
||||||
|
|
||||||
|
if voc.is_tags then
|
||||||
|
w_voc_set.set_legend (cms_api.translation (voc.name, Void))
|
||||||
|
|
||||||
|
create ti.make ({STRING_32} "taxonomy_" + voc.id.out)
|
||||||
|
w_voc_set.extend (ti)
|
||||||
|
if voc.is_term_required then
|
||||||
|
ti.enable_required
|
||||||
|
end
|
||||||
|
if attached voc.description as l_desc then
|
||||||
|
ti.set_description (cms_api.html_encoded (cms_api.translation (l_desc, Void)))
|
||||||
|
else
|
||||||
|
ti.set_description (a_response.html_encoded (cms_api.translation (voc.name, Void)))
|
||||||
|
end
|
||||||
|
ti.set_size (70)
|
||||||
|
if l_terms /= Void then
|
||||||
|
create s.make_empty
|
||||||
|
across
|
||||||
|
l_terms as ic
|
||||||
|
loop
|
||||||
|
t := ic.item
|
||||||
|
if not s.is_empty then
|
||||||
|
s.append_character (',')
|
||||||
|
s.append_character (' ')
|
||||||
|
end
|
||||||
|
if ic.item.text.has (' ') then
|
||||||
|
s.append_character ('"')
|
||||||
|
s.append (t.text)
|
||||||
|
s.append_character ('"')
|
||||||
|
else
|
||||||
|
s.append (t.text)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
ti.set_text_value (s)
|
||||||
|
end
|
||||||
|
if not l_has_edit_permission then
|
||||||
|
ti.set_is_readonly (True)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
fill_vocabularies_with_terms (voc)
|
||||||
|
if not voc.terms.is_empty then
|
||||||
|
if voc.multiple_terms_allowed then
|
||||||
|
if attached voc.description as l_desc then
|
||||||
|
w_voc_set.set_legend (cms_api.html_encoded (l_desc))
|
||||||
|
else
|
||||||
|
w_voc_set.set_legend (cms_api.html_encoded (voc.name))
|
||||||
|
end
|
||||||
|
across
|
||||||
|
voc as voc_terms_ic
|
||||||
|
loop
|
||||||
|
t := voc_terms_ic.item
|
||||||
|
create w_cb.make_with_value ({STRING_32} "taxonomy_" + voc.id.out + "[]", t.text)
|
||||||
|
w_cb.set_title (t.text)
|
||||||
|
w_voc_set.extend (w_cb)
|
||||||
|
if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
|
||||||
|
w_cb.set_checked (True)
|
||||||
|
end
|
||||||
|
if not l_has_edit_permission then
|
||||||
|
w_cb.set_is_readonly (True)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
create w_select.make ({STRING_32} "taxonomy_" + voc.id.out)
|
||||||
|
w_voc_set.extend (w_select)
|
||||||
|
|
||||||
|
if attached voc.description as l_desc then
|
||||||
|
w_select.set_description (cms_api.html_encoded (l_desc))
|
||||||
|
else
|
||||||
|
w_select.set_description (cms_api.html_encoded (voc.name))
|
||||||
|
end
|
||||||
|
w_voc_set.set_legend (cms_api.html_encoded (voc.name))
|
||||||
|
|
||||||
|
across
|
||||||
|
voc as voc_terms_ic
|
||||||
|
loop
|
||||||
|
t := voc_terms_ic.item
|
||||||
|
create w_opt.make (cms_api.html_encoded (t.text), cms_api.html_encoded (t.text))
|
||||||
|
w_select.add_option (w_opt)
|
||||||
|
|
||||||
|
if l_terms /= Void and then across l_terms as ic some ic.item.text.same_string (t.text) end then
|
||||||
|
w_opt.set_is_selected (True)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not l_has_edit_permission then
|
||||||
|
w_select.set_is_readonly (True)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
a_form.submit_actions.extend (agent taxonomy_submit_action (a_response, Current, l_vocs, a_content, ?))
|
||||||
|
|
||||||
|
if
|
||||||
|
attached a_form.fields_by_name ("title") as l_title_fields and then
|
||||||
|
attached l_title_fields.first as l_title_field
|
||||||
|
then
|
||||||
|
a_form.insert_after (w_set, l_title_field)
|
||||||
|
else
|
||||||
|
a_form.extend (w_set)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
taxonomy_submit_action (a_response: CMS_RESPONSE; a_taxonomy_api: CMS_TAXONOMY_API; a_vocs: CMS_VOCABULARY_COLLECTION; a_content: detachable CMS_CONTENT fd: WSF_FORM_DATA)
|
||||||
|
require
|
||||||
|
vocs_not_empty: not a_vocs.is_empty
|
||||||
|
local
|
||||||
|
l_voc_name: READABLE_STRING_32
|
||||||
|
l_terms_to_remove: ARRAYED_LIST [CMS_TERM]
|
||||||
|
l_new_terms: LIST [READABLE_STRING_32]
|
||||||
|
l_text: READABLE_STRING_GENERAL
|
||||||
|
l_found: BOOLEAN
|
||||||
|
t: detachable CMS_TERM
|
||||||
|
vid: INTEGER_64
|
||||||
|
do
|
||||||
|
if
|
||||||
|
a_content /= Void and then a_content.has_identifier and then
|
||||||
|
attached fd.table_item ("taxonomy_vocabularies") as fd_vocs
|
||||||
|
then
|
||||||
|
if a_response.has_permissions (<<{STRING_32} "update any taxonomy", {STRING_32} "update " + a_content.content_type + " taxonomy">>) then
|
||||||
|
across
|
||||||
|
fd_vocs.values as ic
|
||||||
|
loop
|
||||||
|
vid := ic.key.to_integer_64
|
||||||
|
l_voc_name := ic.item.string_representation
|
||||||
|
|
||||||
|
if attached a_vocs.item_by_id (vid) as voc then
|
||||||
|
if attached fd.string_item ("taxonomy_" + vid.out) as l_string then
|
||||||
|
l_new_terms := a_taxonomy_api.splitted_string (l_string, ',')
|
||||||
|
elseif attached fd.table_item ("taxonomy_" + vid.out) as fd_terms then
|
||||||
|
create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (fd_terms.count)
|
||||||
|
across
|
||||||
|
fd_terms as t_ic
|
||||||
|
loop
|
||||||
|
l_new_terms.force (t_ic.item.string_representation)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
create {ARRAYED_LIST [READABLE_STRING_32]} l_new_terms.make (0)
|
||||||
|
end
|
||||||
|
|
||||||
|
create l_terms_to_remove.make (0)
|
||||||
|
if attached a_taxonomy_api.terms_of_content (a_content, voc) as l_existing_terms then
|
||||||
|
across
|
||||||
|
l_existing_terms as t_ic
|
||||||
|
loop
|
||||||
|
l_text := t_ic.item.text
|
||||||
|
from
|
||||||
|
l_found := False
|
||||||
|
l_new_terms.start
|
||||||
|
until
|
||||||
|
l_new_terms.after
|
||||||
|
loop
|
||||||
|
if l_new_terms.item.same_string_general (l_text) then
|
||||||
|
-- Already associated with term `t_ic.text'.
|
||||||
|
l_found := True
|
||||||
|
l_new_terms.remove
|
||||||
|
else
|
||||||
|
l_new_terms.forth
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if not l_found then
|
||||||
|
-- Remove term
|
||||||
|
l_terms_to_remove.force (t_ic.item)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
across
|
||||||
|
l_terms_to_remove as t_ic
|
||||||
|
loop
|
||||||
|
a_taxonomy_api.unassociate_term_from_content (t_ic.item, a_content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
across
|
||||||
|
l_new_terms as t_ic
|
||||||
|
loop
|
||||||
|
t := a_taxonomy_api.term_by_text (t_ic.item, voc)
|
||||||
|
if
|
||||||
|
t = Void and voc.is_tags
|
||||||
|
then
|
||||||
|
-- Create new term!
|
||||||
|
create t.make (t_ic.item)
|
||||||
|
a_taxonomy_api.save_term (t, voc)
|
||||||
|
if a_taxonomy_api.has_error then
|
||||||
|
t := Void
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if t /= Void then
|
||||||
|
a_taxonomy_api.associate_term_with_content (t, a_content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
feature -- Helpers
|
feature -- Helpers
|
||||||
|
|
||||||
splitted_string (s: READABLE_STRING_32; sep: CHARACTER): LIST [READABLE_STRING_32]
|
splitted_string (s: READABLE_STRING_32; sep: CHARACTER): LIST [READABLE_STRING_32]
|
||||||
|
|||||||
@@ -292,6 +292,26 @@ feature -- Logging
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
feature -- Internationalization (i18n)
|
||||||
|
|
||||||
|
translation (a_text: READABLE_STRING_GENERAL; opts: detachable CMS_API_OPTIONS): STRING_32
|
||||||
|
-- Translated text `a_text' according to expected context (lang, ...)
|
||||||
|
-- and adapt according to options eventually set by `opts'.
|
||||||
|
do
|
||||||
|
to_implement ("Implement i18n support [2015-may]")
|
||||||
|
Result := a_text.as_string_32
|
||||||
|
end
|
||||||
|
|
||||||
|
formatted_string (a_text: READABLE_STRING_GENERAL; args: TUPLE): STRING_32
|
||||||
|
-- Format `a_text' using arguments `args'.
|
||||||
|
--| ex: formatted_string ("hello $1, see page $title.", ["bob", "contact"] -> "hello bob, see page contact"
|
||||||
|
local
|
||||||
|
l_formatter: CMS_STRING_FORMATTER
|
||||||
|
do
|
||||||
|
create l_formatter
|
||||||
|
Result := l_formatter.formatted_string (a_text, args)
|
||||||
|
end
|
||||||
|
|
||||||
feature -- Emails
|
feature -- Emails
|
||||||
|
|
||||||
new_email (a_to_address: READABLE_STRING_8; a_subject: READABLE_STRING_8; a_content: READABLE_STRING_8): CMS_EMAIL
|
new_email (a_to_address: READABLE_STRING_8; a_subject: READABLE_STRING_8; a_content: READABLE_STRING_8): CMS_EMAIL
|
||||||
|
|||||||
@@ -13,6 +13,11 @@ inherit
|
|||||||
|
|
||||||
feature -- Access
|
feature -- Access
|
||||||
|
|
||||||
|
identifier: detachable READABLE_STRING_32
|
||||||
|
-- Optional identifier.
|
||||||
|
deferred
|
||||||
|
end
|
||||||
|
|
||||||
title: detachable READABLE_STRING_32
|
title: detachable READABLE_STRING_32
|
||||||
-- Title associated with Current content.
|
-- Title associated with Current content.
|
||||||
deferred
|
deferred
|
||||||
@@ -37,6 +42,14 @@ feature -- Access
|
|||||||
|
|
||||||
feature -- Status report
|
feature -- Status report
|
||||||
|
|
||||||
|
has_identifier: BOOLEAN
|
||||||
|
-- Current content has identifier?
|
||||||
|
do
|
||||||
|
Result := identifier /= Void
|
||||||
|
ensure
|
||||||
|
Result implies identifier /= Void
|
||||||
|
end
|
||||||
|
|
||||||
is_typed_as (a_content_type: READABLE_STRING_GENERAL): BOOLEAN
|
is_typed_as (a_content_type: READABLE_STRING_GENERAL): BOOLEAN
|
||||||
-- Is current node of type `a_content_type' ?
|
-- Is current node of type `a_content_type' ?
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -113,26 +113,6 @@ feature -- Access
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
feature -- Internationalization (i18n)
|
|
||||||
|
|
||||||
translation (a_text: READABLE_STRING_GENERAL; opts: detachable CMS_API_OPTIONS): STRING_32
|
|
||||||
-- Translated text `a_text' according to expected context (lang, ...)
|
|
||||||
-- and adapt according to options eventually set by `opts'.
|
|
||||||
do
|
|
||||||
to_implement ("Implement i18n support [2015-may]")
|
|
||||||
Result := a_text.as_string_32
|
|
||||||
end
|
|
||||||
|
|
||||||
formatted_string (a_text: READABLE_STRING_GENERAL; args: TUPLE): STRING_32
|
|
||||||
-- Format `a_text' using arguments `args'.
|
|
||||||
--| ex: formatted_string ("hello $1, see page $title.", ["bob", "contact"] -> "hello bob, see page contact"
|
|
||||||
local
|
|
||||||
l_formatter: CMS_STRING_FORMATTER
|
|
||||||
do
|
|
||||||
create l_formatter
|
|
||||||
Result := l_formatter.formatted_string (a_text, args)
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- API
|
feature -- API
|
||||||
|
|
||||||
api: CMS_API
|
api: CMS_API
|
||||||
@@ -896,6 +876,22 @@ feature -- Menu: change
|
|||||||
m.extend (lnk)
|
m.extend (lnk)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
feature -- Internationalization (i18n)
|
||||||
|
|
||||||
|
translation (a_text: READABLE_STRING_GENERAL; opts: detachable CMS_API_OPTIONS): STRING_32
|
||||||
|
-- Translated text `a_text' according to expected context (lang, ...)
|
||||||
|
-- and adapt according to options eventually set by `opts'.
|
||||||
|
do
|
||||||
|
Result := api.translation (a_text, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
formatted_string (a_text: READABLE_STRING_GENERAL; args: TUPLE): STRING_32
|
||||||
|
-- Format `a_text' using arguments `args'.
|
||||||
|
--| ex: formatted_string ("hello $1, see page $title.", ["bob", "contact"] -> "hello bob, see page contact"
|
||||||
|
do
|
||||||
|
Result := api.formatted_string (a_text, args)
|
||||||
|
end
|
||||||
|
|
||||||
feature -- Message
|
feature -- Message
|
||||||
|
|
||||||
add_message (a_msg: READABLE_STRING_8; a_category: detachable READABLE_STRING_8)
|
add_message (a_msg: READABLE_STRING_8; a_category: detachable READABLE_STRING_8)
|
||||||
|
|||||||
Reference in New Issue
Block a user