From 05472abdd78f216a8299248df6df5ea3d7c7308f Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Fri, 16 Oct 2015 17:22:22 +0200 Subject: [PATCH] Improved block condition "path:..." by allowing wildchar. Added weight data to CMS_BLOCK to be able to sort the block lists, and thus order the display of blocks. Set negative weight for various core block, so that they appear first as expected. The weight can be set and overwritten in cms.ini , by pref blocks.{block_id}.weight=integer_weight. --- cms-safe.ecf | 7 ++-- cms.ecf | 5 ++- .../cms_block_expression_condition.e | 14 ++++++- src/kernel/content/cms_block.e | 23 ++++++++++++ src/kernel/content/cms_block_region.e | 10 +++++ .../content/cms_smarty_template_block.e | 3 ++ src/service/response/cms_response.e | 37 ++++++++++++++++++- 7 files changed, 91 insertions(+), 8 deletions(-) diff --git a/cms-safe.ecf b/cms-safe.ecf index 2562261..0ddd5a4 100644 --- a/cms-safe.ecf +++ b/cms-safe.ecf @@ -1,5 +1,5 @@ - + @@ -14,14 +14,16 @@ - + + + @@ -30,7 +32,6 @@ - diff --git a/cms.ecf b/cms.ecf index 2c92e6d..efd3245 100644 --- a/cms.ecf +++ b/cms.ecf @@ -15,14 +15,16 @@ - + + + @@ -31,7 +33,6 @@ - diff --git a/src/kernel/content/block/condition/cms_block_expression_condition.e b/src/kernel/content/block/condition/cms_block_expression_condition.e index 531fef1..0691f84 100644 --- a/src/kernel/content/block/condition/cms_block_expression_condition.e +++ b/src/kernel/content/block/condition/cms_block_expression_condition.e @@ -41,6 +41,8 @@ feature -- Evaluation satisfied_for_response (res: CMS_RESPONSE): BOOLEAN local exp: like expression + l_path: READABLE_STRING_8 + kmp: KMP_WILD do exp := expression if exp.same_string ("is_front") then @@ -50,7 +52,17 @@ feature -- Evaluation elseif exp.same_string ("") then Result := False elseif exp.starts_with ("path:") then - Result := res.location.same_string (exp.substring (6, exp.count)) + l_path := exp.substring (6, exp.count) + if l_path.has ('*') then + if l_path.index_of ('*', 1) = l_path.count then + Result := res.location.starts_with_general (l_path.substring (1, l_path.count - 1)) + else + create kmp.make (l_path, res.location) + Result := kmp.pattern_matches + end + else + Result := res.location.same_string (l_path) + end end end diff --git a/src/kernel/content/cms_block.e b/src/kernel/content/cms_block.e index e629b93..544da41 100644 --- a/src/kernel/content/cms_block.e +++ b/src/kernel/content/cms_block.e @@ -6,7 +6,12 @@ deferred class CMS_BLOCK inherit + COMPARABLE + DEBUG_OUTPUT + undefine + is_equal + end feature -- Access @@ -23,6 +28,10 @@ feature -- Access html_options: detachable CMS_HTML_OPTIONS -- Optional addition html options. + weight: INTEGER + -- Weight used to order blocks. + -- Default: 0; + feature -- Status report is_empty: BOOLEAN @@ -42,6 +51,14 @@ feature -- Status report conditions: detachable LIST [CMS_BLOCK_CONDITION] -- Optional block condition to be enabled. +feature -- Comparison + + is_less alias "<" (other: like Current): BOOLEAN + -- . + do + Result := weight < other.weight + end + feature -- Element change add_css_class (a_class: READABLE_STRING_8) @@ -83,6 +100,12 @@ feature -- Element change l_conditions.force (a_condition) end + set_weight (w: like weight) + -- Set `weight' to `w'. + do + weight := w + end + feature -- Conversion to_html (a_theme: CMS_THEME): STRING_8 diff --git a/src/kernel/content/cms_block_region.e b/src/kernel/content/cms_block_region.e index 750ebd6..b5b7929 100644 --- a/src/kernel/content/cms_block_region.e +++ b/src/kernel/content/cms_block_region.e @@ -41,6 +41,16 @@ feature -- Element change blocks.prune_all (b) end +feature -- Sort + + sort + local + cmp: QUICK_SORTER [CMS_BLOCK] + do + create cmp.make (create {COMPARABLE_COMPARATOR [CMS_BLOCK]}) + cmp.sort (blocks) + end + note copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/src/kernel/content/cms_smarty_template_block.e b/src/kernel/content/cms_smarty_template_block.e index bdb76b3..bfff2ab 100644 --- a/src/kernel/content/cms_smarty_template_block.e +++ b/src/kernel/content/cms_smarty_template_block.e @@ -15,9 +15,12 @@ inherit select out end + SHARED_TEMPLATE_CONTEXT rename out as tpl_out + undefine + is_equal end create diff --git a/src/service/response/cms_response.e b/src/service/response/cms_response.e index 1d22c8f..6adc338 100644 --- a/src/service/response/cms_response.e +++ b/src/service/response/cms_response.e @@ -423,7 +423,18 @@ feature -- Blocks initialization Result := setup.text_item_or_default ("blocks." + a_block_id + ".region", a_default_region) end -feature -- Block management +feature -- Block management + + update_block (a_block: CMS_BLOCK) + -- Update parameters for block `a_block' according to configuration. + do + if + attached setup.text_item ("blocks." + a_block.name + ".weight") as w and then + w.is_integer + then + a_block.set_weight (w.to_integer) + end + end block_conditions (a_block_id: READABLE_STRING_8): detachable ARRAYED_LIST [CMS_BLOCK_EXPRESSION_CONDITION] -- Condition associated with `a_block_id' in configuration, if any. @@ -567,6 +578,9 @@ feature -- Blocks end get_blocks + -- Get block from CMS core, and from modules. + local + l_region: CMS_BLOCK_REGION do debug ("refactor_fixme") fixme ("find a way to have this in configuration or database, and allow different order") @@ -592,6 +606,19 @@ feature -- Blocks end hooks.invoke_block (Current) + + across + regions as reg_ic + loop + l_region := reg_ic.item + across + l_region.blocks as ic + loop + update_block (ic.item) + end + l_region.sort + end + debug ("cms") put_block (create {CMS_CONTENT_BLOCK}.make ("made_with", Void, "Made with EWF", Void), "footer", True) end @@ -641,6 +668,7 @@ feature -- Blocks do create s.make_empty create Result.make ("page_top", Void, s, Void) + Result.set_weight (-5) Result.set_is_raw (True) end @@ -652,6 +680,7 @@ feature -- Blocks create s.make_from_string (theme.menu_html (primary_menu, True, Void)) create l_hb.make_empty create Result.make ("header", Void, l_hb, Void) + Result.set_weight (-4) Result.set_is_raw (True) end @@ -683,6 +712,7 @@ feature -- Blocks if attached message as m and then not m.is_empty then create Result.make ("message", Void, "
" + m + "
", Void) Result.set_is_raw (True) + Result.set_weight (-2) end end @@ -699,6 +729,7 @@ feature -- Blocks end end create Result.make ("content", Void, s, Void) + Result.set_weight (-1) Result.set_is_raw (True) end @@ -922,8 +953,10 @@ feature -- Generation across regions as reg_ic loop + l_region := reg_ic.item + -- region blocks Already sorted. across - reg_ic.item.blocks as ic + l_region.blocks as ic loop if attached {CMS_SMARTY_TEMPLATE_BLOCK} ic.item as l_tpl_block then -- Apply page variables to smarty block.