diff --git a/examples/demo/modules/blog/cms_blog.e b/examples/demo/modules/blog/cms_blog.e index a69ea2c..f697a1f 100644 --- a/examples/demo/modules/blog/cms_blog.e +++ b/examples/demo/modules/blog/cms_blog.e @@ -24,7 +24,7 @@ feature {NONE} -- Initialization Precursor end -feature {CMS_CONTENT_TYPE} -- Conversion +feature -- Conversion import_node (a_node: CMS_NODE) -- @@ -39,7 +39,7 @@ feature -- Access content_type: READABLE_STRING_8 once - Result := {CMS_BLOG_CONTENT_TYPE}.name + Result := {CMS_BLOG_NODE_TYPE}.name end feature -- Access: content diff --git a/examples/demo/modules/blog/cms_blog_content_type_webform_manager.e b/examples/demo/modules/blog/cms_blog_content_type_webform_manager.e deleted file mode 100644 index 6e42ae7..0000000 --- a/examples/demo/modules/blog/cms_blog_content_type_webform_manager.e +++ /dev/null @@ -1,75 +0,0 @@ -note - description: "Summary description for {CMS_BLOG_CONTENT_TYPE_WEBFORM_MANAGER}." - date: "$Date$" - revision: "$Revision$" - -class - CMS_BLOG_CONTENT_TYPE_WEBFORM_MANAGER - -inherit - CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER [CMS_BLOG] - redefine - content_type, - fill_edit_form, - change_node, - new_node - end - -create - make - -feature -- Access - - content_type: CMS_BLOG_CONTENT_TYPE - -- Associated content type. - -feature -- form - - fill_edit_form (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable like new_node) - local - ti: WSF_FORM_TEXT_INPUT - fset: WSF_FORM_FIELD_SET - ta: WSF_FORM_TEXTAREA - tselect: WSF_FORM_SELECT - opt: WSF_FORM_SELECT_OPTION - s: STRING_32 - do - Precursor (response, f, a_node) - create ti.make ("tags") - ti.set_label ("Tags") - ti.set_size (70) - if a_node /= Void and then attached a_node.tags as l_tags then - create s.make_empty - across - l_tags as ic - loop - if not s.is_empty then - s.append_character (',') - end - s.append (ic.item) - end - ti.set_text_value (s) - end - ti.set_is_required (False) - f.extend (ti) - end - - change_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: like new_node) - do - Precursor (response, fd, a_node) - if attached fd.string_item ("tags") as l_tags then - a_node.set_tags_from_string (l_tags) - end - end - - new_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: detachable like new_node): like content_type.new_node - -- - do - Result := Precursor (response, fd, a_node) - if attached fd.string_item ("tags") as l_tags then - Result.set_tags_from_string (l_tags) - end - end - - -end diff --git a/examples/demo/modules/blog/cms_blog_module.e b/examples/demo/modules/blog/cms_blog_module.e index 146a8ed..7390683 100644 --- a/examples/demo/modules/blog/cms_blog_module.e +++ b/examples/demo/modules/blog/cms_blog_module.e @@ -35,14 +35,14 @@ feature {CMS_API} -- Module Initialization initialize (api: CMS_API) -- local - ct: CMS_BLOG_CONTENT_TYPE + ct: CMS_BLOG_NODE_TYPE do Precursor (api) if attached {CMS_NODE_API} api.module_api ({NODE_MODULE}) as l_node_api then create ct l_node_api.add_content_type (ct) - l_node_api.add_content_type_webform_manager (create {CMS_BLOG_CONTENT_TYPE_WEBFORM_MANAGER}.make (ct)) + l_node_api.add_content_type_webform_manager (create {CMS_BLOG_NODE_TYPE_WEBFORM_MANAGER}.make (ct)) -- Add support for CMS_BLOG, which requires a storage extension to store the optional "tags" value -- For now, we only have extension based on SQL statement. if attached {CMS_NODE_STORAGE_SQL} l_node_api.node_storage as l_sql_node_storage then diff --git a/examples/demo/modules/blog/cms_blog_content_type.e b/examples/demo/modules/blog/cms_blog_node_type.e similarity index 92% rename from examples/demo/modules/blog/cms_blog_content_type.e rename to examples/demo/modules/blog/cms_blog_node_type.e index e2d44d2..be10148 100644 --- a/examples/demo/modules/blog/cms_blog_content_type.e +++ b/examples/demo/modules/blog/cms_blog_node_type.e @@ -1,13 +1,13 @@ note - description: "Summary description for {CMS_BLOG_CONTENT_TYPE}." + description: "Summary description for {CMS_BLOG_NODE_TYPE}." date: "$Date$" revision: "$Revision$" class - CMS_BLOG_CONTENT_TYPE + CMS_BLOG_NODE_TYPE inherit - CMS_CONTENT_TYPE + CMS_NODE_TYPE redefine default_create end @@ -60,5 +60,4 @@ feature -- Factory end end - end diff --git a/examples/demo/modules/blog/cms_blog_node_type_webform_manager.e b/examples/demo/modules/blog/cms_blog_node_type_webform_manager.e new file mode 100644 index 0000000..d40c25b --- /dev/null +++ b/examples/demo/modules/blog/cms_blog_node_type_webform_manager.e @@ -0,0 +1,109 @@ +note + description: "Summary description for {CMS_BLOG_NODE_TYPE_WEBFORM_MANAGER}." + date: "$Date$" + revision: "$Revision$" + +class + CMS_BLOG_NODE_TYPE_WEBFORM_MANAGER + +inherit + CMS_NODE_TYPE_WEBFORM_MANAGER [CMS_BLOG] + redefine + content_type, + populate_form, + update_node, + new_node, + append_html_output_to + end + +create + make + +feature -- Access + + content_type: CMS_BLOG_NODE_TYPE + -- Associated content type. + +feature -- form + + populate_form (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable CMS_NODE) + local + ti: WSF_FORM_TEXT_INPUT + s: STRING_32 + do + Precursor (response, f, a_node) + create ti.make ("tags") + ti.set_label ("Tags") + ti.set_size (70) + if + a_node /= Void and then + attached {CMS_BLOG} a_node as a_blog and then + attached a_blog.tags as l_tags + then + create s.make_empty + across + l_tags as ic + loop + if not s.is_empty then + s.append_character (',') + end + s.append (ic.item) + end + ti.set_text_value (s) + end + ti.set_is_required (False) + f.extend (ti) + end + + update_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: CMS_NODE) + do + Precursor (response, fd, a_node) + if attached fd.string_item ("tags") as l_tags then + if attached {CMS_BLOG} a_node as l_blog then + l_blog.set_tags_from_string (l_tags) + end + end + end + + new_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: detachable like new_node): like content_type.new_node + -- + do + Result := Precursor (response, fd, a_node) + if attached fd.string_item ("tags") as l_tags then + Result.set_tags_from_string (l_tags) + end + end + +feature -- Output + + append_html_output_to (a_node: CMS_NODE; a_response: NODE_RESPONSE) + -- + local + s: STRING + do + Precursor (a_node, a_response) + if attached a_response.main_content as l_main_content then + s := l_main_content + else + create s.make_empty + end + + if attached {CMS_BLOG} a_node as l_blog_post then + if attached l_blog_post.tags as l_tags then + s.append ("
Tags: ") + across + l_tags as ic + loop + s.append ("") + s.append (a_response.html_encoded (ic.item)) + s.append (" ") + end + s.append ("
") + end + end + a_response.set_main_content (s) + end + + + +end diff --git a/examples/demo/modules/blog/cms_node_storage_sql_blog_extension.e b/examples/demo/modules/blog/cms_node_storage_sql_blog_extension.e index c7c7cab..4dd2d5c 100644 --- a/examples/demo/modules/blog/cms_node_storage_sql_blog_extension.e +++ b/examples/demo/modules/blog/cms_node_storage_sql_blog_extension.e @@ -28,7 +28,7 @@ feature -- Access content_type: STRING once - Result := {CMS_BLOG_CONTENT_TYPE}.name + Result := {CMS_BLOG_NODE_TYPE}.name end feature -- Persistence diff --git a/src/kernel/cms_common_api.e b/src/kernel/cms_common_api.e index 7f94604..7eff033 100644 --- a/src/kernel/cms_common_api.e +++ b/src/kernel/cms_common_api.e @@ -29,21 +29,11 @@ feature -- Access Result := link (u.name, "/user/" + u.id.out, Void) end - node_link (n: CMS_NODE): like link - do - Result := link (n.title, "/node/" + n.id.out, Void) - end - user_url (u: CMS_USER): like url do Result := url ("/user/" + u.id.out, Void) end - node_url (n: CMS_NODE): like url - do - Result := url ("/node/" + n.id.out, Void) - end - feature -- Helper is_empty (s: detachable READABLE_STRING_GENERAL): BOOLEAN diff --git a/src/modules/node/cms_content_type.e b/src/modules/node/cms_content_type.e index 675a470..e250c74 100644 --- a/src/modules/node/cms_content_type.e +++ b/src/modules/node/cms_content_type.e @@ -9,6 +9,9 @@ note deferred class CMS_CONTENT_TYPE +inherit + CMS_API_ACCESS + feature -- Access name: READABLE_STRING_8 @@ -33,18 +36,6 @@ feature -- Access deferred end -feature -- Factory - - new_node_with_title (a_title: READABLE_STRING_32; a_partial_node: detachable CMS_NODE): like new_node - -- New node with `a_title' and fill from partial `a_partial_node' if set. - deferred - end - - new_node (a_partial_node: detachable CMS_NODE): CMS_NODE - -- New node based on partial `a_partial_node' if set. - deferred - end - note copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/src/modules/node/cms_node_api.e b/src/modules/node/cms_node_api.e index 03afa02..ad2811b 100644 --- a/src/modules/node/cms_node_api.e +++ b/src/modules/node/cms_node_api.e @@ -30,19 +30,19 @@ feature {NONE} -- Implementation else create {CMS_NODE_STORAGE_NULL} node_storage.make end - initialize_content_types + initialize_node_types end - initialize_content_types + initialize_node_types -- Initialize content type system. local - ct: CMS_PAGE_CONTENT_TYPE + ct: CMS_PAGE_NODE_TYPE do create content_types.make (1) create content_type_webform_managers.make (1) create ct add_content_type (ct) - add_content_type_webform_manager (create {CMS_PAGE_CONTENT_TYPE_WEBFORM_MANAGER}.make (ct)) + add_content_type_webform_manager (create {CMS_PAGE_NODE_TYPE_WEBFORM_MANAGER}.make (ct)) end feature {CMS_MODULE} -- Access nodes storage. @@ -54,12 +54,27 @@ feature -- Content type content_types: ARRAYED_LIST [CMS_CONTENT_TYPE] -- Available content types + node_types: ARRAYED_LIST [CMS_NODE_TYPE] + -- Node content types. + do + create Result.make (content_types.count) + across + content_types as ic + loop + if attached {CMS_NODE_TYPE} ic.item as l_node_type then + Result.extend (l_node_type) + end + end + end + add_content_type (a_type: CMS_CONTENT_TYPE) + -- Register content type `a_type'. do content_types.force (a_type) end content_type (a_name: READABLE_STRING_GENERAL): detachable CMS_CONTENT_TYPE + -- Content type named `a_named' if any. do across content_types as ic @@ -73,33 +88,84 @@ feature -- Content type end end + node_type (a_name: READABLE_STRING_GENERAL): detachable CMS_NODE_TYPE + -- Content type named `a_named' if any. + do + across + content_types as ic + until + Result /= Void + loop + if + attached {like node_type} ic.item as l_node_type and then + a_name.is_case_insensitive_equal (l_node_type.name) + then + Result := l_node_type + end + end + end + + node_type_for (a_node: CMS_NODE): detachable CMS_NODE_TYPE + -- Content type for node `a_node' if any. + local + l_type_name: READABLE_STRING_8 + do + l_type_name := a_node.content_type + Result := node_type (l_type_name) + end + feature -- Content type webform content_type_webform_managers: ARRAYED_LIST [CMS_CONTENT_TYPE_WEBFORM_MANAGER] -- Available content types - add_content_type_webform_manager (a_type: CMS_CONTENT_TYPE_WEBFORM_MANAGER) + add_content_type_webform_manager (a_manager: CMS_CONTENT_TYPE_WEBFORM_MANAGER) + -- Register webform manager `a_manager'. do - content_type_webform_managers.force (a_type) + content_type_webform_managers.force (a_manager) end - content_type_webform_manager (a_name: READABLE_STRING_GENERAL): detachable CMS_CONTENT_TYPE_WEBFORM_MANAGER + content_type_webform_manager (a_content_type: CMS_CONTENT_TYPE): detachable CMS_CONTENT_TYPE_WEBFORM_MANAGER + -- Web form manager for content type `a_content_type' if any. + local + l_type_name: READABLE_STRING_GENERAL do + l_type_name := a_content_type.name across content_type_webform_managers as ic until Result /= Void loop Result := ic.item - if not a_name.is_case_insensitive_equal (Result.name) then + if not l_type_name.is_case_insensitive_equal (Result.name) then Result := Void end end end + node_type_webform_manager (a_node_type: CMS_NODE_TYPE): detachable CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER + -- Web form manager for node type `a_node_type' if any. + local + l_type_name: READABLE_STRING_GENERAL + do + l_type_name := a_node_type.name + across + content_type_webform_managers as ic + until + Result /= Void + loop + if + attached {CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER} ic.item as l_manager and then + l_type_name.is_case_insensitive_equal (l_manager.name) + then + Result := l_manager + end + end + end + feature -- URL - new_content_path (ct: detachable CMS_CONTENT_TYPE): STRING + new_content_path (ct: detachable CMS_NODE_TYPE): STRING -- URI path for new content of type `ct' -- or URI of path for selection of new content possibilities if ct is Void. do @@ -158,7 +224,7 @@ feature -- Access: Node -- otherwise return directly `a_node'. do if attached {CMS_PARTIAL_NODE} a_node as l_partial_node then - if attached content_type (l_partial_node.content_type) as ct then + if attached node_type_for (l_partial_node) as ct then Result := ct.new_node (l_partial_node) node_storage.fill_node (Result) else diff --git a/src/modules/node/cms_node_type.e b/src/modules/node/cms_node_type.e new file mode 100644 index 0000000..5f2d453 --- /dev/null +++ b/src/modules/node/cms_node_type.e @@ -0,0 +1,30 @@ +note + description: "[ + Interface defining a CMS content type. + ]" + status: "draft" + date: "$Date$" + revision: "$Revision$" + +deferred class + CMS_NODE_TYPE + +inherit + CMS_CONTENT_TYPE + +feature -- Factory + + new_node_with_title (a_title: READABLE_STRING_32; a_partial_node: detachable CMS_NODE): like new_node + -- New node with `a_title' and fill from partial `a_partial_node' if set. + deferred + end + + new_node (a_partial_node: detachable CMS_NODE): CMS_NODE + -- New node based on partial `a_partial_node' if set. + deferred + end + +note + copyright: "2011-2015, Javier Velilla, Jocelyn Fiat, Eiffel Software and others" + license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" +end diff --git a/library/model/src/content/cms_node.e b/src/modules/node/content/cms_node.e similarity index 99% rename from library/model/src/content/cms_node.e rename to src/modules/node/content/cms_node.e index 5828c60..fcff4cc 100644 --- a/library/model/src/content/cms_node.e +++ b/src/modules/node/content/cms_node.e @@ -43,7 +43,7 @@ feature{NONE} -- Initialization title_set: title = a_title end -feature {CMS_CONTENT_TYPE} -- Conversion +feature -- Conversion import_node (a_node: CMS_NODE) -- Import `a_node' into current node. diff --git a/library/model/src/content/cms_partial_node.e b/src/modules/node/content/cms_partial_node.e similarity index 100% rename from library/model/src/content/cms_partial_node.e rename to src/modules/node/content/cms_partial_node.e diff --git a/src/modules/node/content_type/cms_page.e b/src/modules/node/content_type/cms_page.e index 4353c0b..5bb3cbd 100644 --- a/src/modules/node/content_type/cms_page.e +++ b/src/modules/node/content_type/cms_page.e @@ -24,7 +24,7 @@ feature {NONE} -- Initialization Precursor end -feature {CMS_CONTENT_TYPE} -- Conversion +feature -- Conversion import_node (a_node: CMS_NODE) -- @@ -39,7 +39,7 @@ feature -- Access content_type: READABLE_STRING_8 once - Result := {CMS_PAGE_CONTENT_TYPE}.name + Result := {CMS_PAGE_NODE_TYPE}.name end feature -- Access: content diff --git a/src/modules/node/content_type/cms_page_content_type.e b/src/modules/node/content_type/cms_page_node_type.e similarity index 92% rename from src/modules/node/content_type/cms_page_content_type.e rename to src/modules/node/content_type/cms_page_node_type.e index a532866..f1f1663 100644 --- a/src/modules/node/content_type/cms_page_content_type.e +++ b/src/modules/node/content_type/cms_page_node_type.e @@ -1,13 +1,13 @@ note - description: "Summary description for {CMS_PAGE_CONTENT_TYPE}." + description: "Summary description for {CMS_PAGE_NODE_TYPE}." date: "$Date$" revision: "$Revision$" class - CMS_PAGE_CONTENT_TYPE + CMS_PAGE_NODE_TYPE inherit - CMS_CONTENT_TYPE + CMS_NODE_TYPE redefine default_create end diff --git a/src/modules/node/handler/cms_content_type_webform_manager.e b/src/modules/node/handler/cms_content_type_webform_manager.e index 7beec3c..4070ec0 100644 --- a/src/modules/node/handler/cms_content_type_webform_manager.e +++ b/src/modules/node/handler/cms_content_type_webform_manager.e @@ -1,12 +1,17 @@ note - description: "Summary description for {CMS_CONTENT_TYPE_WEBFORM_MANAGER}." - author: "" + description: "[ + Html builder for content type `content_type'. + This is used to build webform and html output for a specific node, or node content type. + ]" date: "$Date$" revision: "$Revision$" deferred class CMS_CONTENT_TYPE_WEBFORM_MANAGER +inherit + CMS_API_ACCESS + feature {NONE} -- Initialization make (a_type: like content_type) @@ -20,25 +25,9 @@ feature -- Access -- Associated content type. name: READABLE_STRING_8 + -- Associated content type name. do Result := content_type.name end -feature -- Forms ... - - fill_edit_form (response: NODE_RESPONSE; a_form: WSF_FORM; a_node: detachable CMS_NODE) - deferred - end - - new_node (response: NODE_RESPONSE; a_form_data: WSF_FORM_DATA; a_node: detachable CMS_NODE): CMS_NODE - deferred --- Result := content_type.new_node (a_node) - end - - change_node (response: NODE_RESPONSE; a_form_data: WSF_FORM_DATA; a_node: CMS_NODE) --- require --- a_node.has_id - deferred - end - end diff --git a/src/modules/node/handler/cms_node_content_type_webform_manager.e b/src/modules/node/handler/cms_node_content_type_webform_manager.e index f372df2..138fb57 100644 --- a/src/modules/node/handler/cms_node_content_type_webform_manager.e +++ b/src/modules/node/handler/cms_node_content_type_webform_manager.e @@ -1,10 +1,13 @@ note - description: "Summary description for {CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER}." + description: "[ + Html builder for content type `content_type'. + This is used to build webform and html output for a specific node, or node content type. + ]" date: "$Date$" revision: "$Revision$" -class - CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER [G -> CMS_NODE] +deferred class + CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER inherit CMS_CONTENT_TYPE_WEBFORM_MANAGER @@ -12,148 +15,53 @@ inherit content_type end -create - make - feature -- Access - content_type: CMS_CONTENT_TYPE - -- Associated content type. + content_type: CMS_NODE_TYPE + -- Associated content type. + +feature -- Query + + has_valid_node_type (a_node: CMS_NODE): BOOLEAN + -- Accept `a_node' for Current operations. + do + Result := attached {like new_node} a_node + end feature -- Forms ... - fill_edit_form (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable like new_node) - local - ti: WSF_FORM_TEXT_INPUT - fset: WSF_FORM_FIELD_SET - ta: WSF_FORM_TEXTAREA - tselect: WSF_FORM_SELECT - opt: WSF_FORM_SELECT_OPTION - do - create ti.make ("title") - ti.set_label ("Title") - ti.set_size (70) - if a_node /= Void then - ti.set_text_value (a_node.title) - end - ti.set_is_required (True) - f.extend (ti) - - f.extend_html_text ("
") - - create ta.make ("body") - ta.set_rows (10) - ta.set_cols (70) - if a_node /= Void then - ta.set_text_value (a_node.content) - end --- ta.set_label ("Body") - ta.set_description ("This is the main content") - ta.set_is_required (False) - - create fset.make - fset.set_legend ("Body") - fset.extend (ta) - - fset.extend_html_text ("
") - - create tselect.make ("format") - tselect.set_label ("Body's format") - tselect.set_is_required (True) - across - content_type.available_formats as c - loop - create opt.make (c.item.name, c.item.title) - if attached c.item.html_help as f_help then - opt.set_description ("
    " + f_help + "
