The Embperl website basically is structured as follows: +----------------------------------------------------------+
| base.epl |
| +------------------------------------------------------+ |
| | header.epl | |
| +------------------------------------------------------+ |
| |
| +--------------+ +------------------------------------+ |
| | menuleft.epl | | content.epl | |
| | | | +-------------------+ +----------+ | |
| | | | | * | | news.epl | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
| | | | +-------------------+ +----------+ | |
| +--------------+ +------------------------------------+ |
| |
| +------------------------------------------------------+ |
| | footer.epl | |
| +------------------------------------------------------+ |
+----------------------------------------------------------+ If a web page is requested (e.g. /index.epl,
Embperl::Object first searches for the base template.
In case of the Embperl website this is
base.epl (name can be configured in the web server
configuration), which looks like this: <html>
<head>
<title>Embperl</title>
</head>
<body bgcolor="#ffffff">
[- Execute ('header.epl') -]
<table width="100%" border="0">
<tr>
<td>[- Execute ('menuleft.epl') -]</td>
<td>[- Execute ('content.epl') -]</td>
</tr>
</table>
[- Execute ('footer.htm') -]
</body>
</html> base.epl contains several calls to Execute. In our example Execute
just includes the named pages, but it is very powerful and has a
long list of possible arguments. So base.epl will include header.epl,
menuleft.epl, content.epl and finally
include footer.htm. Let take a look at content.epl. It looks like this: <table width="100%" border="0">
<tr>
<td>[- Execute('*') -]</td>
<td>[- Execute('news.epl') -]</td>
</tr>
</table> It contains again calls to Execute of which one will call
news.epl and the other one is special:
Execute('*') includes the file initially requested from
the web server, in our case /index.epl. So we have separated the layout from the content in a way, which
doesn't need any inclusion of headers, footers or menus in the files
providing the content. If we want to change the content, we just have
to modify one of the above mentioned files and the whole sites may
have changed it's layout without great effort. There is another advantage: On pages other then the home page,
we don't want to show the news column and this can be simply done
by replacing content.epl in a subdirectory. For example
under the directory /pod all the documentation is located. Now we
put there the file /pod/content.epl, which only contains: [- Execute('*') -] What's happeing now is, that when you request a file under the /pod
directory Embperl::Object uses this content.epl file and because of that,
the news comlumn will not be included. So let make an example. When you request the file /pod/doc/index.epl,
which contains a list of all the documentation
available, Embperl::Object first searches the base template (base.epl).
It does this by walking up the directory tree, starting in the directory
where the requested file is located, until it either found it or reached
the document root (or the directory configured with EMBPERL_OBJECT_STOPDIR ).
When base.epl is found, the same search is taking place for all files
that are called via Execute . This is the reason why it picks up the
/pod/content.epl in this case and header.epl etc. are still taken form the
same directory as before. So what we done here is, that we have overridden content.epl in the
sub directory pod.
|