| ~~ $Id$ |
| ~~ |
| ~~ Licensed to the Apache Software Foundation (ASF) under one |
| ~~ or more contributor license agreements. See the NOTICE file |
| ~~ distributed with this work for additional information |
| ~~ regarding copyright ownership. The ASF licenses this file |
| ~~ to you under the Apache License, Version 2.0 (the |
| ~~ "License"); you may not use this file except in compliance |
| ~~ with the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, |
| ~~ software distributed under the License is distributed on an |
| ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~~ KIND, either express or implied. See the License for the |
| ~~ specific language governing permissions and limitations |
| ~~ under the License. |
| ~~ |
| ----------- |
| Nesting and Extending Definitions |
| ----------- |
| |
| Nesting Definitions |
| |
| Sometimes it is useful to have a structured page with, say, a structured body. |
| Typically, there is a main layout (for example, the "classic" layout) and the |
| body is made of certain number of sections. In this case, nesting a definition |
| (the one for the body) inside another definition (the main layout) can be |
| useful. |
| |
| * {Named subdefinitions} |
| |
| Tiles supports nesting definitions natively. One way of using nested definitions |
| is creating a named "subdefinition" and using it as an attribute. For example: |
| |
| ------------------------------------ |
| <definition name="myapp.homepage.body" template="/layouts/three_rows.jsp"> |
| <put-attribute name="one" value="/tiles/headlines.jsp" /> |
| <put-attribute name="two" value="/tiles/topics.jsp" /> |
| <put-attribute name="one" value="/tiles/comments.jsp" /> |
| </definition> |
| |
| <definition name="myapp.homepage" template="/layouts/classic.jsp"> |
| <put-attribute name="title" value="Tiles tutorial homepage" /> |
| <put-attribute name="header" value="/tiles/banner.jsp" /> |
| <put-attribute name="menu" value="/tiles/common_menu.jsp" /> |
| <put-attribute name="body" value="myapp.homepage.body" /> |
| <put-attribute name="footer" value="/tiles/credits.jsp" /> |
| </definition> |
| ------------------------------------ |
| |
| The <<<myapp.homepage.body>>> definition will be put inside the |
| <<<myapp.homepage>>>, by putting it inside its <<<body>>> attribute. You will |
| be seeing the definition one inside the other. |
| |
| * {Anonymous nested definitions} |
| |
| What you can do with named subdefinitions can be done with nested anonymous |
| definitions. The above example can be rewritten in: |
| |
| ------------------------------------ |
| <definition name="myapp.homepage.body" template="/layouts/three_rows.jsp"> |
| <put-attribute name="one" value="/tiles/headlines.jsp" /> |
| <put-attribute name="two" value="/tiles/topics.jsp" /> |
| <put-attribute name="one" value="/tiles/comments.jsp" /> |
| </definition> |
| |
| <definition name="myapp.homepage" template="/layouts/classic.jsp"> |
| <put-attribute name="title" value="Tiles tutorial homepage" /> |
| <put-attribute name="header" value="/tiles/banner.jsp" /> |
| <put-attribute name="menu" value="/tiles/common_menu.jsp" /> |
| <put-attribute name="body"> |
| <definition template="/layouts/three_rows.jsp"> |
| <put-attribute name="one" value="/tiles/headlines.jsp" /> |
| <put-attribute name="two" value="/tiles/topics.jsp" /> |
| <put-attribute name="one" value="/tiles/comments.jsp" /> |
| </definition> |
| </put-attribute> |
| <put-attribute name="footer" value="/tiles/credits.jsp" /> |
| </definition> |
| ------------------------------------ |
| |
| The anonymous definition put under the "body" attribute can be used only by |
| the surrounding definition. Moreover, you can nest a definition into a nested |
| definition, with the desired level of depth. |
| |
| * {Cascaded attributes} |
| |
| Attributes defined into a definition can be cascaded to be available to all |
| nested definitions and templates. For example the |
| {{{./nesting-extending.html#Named_subdefinitions}sample definition}} detailed above can be rewritten |
| this way: |
| |
| ------------------------------------ |
| <definition name="myapp.homepage" template="/layouts/classic.jsp"> |
| <put-attribute name="title" value="Tiles tutorial homepage" /> |
| <put-attribute name="header" value="/tiles/banner.jsp" /> |
| <put-attribute name="menu" value="/tiles/common_menu.jsp" /> |
| <put-attribute name="body" value="/layouts/three_rows.jsp" /> |
| <put-attribute name="footer" value="/tiles/credits.jsp" /> |
| |
| <put-attribute name="one" value="/tiles/headlines.jsp" cascade="true" /> |
| <put-attribute name="two" value="/tiles/topics.jsp" cascade="true" /> |
| <put-attribute name="one" value="/tiles/comments.jsp" cascade="true" /> |
| </definition> |
| ------------------------------------ |
| |
| The template of <<<myapp.homepage.body>>> definitionhas been used as the |
| <<<body>>> attribute in the <<<myapp.homepage>>> definition. All of the |
| attributes of <<<myapp.homepage.body>>> has been then moved as attributes |
| of <<<myapp.homepage>>> definition, but with the addition of the "cascade" |
| flag. |
| |
| Extending Definitions |
| |
| You can extend definitions like a Java class. The concepts of <abstract |
| definition>, <extension> and <override> are available. |
| |
| * <<Abstract definition>>: it is a definition in which the template attributes |
| are not completely filled. They are useful to create a base page and a number |
| of extending definitions, reusing already created layout. For example: |
| |
| ------------------------------------ |
| <definition name="myapp.page.common" template="/layouts/classic.jsp"> |
| <put-attribute name="header" value="/tiles/banner.jsp" /> |
| <put-attribute name="menu" value="/tiles/common_menu.jsp" /> |
| <put-attribute name="footer" value="/tiles/credits.jsp" /> |
| </definition> |
| ------------------------------------ |
| |
| * <<Definition extension>>: a definition can inherit from another definition, |
| to reuse an already made (abstract or not) definition: |
| |
| ------------------------------------ |
| <definition name="myapp.homepage" extends="myapp.page.common"> |
| <put-attribute name="title" value="Tiles tutorial homepage" /> |
| <put-attribute name="body" value="myapp.homepage.body" /> |
| </definition> |
| ------------------------------------ |
| |
| In this case, the <<<header>>>, <<<menu>>> and <<<footer>>> are inherited from |
| the <<<myapp.page.common>>> definition, while the rest is defined inside the |
| "concrete" definition. |
| |
| * <<Template and attribute override>>: when extending a definition, its |
| template and attributes can be overridden. |
| |
| ** Overriding a template: |
| |
| ------------------------------------ |
| <definition name="myapp.homepage.alternate" extends="myapp.homepage" |
| template="/layouts/alternate.jsp" /> |
| ------------------------------------ |
| |
| The definition has the same attributes, but its template changed. The result |
| is that the content is the same, but the layout is different. |
| |
| ** Overriding attributes: |
| |
| ------------------------------------ |
| <definition name="myapp.homepage.customer" extends="myapp.homepage"> |
| <put-attribute name="menu" value="/tiles/common_menu_for_customers.jsp" /> |
| </definition> |
| ------------------------------------ |
| |
| In this case, the page will have the same appearance as the |
| <<<myapp.homepage>>> definition, but its menu subpage is different. |