") - end - tselect.add_option (opt) - end - if a_node /= Void and then attached a_node.format as l_format then - tselect.set_text_by_value (l_format) - end - - fset.extend (tselect) - - f.extend (fset) - + populate_form (response: NODE_RESPONSE; a_form: WSF_FORM; a_node: detachable CMS_NODE) + -- Fill the web form `a_form' with data from `a_node' if set. + require + a_node = Void or else has_valid_node_type (a_node) + deferred end - change_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: like new_node) - local - b: detachable READABLE_STRING_8 - f: detachable CONTENT_FORMAT - do - if attached fd.integer_item ("id") as l_id and then l_id > 0 then - check a_node.id = l_id end - end - if attached fd.string_item ("title") as l_title then - a_node.set_title (l_title) - end +feature -- Node ... - if attached fd.string_item ("body") as l_body then - b := l_body - end - if attached fd.string_item ("format") as s_format and then attached response.api.format (s_format) as f_format then - f := f_format - elseif a_node /= Void and then attached a_node.format as s_format and then attached response.api.format (s_format) as f_format then - f := f_format - else - f := response.api.formats.default_format - end - if b /= Void then - a_node.set_content (b, Void, f.name) -- FIXME: summary - end + new_node (response: NODE_RESPONSE; a_form_data: WSF_FORM_DATA; a_node: detachable CMS_NODE): like content_type.new_node + -- New typed node with data from `a_form_data', and eventually data from `a_node' if set. + require + a_node = Void or else has_valid_node_type (a_node) + deferred + --| Possible implementation: + --| Result := content_type.new_node (a_node) end - new_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: detachable like new_node): like content_type.new_node - -- - local - b: detachable READABLE_STRING_8 - f: detachable CONTENT_FORMAT - l_node: detachable like new_node - do - l_node := a_node - if attached fd.integer_item ("id") as l_id and then l_id > 0 then - if l_node /= Void then - check l_node.id = l_id end - else - if attached {like new_node} response.node_api.node (l_id) as n then - l_node := n - else - -- FIXME: Error - end - end - end - if attached fd.string_item ("title") as l_title then - if l_node = Void then - l_node := content_type.new_node (Void) - l_node.set_title (l_title) - else - l_node.set_title (l_title) - end - else - if l_node = Void then - l_node := content_type.new_node_with_title ("...", Void) - end - end - l_node.set_author (response.user) + update_node (response: NODE_RESPONSE; a_form_data: WSF_FORM_DATA; a_node: CMS_NODE) + -- Update node `a_node' with data from `a_form_data'. + require + has_valid_node_type (a_node) + deferred + end - if attached fd.string_item ("body") as l_body then - b := l_body - end - if attached fd.string_item ("format") as s_format and then attached response.api.format (s_format) as f_format then - f := f_format - elseif a_node /= Void and then attached a_node.format as s_format and then attached response.api.format (s_format) as f_format then - f := f_format - else - f := response.api.formats.default_format - end - if b /= Void then - l_node.set_content (b, Void, f.name) - end - Result := l_node +feature -- Output + + append_html_output_to (a_node: CMS_NODE; a_response: NODE_RESPONSE) + -- Append an html representation of `a_node' to response `a_response'. + require + has_valid_node_type (a_node) + deferred end end - diff --git a/src/modules/node/handler/cms_node_type_webform_manager.e b/src/modules/node/handler/cms_node_type_webform_manager.e new file mode 100644 index 0000000..0d75dc1 --- /dev/null +++ b/src/modules/node/handler/cms_node_type_webform_manager.e @@ -0,0 +1,203 @@ +note + description: "Summary description for {CMS_NODE_TYPE_WEBFORM_MANAGER}." + date: "$Date$" + revision: "$Revision$" + +class + CMS_NODE_TYPE_WEBFORM_MANAGER [G -> CMS_NODE] + +inherit + CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER + +create + make + +feature -- Forms ... + + populate_form (response: NODE_RESPONSE; f: CMS_FORM; a_node: detachable CMS_NODE) + local + ti: WSF_FORM_TEXT_INPUT + fset: WSF_FORM_FIELD_SET + ta: WSF_FORM_TEXTAREA + tselect: WSF_FORM_SELECT + opt: WSF_FORM_SELECT_OPTION + do + create ti.make ("title") + ti.set_label ("Title") + ti.set_size (70) + if a_node /= Void then + ti.set_text_value (a_node.title) + end + ti.set_is_required (True) + f.extend (ti) + + f.extend_html_text ("
") + + create ta.make ("body") + ta.set_rows (10) + ta.set_cols (70) + if a_node /= Void then + ta.set_text_value (a_node.content) + end +-- ta.set_label ("Body") + ta.set_description ("This is the main content") + ta.set_is_required (False) + + create fset.make + fset.set_legend ("Body") + fset.extend (ta) + + fset.extend_html_text ("
") + + create tselect.make ("format") + tselect.set_label ("Body's format") + tselect.set_is_required (True) + across + content_type.available_formats as c + loop + create opt.make (c.item.name, c.item.title) + if attached c.item.html_help as f_help then + opt.set_description ("
    " + f_help + "
") + end + tselect.add_option (opt) + end + if a_node /= Void and then attached a_node.format as l_format then + tselect.set_text_by_value (l_format) + end + + fset.extend (tselect) + + f.extend (fset) + + end + + update_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: CMS_NODE) + local + b: detachable READABLE_STRING_8 + f: detachable CONTENT_FORMAT + do + if attached fd.integer_item ("id") as l_id and then l_id > 0 then + check a_node.id = l_id end + end + if attached fd.string_item ("title") as l_title then + a_node.set_title (l_title) + end + + if attached fd.string_item ("body") as l_body then + b := l_body + end + if attached fd.string_item ("format") as s_format and then attached response.api.format (s_format) as f_format then + f := f_format + elseif a_node /= Void and then attached a_node.format as s_format and then attached response.api.format (s_format) as f_format then + f := f_format + else + f := response.api.formats.default_format + end + if b /= Void then + a_node.set_content (b, Void, f.name) -- FIXME: summary + end + end + + new_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: detachable CMS_NODE): like content_type.new_node + -- + local + b: detachable READABLE_STRING_8 + f: detachable CONTENT_FORMAT + l_node: detachable like new_node + do + if attached {like new_node} a_node as l_arg_node then + l_node := l_arg_node + else + l_node := content_type.new_node (a_node) + end + if attached fd.integer_item ("id") as l_id and then l_id > 0 then + if l_node /= Void then + check l_node.id = l_id end + else + if attached {like new_node} response.node_api.node (l_id) as n then + l_node := n + else + -- FIXME: Error + end + end + end + if attached fd.string_item ("title") as l_title then + if l_node = Void then + l_node := content_type.new_node (Void) + l_node.set_title (l_title) + else + l_node.set_title (l_title) + end + else + if l_node = Void then + l_node := content_type.new_node_with_title ("...", Void) + end + end + l_node.set_author (response.user) + + if attached fd.string_item ("body") as l_body then + b := l_body + end + if attached fd.string_item ("format") as s_format and then attached response.api.format (s_format) as f_format then + f := f_format + elseif a_node /= Void and then attached a_node.format as s_format and then attached response.api.format (s_format) as f_format then + f := f_format + else + f := response.api.formats.default_format + end + if b /= Void then + l_node.set_content (b, Void, f.name) + end + Result := l_node + end + +feature -- Output + + append_html_output_to (a_node: CMS_NODE; a_response: NODE_RESPONSE) + -- + local + lnk: CMS_LOCAL_LINK + hdate: HTTP_DATE + s: STRING + node_api: CMS_NODE_API + do + node_api := a_response.node_api + + a_response.add_variable (a_node, "node") + create lnk.make ("View", node_api.node_path (a_node)) + lnk.set_weight (1) + a_response.add_to_primary_tabs (lnk) + create lnk.make ("Edit", node_api.node_path (a_node) + "/edit") + lnk.set_weight (2) + a_response.add_to_primary_tabs (lnk) + + create s.make_empty + s.append ("
") + if attached a_node.author as l_author then + s.append (" by ") + s.append (l_author.name) + end + if attached a_node.modification_date as l_modified then + s.append (" (modified: ") + create hdate.make_from_date_time (l_modified) + s.append (hdate.yyyy_mmm_dd_string) + s.append (")") + end + s.append ("
") + if attached a_node.content as l_content then + s.append ("

") + if attached node_api.cms_api.format (a_node.format) as f then + s.append (f.formatted_output (l_content)) + else + s.append (node_api.cms_api.formats.default_format.formatted_output (l_content)) + end + + s.append ("

") + end + + a_response.set_title (a_node.title) + a_response.set_main_content (s) + end + +end + diff --git a/src/modules/node/handler/cms_page_content_type_webform_manager.e b/src/modules/node/handler/cms_page_node_type_webform_manager.e similarity index 81% rename from src/modules/node/handler/cms_page_content_type_webform_manager.e rename to src/modules/node/handler/cms_page_node_type_webform_manager.e index 2d176b6..e538aa7 100644 --- a/src/modules/node/handler/cms_page_content_type_webform_manager.e +++ b/src/modules/node/handler/cms_page_node_type_webform_manager.e @@ -1,16 +1,17 @@ note - description: "Summary description for {CMS_PAGE_CONTENT_TYPE_WEBFORM_MANAGER}." + description: "Summary description for {CMS_PAGE_NODE_TYPE_WEBFORM_MANAGER}." author: "" date: "$Date$" revision: "$Revision$" class - CMS_PAGE_CONTENT_TYPE_WEBFORM_MANAGER + CMS_PAGE_NODE_TYPE_WEBFORM_MANAGER inherit - CMS_NODE_CONTENT_TYPE_WEBFORM_MANAGER [CMS_PAGE] + CMS_NODE_TYPE_WEBFORM_MANAGER [CMS_PAGE] redefine - content_type + content_type, + append_html_output_to end create @@ -18,7 +19,7 @@ create feature -- Access - content_type: CMS_PAGE_CONTENT_TYPE + content_type: CMS_PAGE_NODE_TYPE -- Associated content type. feature -- Forms ... @@ -156,5 +157,29 @@ feature -- Forms ... -- Result := l_node -- end +feature -- Output + + append_html_output_to (a_node: CMS_NODE; a_response: NODE_RESPONSE) + -- + local + s: STRING + do + Precursor (a_node, a_response) + if attached a_response.main_content as l_main_content then + s := l_main_content + else + create s.make_empty + end + + if attached {CMS_PAGE} a_node as l_node_page then + if attached l_node_page.parent as l_parent_node then + s.append ("
Parent page is ") + s.append (a_response.link (l_parent_node.title + " (#" + l_parent_node.id.out + ")", a_response.node_api.node_path (l_parent_node), Void)) + s.append ("
") + end + end + + a_response.set_main_content (s) + end end diff --git a/src/modules/node/handler/node_form_response.e b/src/modules/node/handler/node_form_response.e index dbd8539..15c4c81 100644 --- a/src/modules/node/handler/node_form_response.e +++ b/src/modules/node/handler/node_form_response.e @@ -1,7 +1,5 @@ note - description: "Summary description for {NODE_FORM_RESPONSE}." - author: "" - date: "$Date$" + description: "CMS Response handling node editing workflow using Web forms." revision: "$Revision$" class @@ -42,6 +40,7 @@ feature -- Execution f: like edit_form fd: detachable WSF_FORM_DATA nid: INTEGER_64 + l_node_type: CMS_NODE_TYPE do create b.make_empty nid := node_id_path_parameter (request) @@ -49,7 +48,7 @@ feature -- Execution nid > 0 and then attached node_api.node (nid) as l_node then - if attached node_api.content_type (l_node.content_type) as l_type then + if attached node_api.node_type_for (l_node) as l_type then if has_permission ("edit " + l_type.name) then f := edit_form (l_node, url (request.path_info, Void), "edit-" + l_type.name, l_type) if request.is_post_request_method then @@ -65,9 +64,9 @@ feature -- Execution add_to_menu (create {CMS_LOCAL_LINK}.make ("View", node_url (l_node)), primary_tabs) add_to_menu (create {CMS_LOCAL_LINK}.make ("Edit", "/node/" + l_node.id.out + "/edit"), primary_tabs) - b.append ("saved") + b.append (html_encoded (l_type.title) + " saved") else - set_title ("Edit #" + l_node.id.out) + set_title ("Edit " + html_encoded (l_type.title) + " #" + l_node.id.out) add_to_menu (create {CMS_LOCAL_LINK}.make ("View", node_url (l_node)), primary_tabs) add_to_menu (create {CMS_LOCAL_LINK}.make ("Edit", "/node/" + l_node.id.out + "/edit"), primary_tabs) @@ -82,7 +81,7 @@ feature -- Execution end elseif attached {WSF_STRING} request.path_parameter ("type") as p_type and then - attached node_api.content_type (p_type.value) as l_type + attached node_api.node_type (p_type.value) as l_type then if has_permission ("create " + l_type.name) then if attached l_type.new_node (Void) as l_node then @@ -94,7 +93,7 @@ feature -- Execution fd := f.last_data end - set_title ("Edit #" + l_node.id.out) + set_title ("Edit " + html_encoded (l_type.title) + " #" + l_node.id.out) add_to_menu (create {CMS_LOCAL_LINK}.make ("View", node_url (l_node)), primary_tabs) add_to_menu (create {CMS_LOCAL_LINK}.make ("Edit", "/node/" + l_node.id.out + "/edit"), primary_tabs) @@ -106,16 +105,19 @@ feature -- Execution else b.append ("

Access denied

") end - else set_title ("Create new content ...") b.append ("
    ") across - node_api.content_types as c + node_api.node_types as ic loop - if has_permission ("create " + c.item.name) then - b.append ("
  • " + link (c.item.name, "/node/add/" + c.item.name, Void)) - if attached c.item.description as d then + l_node_type := ic.item + if + has_permission ("create any") + or has_permission ("create " + l_node_type.name) + then + b.append ("
  • " + link (l_node_type.name, "/node/add/" + l_node_type.name, Void)) + if attached l_node_type.description as d then b.append ("
    " + d + "
    ") end b.append ("
  • ") @@ -155,7 +157,7 @@ feature -- Form end end - edit_form_submit (fd: WSF_FORM_DATA; a_node: detachable CMS_NODE; a_type: CMS_CONTENT_TYPE; b: STRING) + edit_form_submit (fd: WSF_FORM_DATA; a_node: detachable CMS_NODE; a_type: CMS_NODE_TYPE; b: STRING) local l_preview: BOOLEAN l_node: detachable CMS_NODE @@ -200,7 +202,7 @@ feature -- Form end end - edit_form (a_node: detachable CMS_NODE; a_url: READABLE_STRING_8; a_name: STRING; a_type: CMS_CONTENT_TYPE): CMS_FORM + edit_form (a_node: detachable CMS_NODE; a_url: READABLE_STRING_8; a_name: STRING; a_type: CMS_NODE_TYPE): CMS_FORM local f: CMS_FORM ts: WSF_FORM_SUBMIT_INPUT @@ -231,26 +233,28 @@ feature -- Form Result := f end - new_node (a_content_type: CMS_CONTENT_TYPE; a_form_data: WSF_FORM_DATA; a_node: detachable CMS_NODE): CMS_NODE + new_node (a_content_type: CMS_NODE_TYPE; a_form_data: WSF_FORM_DATA; a_node: detachable CMS_NODE): CMS_NODE + -- do - if attached node_api.content_type_webform_manager (a_content_type.name) as wf then + if attached node_api.node_type_webform_manager (a_content_type) as wf then Result := wf.new_node (Current, a_form_data, a_node) else Result := a_content_type.new_node (a_node) end end - change_node (a_content_type: CMS_CONTENT_TYPE; a_form_data: WSF_FORM_DATA; a_node: CMS_NODE) + change_node (a_content_type: CMS_NODE_TYPE; a_form_data: WSF_FORM_DATA; a_node: CMS_NODE) + -- Update node `a_node' with form_data `a_form_data' for the given content type `a_content_type'. do - if attached node_api.content_type_webform_manager (a_content_type.name) as wf then - wf.change_node (Current, a_form_data, a_node) + if attached node_api.node_type_webform_manager (a_content_type) as wf then + wf.update_node (Current, a_form_data, a_node) end end - fill_edit_form (a_content_type: CMS_CONTENT_TYPE; a_form: WSF_FORM; a_node: detachable CMS_NODE) + fill_edit_form (a_content_type: CMS_NODE_TYPE; a_form: WSF_FORM; a_node: detachable CMS_NODE) do - if attached node_api.content_type_webform_manager (a_content_type.name) as wf then - wf.fill_edit_form (Current, a_form, a_node) + if attached node_api.node_type_webform_manager (a_content_type) as wf then + wf.populate_form (Current, a_form, a_node) end end diff --git a/src/modules/node/handler/node_handler.e b/src/modules/node/handler/node_handler.e index c446067..c2d6746 100644 --- a/src/modules/node/handler/node_handler.e +++ b/src/modules/node/handler/node_handler.e @@ -1,5 +1,9 @@ note - description: "handler for CMS node in the CMS interface." + description: "[ + handler for CMS node in the CMS interface. + + TODO: implement REST API. + ]" date: "$Date: 2015-02-13 13:08:13 +0100 (ven., 13 févr. 2015) $" revision: "$Revision: 96616 $" @@ -61,13 +65,10 @@ feature -- HTTP Methods do_get (req: WSF_REQUEST; res: WSF_RESPONSE) -- local - l_page: CMS_RESPONSE - s: STRING - hdate: HTTP_DATE - lnk: CMS_LOCAL_LINK l_node: detachable CMS_NODE l_nid: INTEGER_64 edit_response: NODE_FORM_RESPONSE + view_response: NODE_VIEW_RESPONSE do if req.path_info.ends_with_general ("/edit") then create edit_response.make (req, res, api, node_api) @@ -83,49 +84,9 @@ feature -- HTTP Methods l_node := node_api.node (l_nid) end if l_node /= Void then - -- FIXME: allow a per content type display here! - create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) - l_page.add_variable (l_node, "node") - create lnk.make ("View", node_api.node_path (l_node)) - lnk.set_weight (1) - l_page.add_to_primary_tabs (lnk) - create lnk.make ("Edit", node_api.node_path (l_node) + "/edit") - lnk.set_weight (2) - l_page.add_to_primary_tabs (lnk) - - create s.make_empty - s.append ("
    ") - if attached l_node.author as l_author then - s.append (" by ") - s.append (l_author.name) - end - if attached l_node.modification_date as l_modified then - s.append (" (modified: ") - create hdate.make_from_date_time (l_modified) - s.append (hdate.yyyy_mmm_dd_string) - s.append (")") - end - s.append ("
    ") - if attached l_node.content as l_content then - s.append ("

    ") - if attached api.format (l_node.format) as f then - s.append (f.formatted_output (l_content)) - else - s.append (api.formats.default_format.formatted_output (l_content)) - end - - s.append ("

    ") - end - if attached {CMS_PAGE} l_node as l_node_page then - if attached l_node_page.parent as l_parent_node then - s.append ("
    Parent page is ") - s.append (l_page.link (l_parent_node.title + " (#" + l_parent_node.id.out + ")", node_api.node_path (l_parent_node), Void)) - s.append ("
    ") - end - end - l_page.set_title (l_node.title) - l_page.set_main_content (s) - l_page.execute + create view_response.make (req, res, api, node_api) + view_response.set_node (l_node) + view_response.execute elseif l_nid > 0 then --| i.e: l_node = Void send_not_found (req, res) else @@ -149,55 +110,57 @@ feature -- HTTP Methods create edit_response.make (req, res, api, node_api) edit_response.execute else - to_implement ("Check user permissions!!!") - if attached current_user (req) as l_user then - if attached {WSF_STRING} req.path_parameter ("id") as l_id then - if - l_id.is_integer and then - attached node_api.node (l_id.value.to_integer_64) as l_node - then - if attached {WSF_STRING} req.form_parameter ("method") as l_method then - if l_method.is_case_insensitive_equal ("DELETE") then - do_delete (req, res) - elseif l_method.is_case_insensitive_equal ("PUT") then - do_put (req, res) - else - process_node_update (req, res, l_user, l_node) - -- Accept this, even if this is not proper usage of POST - -- (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute - end - end - else - do_error (req, res, l_id) - end - else - process_node_creation (req, res, l_user) - end - else - send_access_denied (req, res) - end + handle_not_implemented ("REST API not yet implemented", req, res) +-- to_implement ("Check user permissions!!!") +-- if attached current_user (req) as l_user then +-- if attached {WSF_STRING} req.path_parameter ("id") as l_id then +-- if +-- l_id.is_integer and then +-- attached node_api.node (l_id.value.to_integer_64) as l_node +-- then +-- if attached {WSF_STRING} req.form_parameter ("method") as l_method then +-- if l_method.is_case_insensitive_equal ("DELETE") then +-- do_delete (req, res) +-- elseif l_method.is_case_insensitive_equal ("PUT") then +-- do_put (req, res) +-- else +-- process_node_update (req, res, l_user, l_node) +-- -- Accept this, even if this is not proper usage of POST +-- -- (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute +-- end +-- end +-- else +-- do_error (req, res, l_id) +-- end +-- else +-- process_node_creation (req, res, l_user) +-- end +-- else +-- send_access_denied (req, res) +-- end end end do_put (req: WSF_REQUEST; res: WSF_RESPONSE) -- do - if attached current_user (req) as l_user then - if attached {WSF_STRING} req.path_parameter ("id") as l_id then - if - l_id.is_integer and then - attached node_api.node (l_id.value.to_integer_64) as l_node - then - process_node_update (req, res, l_user, l_node) - else - do_error (req, res, l_id) - end - else - (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute - end - else - send_access_denied (req, res) - end + handle_not_implemented ("REST API not yet implemented", req, res) +-- if attached current_user (req) as l_user then +-- if attached {WSF_STRING} req.path_parameter ("id") as l_id then +-- if +-- l_id.is_integer and then +-- attached node_api.node (l_id.value.to_integer_64) as l_node +-- then +-- process_node_update (req, res, l_user, l_node) +-- else +-- do_error (req, res, l_id) +-- end +-- else +-- (create {INTERNAL_SERVER_ERROR_CMS_RESPONSE}.make (req, res, api)).execute +-- end +-- else +-- send_access_denied (req, res) +-- end end do_delete (req: WSF_REQUEST; res: WSF_RESPONSE) @@ -228,48 +191,49 @@ feature -- HTTP Methods process_node_creation (req: WSF_REQUEST; res: WSF_RESPONSE; a_user: CMS_USER) local - u_node: CMS_NODE +-- u_node: CMS_NODE do -- New node -- FIXME !!! - if - attached {WSF_STRING} req.form_parameter ("type") as p_type and then - attached node_api.content_type (p_type.value) as ct -- should be string 8 value. - then - if api.user_has_permission (a_user, "create " + ct.name) then - u_node := ct.new_node (Void) - -- create {CMS_PARTIAL_NODE} u_node.make_empty (p_type.url_encoded_value) - update_node_from_data_form (req, u_node) - u_node.set_author (a_user) - node_api.new_node (u_node) - if attached {WSF_STRING} req.item ("destination") as p_destination then - redirect_to (req.absolute_script_url (p_destination.url_encoded_value), res) - else - redirect_to (req.absolute_script_url (""), res) - end - else - send_access_denied (req, res) - end - else - do_error (req, res, Void) - end + handle_not_implemented ("REST API not yet implemented", req, res) +-- if +-- attached {WSF_STRING} req.form_parameter ("type") as p_type and then +-- attached node_api.node_type (p_type.value) as ct -- should be string 8 value. +-- then +-- if api.user_has_permission (a_user, "create " + ct.name) then +-- u_node := ct.new_node (Void) +-- -- create {CMS_PARTIAL_NODE} u_node.make_empty (p_type.url_encoded_value) +-- update_node_from_data_form (req, u_node) +-- u_node.set_author (a_user) +-- node_api.new_node (u_node) +-- if attached {WSF_STRING} req.item ("destination") as p_destination then +-- redirect_to (req.absolute_script_url (p_destination.url_encoded_value), res) +-- else +-- redirect_to (req.absolute_script_url (""), res) +-- end +-- else +-- send_access_denied (req, res) +-- end +-- else +-- do_error (req, res, Void) +-- end end - process_node_update (req: WSF_REQUEST; res: WSF_RESPONSE; a_user: CMS_USER; a_node: CMS_NODE) - do - if api.user_has_permission (a_user, "modify " + a_node.content_type) then - update_node_from_data_form (req, a_node) - a_node.set_author (a_user) - node_api.update_node (a_node) - if attached {WSF_STRING} req.item ("destination") as p_destination then - redirect_to (req.absolute_script_url (p_destination.url_encoded_value), res) - else - redirect_to (req.absolute_script_url (""), res) - end - else - send_access_denied (req, res) - end - end +-- process_node_update (req: WSF_REQUEST; res: WSF_RESPONSE; a_user: CMS_USER; a_node: CMS_NODE) +-- do +-- if api.user_has_permission (a_user, "modify " + a_node.content_type) then +-- update_node_from_data_form (req, a_node) +-- a_node.set_author (a_user) +-- node_api.update_node (a_node) +-- if attached {WSF_STRING} req.item ("destination") as p_destination then +-- redirect_to (req.absolute_script_url (p_destination.url_encoded_value), res) +-- else +-- redirect_to (req.absolute_script_url (""), res) +-- end +-- else +-- send_access_denied (req, res) +-- end +-- end feature -- Error @@ -296,81 +260,47 @@ feature {NONE} -- Node create_new_node (req: WSF_REQUEST; res: WSF_RESPONSE) local - l_page: NOT_IMPLEMENTED_ERROR_CMS_RESPONSE - l_node: detachable CMS_NODE l_gen_page: GENERIC_VIEW_CMS_RESPONSE edit_response: NODE_FORM_RESPONSE s: STRING do - if - attached {WSF_STRING} req.path_parameter ("type") as p_type and then - attached node_api.content_type (p_type.value) as ct - then + if req.path_info.starts_with_general ("/node/add/") then create edit_response.make (req, res, api, node_api) edit_response.execute --- create l_page.make (req, res, api) --- l_node := ct.new_node (Void) --- l_page.set_main_content (l_node.out) --- l_page.execute + elseif req.is_get_request_method then + redirect_to (req.absolute_script_url ("/node/add/"), res) else - create l_gen_page.make (req, res, api) - - create s.make_empty - s.append ("
      ") - across - node_api.content_types as ic - loop - if api.user_has_permission (current_user (req), "create " + ic.item.name) then - s.append ("
    • ") - s.append (l_gen_page.link (ic.item.title, node_api.new_content_path (ic.item), Void)) - if attached ic.item.description as l_description then - s.append ("

      ") - s.append (l_gen_page.html_encoded (l_description)) - s.append ("

      ") - end - s.append ("
    • ") - end - end - s.append ("
    ") - l_gen_page.set_title ("Create new content ...") - l_gen_page.set_main_content (s) - l_gen_page.execute + send_bad_request (req, res) end --- if api.user_has_permission (current_user (req), "create node") then --- create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api) --- l_page.execute --- else --- send_access_denied (req, res) --- end end feature -- {NONE} Form data - update_node_from_data_form (req: WSF_REQUEST; a_node: CMS_NODE) - -- Extract request form data and build a object - -- Node - local - l_title: detachable READABLE_STRING_32 - l_summary, l_content, l_format: detachable READABLE_STRING_8 - do - if attached {WSF_STRING} req.form_parameter ("title") as p_title then - l_title := p_title.value - a_node.set_title (l_title) - end - if attached {WSF_STRING} req.form_parameter ("summary") as p_summary then - l_summary := html_encoded (p_summary.value) - end - if attached {WSF_STRING} req.form_parameter ("content") as p_content then - l_content := html_encoded (p_content.value) - end - if attached {WSF_STRING} req.form_parameter ("format") as p_format then - l_format := p_format.url_encoded_value - end - if l_format = Void then - l_format := a_node.format - end - a_node.set_content (l_content, l_summary, l_format) - end +-- update_node_from_data_form (req: WSF_REQUEST; a_node: CMS_NODE) +-- -- Extract request form data and build a object +-- -- Node +-- local +-- l_title: detachable READABLE_STRING_32 +-- l_summary, l_content, l_format: detachable READABLE_STRING_8 +-- do +-- if attached {WSF_STRING} req.form_parameter ("title") as p_title then +-- l_title := p_title.value +-- a_node.set_title (l_title) +-- end +-- if attached {WSF_STRING} req.form_parameter ("summary") as p_summary then +-- l_summary := html_encoded (p_summary.value) +-- end +-- if attached {WSF_STRING} req.form_parameter ("content") as p_content then +-- l_content := html_encoded (p_content.value) +-- end +-- if attached {WSF_STRING} req.form_parameter ("format") as p_format then +-- l_format := p_format.url_encoded_value +-- end +-- if l_format = Void then +-- l_format := a_node.format +-- end +-- a_node.set_content (l_content, l_summary, l_format) +-- end end diff --git a/src/modules/node/handler/node_response.e b/src/modules/node/handler/node_response.e index 8779f8c..0bb7210 100644 --- a/src/modules/node/handler/node_response.e +++ b/src/modules/node/handler/node_response.e @@ -1,6 +1,5 @@ note - description: "Summary description for {NODE_RESPONSE}." - author: "" + description: "Generic CMS Response for a CMS NODE." date: "$Date$" revision: "$Revision$" @@ -26,6 +25,7 @@ feature {NONE} -- Initialization feature -- Access node_api: CMS_NODE_API + -- Associated node API. feature -- Generation diff --git a/src/modules/node/handler/node_view_response.e b/src/modules/node/handler/node_view_response.e new file mode 100644 index 0000000..e62a316 --- /dev/null +++ b/src/modules/node/handler/node_view_response.e @@ -0,0 +1,75 @@ +note + description: "Summary description for {NODE_VIEW_RESPONSE}." + date: "$Date$" + revision: "$Revision$" + +class + NODE_VIEW_RESPONSE + +inherit + NODE_RESPONSE + redefine + make, + initialize + end + +create + make + +feature {NONE} -- Initialization + + make (req: WSF_REQUEST; res: WSF_RESPONSE; a_api: like api; a_node_api: like node_api) + do + create {WSF_NULL_THEME} wsf_theme.make + Precursor (req, res, a_api, a_node_api) + end + + initialize + do + Precursor + create {WSF_CMS_THEME} wsf_theme.make (Current, theme) + end + + wsf_theme: WSF_THEME + +feature -- Access + + node: detachable CMS_NODE + +feature -- Element change + + set_node (a_node: like node) + do + node := a_node + end + +feature -- Execution + + process + -- Computed response message. + local + b: STRING_8 + nid: INTEGER_64 + l_node: like node + do + l_node := node + if l_node = Void then + create b.make_empty + nid := node_id_path_parameter (request) + if nid > 0 then + l_node := node_api.node (nid) + end + end + if l_node /= Void then + if + attached node_api.node_type_for (l_node) as l_content_type and then + attached node_api.node_type_webform_manager (l_content_type) as l_manager + then + l_manager.append_html_output_to (l_node, Current) + end + else + set_main_content ("Missing node") + end + end + +end diff --git a/src/modules/node/node_module.e b/src/modules/node/node_module.e index 01c0be0..b2290c9 100644 --- a/src/modules/node/node_module.e +++ b/src/modules/node/node_module.e @@ -47,7 +47,7 @@ feature {CMS_API} -- Module Initialization -- local p1,p2: CMS_PAGE - ct: CMS_PAGE_CONTENT_TYPE + ct: CMS_PAGE_NODE_TYPE l_node_api: like node_api do Precursor (api) diff --git a/src/persistence/node/cms_node_storage_extension.e b/src/modules/node/persistence/cms_node_storage_extension.e similarity index 100% rename from src/persistence/node/cms_node_storage_extension.e rename to src/modules/node/persistence/cms_node_storage_extension.e diff --git a/src/persistence/node/cms_node_storage_i.e b/src/modules/node/persistence/cms_node_storage_i.e similarity index 99% rename from src/persistence/node/cms_node_storage_i.e rename to src/modules/node/persistence/cms_node_storage_i.e index 058654d..815593c 100644 --- a/src/persistence/node/cms_node_storage_i.e +++ b/src/modules/node/persistence/cms_node_storage_i.e @@ -6,9 +6,6 @@ note deferred class CMS_NODE_STORAGE_I -inherit - SHARED_LOGGER - feature -- Error Handling error_handler: ERROR_HANDLER diff --git a/src/persistence/node/cms_node_storage_null.e b/src/modules/node/persistence/cms_node_storage_null.e similarity index 100% rename from src/persistence/node/cms_node_storage_null.e rename to src/modules/node/persistence/cms_node_storage_null.e diff --git a/src/persistence/node/cms_node_storage_sql.e b/src/modules/node/persistence/cms_node_storage_sql.e similarity index 99% rename from src/persistence/node/cms_node_storage_sql.e rename to src/modules/node/persistence/cms_node_storage_sql.e index 3228c06..9d569be 100644 --- a/src/persistence/node/cms_node_storage_sql.e +++ b/src/modules/node/persistence/cms_node_storage_sql.e @@ -17,8 +17,6 @@ inherit REFACTORING_HELPER - SHARED_LOGGER - create make diff --git a/src/persistence/node/cms_node_storage_sql_page_extension.e b/src/modules/node/persistence/cms_node_storage_sql_page_extension.e similarity index 96% rename from src/persistence/node/cms_node_storage_sql_page_extension.e rename to src/modules/node/persistence/cms_node_storage_sql_page_extension.e index 961d233..d385e64 100644 --- a/src/persistence/node/cms_node_storage_sql_page_extension.e +++ b/src/modules/node/persistence/cms_node_storage_sql_page_extension.e @@ -16,8 +16,6 @@ inherit node_storage end - SHARED_LOGGER - create make @@ -30,7 +28,7 @@ feature -- Access content_type: STRING once - Result := {CMS_PAGE_CONTENT_TYPE}.name + Result := {CMS_PAGE_NODE_TYPE}.name end feature -- Persistence @@ -73,7 +71,7 @@ feature -- Persistence local l_parameters: STRING_TABLE [ANY] n: INTEGER - ct: CMS_PAGE_CONTENT_TYPE + ct: CMS_PAGE_NODE_TYPE do error_handler.reset write_information_log (generator + ".fill_page") diff --git a/src/persistence/cms_storage_null.e b/src/persistence/cms_storage_null.e index 01b6bd2..37ada00 100644 --- a/src/persistence/cms_storage_null.e +++ b/src/persistence/cms_storage_null.e @@ -68,20 +68,6 @@ feature -- Access: user do end -feature -- User Nodes - - user_collaborator_nodes (a_id: like {CMS_USER}.id): LIST [CMS_NODE] - -- Possible list of nodes where the user identified by `a_id', is a collaborator. - do - create {ARRAYED_LIST [CMS_NODE]} Result.make (0) - end - - user_author_nodes (a_id: like {CMS_USER}.id): LIST [CMS_NODE] - -- Possible list of nodes where the user identified by `a_id', is the author. - do - create {ARRAYED_LIST [CMS_NODE]} Result.make (0) - end - feature -- Change: user new_user (a_user: CMS_USER) diff --git a/src/persistence/cms_storage_sql_i.e b/src/persistence/cms_storage_sql_i.e index f3c5a22..7e91029 100644 --- a/src/persistence/cms_storage_sql_i.e +++ b/src/persistence/cms_storage_sql_i.e @@ -6,6 +6,9 @@ note deferred class CMS_STORAGE_SQL_I +inherit + SHARED_LOGGER + feature -- Access api: detachable CMS_API diff --git a/src/service/cms_api_access.e b/src/service/cms_api_access.e new file mode 100644 index 0000000..a9c7fe7 --- /dev/null +++ b/src/service/cms_api_access.e @@ -0,0 +1,9 @@ +note + description: "Interface having access to restricted features relate to CMS APIs." + date: "$Date$" + revision: "$Revision$" + +deferred class + CMS_API_ACCESS + +end diff --git a/src/modules/cms_module.e b/src/service/cms_module.e similarity index 100% rename from src/modules/cms_module.e rename to src/service/cms_module.e diff --git a/src/service/cms_module_api.e b/src/service/cms_module_api.e index 1568758..e10c0c1 100644 --- a/src/service/cms_module_api.e +++ b/src/service/cms_module_api.e @@ -20,7 +20,7 @@ feature {NONE} -- Implementation do end -feature {CMS_MODULE, CMS_API} -- Restricted access +feature {CMS_API_ACCESS, CMS_MODULE, CMS_API} -- Restricted access cms_api: CMS_API diff --git a/src/modules/cms_module_collection.e b/src/service/cms_module_collection.e similarity index 100% rename from src/modules/cms_module_collection.e rename to src/service/cms_module_collection.e