mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-05 02:44:27 +02:00
moved location for english files
This commit is contained in:
419
docs/en/appendixes.xml
Normal file
419
docs/en/appendixes.xml
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
<part id="appendixes">
|
||||||
|
<title>Appendixes</title>
|
||||||
|
<chapter id="troubleshooting">
|
||||||
|
<title>Troubleshooting</title>
|
||||||
|
<para></para>
|
||||||
|
<sect1 id="smarty.php.errors">
|
||||||
|
<title>Smarty/PHP errors</title>
|
||||||
|
<para>
|
||||||
|
Smarty can catch many errors such as missing tag attributes
|
||||||
|
or malformed variable names. If this happens, you will see an error
|
||||||
|
similar to the following:
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>Smarty errors</title>
|
||||||
|
<screen>
|
||||||
|
<![CDATA[
|
||||||
|
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
||||||
|
in /path/to/smarty/Smarty.class.php on line 1041
|
||||||
|
|
||||||
|
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
||||||
|
in /path/to/smarty/Smarty.class.php on line 1041
|
||||||
|
]]>
|
||||||
|
</screen>
|
||||||
|
</example>
|
||||||
|
<para>
|
||||||
|
Smarty shows you the template name, the line number and the error.
|
||||||
|
After that, the error consists of the actual line number in the Smarty
|
||||||
|
class that the error occured.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There are certain errors that Smarty cannot catch, such as missing
|
||||||
|
close tags. These types of errors usually end up in PHP compile-time
|
||||||
|
parsing errors.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>PHP parsing errors</title>
|
||||||
|
<screen>
|
||||||
|
<![CDATA[
|
||||||
|
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75
|
||||||
|
]]>
|
||||||
|
</screen>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
When you encounter a PHP parsing error, the error line number will
|
||||||
|
correspond to the compiled PHP script, not the template itself. Usually
|
||||||
|
you can look at the template and spot the syntax error. Here are some
|
||||||
|
common things to look for: missing close tags for {if}{/if} or
|
||||||
|
{section}{/section}, or syntax of logic within an {if} tag. If you
|
||||||
|
can't find the error, you might have to open the compiled PHP file and
|
||||||
|
go to the line number to figure out where the corresponding error is in
|
||||||
|
the template.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="tips">
|
||||||
|
<title>Tips & Tricks</title>
|
||||||
|
<para>
|
||||||
|
</para>
|
||||||
|
<sect1 id="tips.blank.var.handling">
|
||||||
|
<title>Blank Variable Handling</title>
|
||||||
|
<para>
|
||||||
|
There may be times when you want to print a default value for an empty
|
||||||
|
variable instead of printing nothing, such as printing "&nbsp;" so that
|
||||||
|
table backgrounds work properly. Many would use an {if} statement to
|
||||||
|
handle this, but there is a shorthand way with Smarty, using the
|
||||||
|
<emphasis>default</emphasis> variable modifier.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>Printing &nbsp; when a variable is empty</title>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
{* the long way *}
|
||||||
|
|
||||||
|
{if $title eq ""}
|
||||||
|
&nbsp;
|
||||||
|
{else}
|
||||||
|
{$title}
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
|
{* the short way *}
|
||||||
|
|
||||||
|
{$title|default:"&nbsp;"}
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="tips.default.var.handling">
|
||||||
|
<title>Default Variable Handling</title>
|
||||||
|
<para>
|
||||||
|
If a variable is used frequently throughout your templates, applying
|
||||||
|
the default modifier every time it is mentioned can get a bit ugly. You
|
||||||
|
can remedy this by assigning the variable its default value with the
|
||||||
|
<link linkend="language.function.assign">assign</link> function.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>Assigning a template variable its default value</title>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
{* do this somewhere at the top of your template *}
|
||||||
|
{assign var="title" value=$title|default:"no title"}
|
||||||
|
|
||||||
|
{* if $title was empty, it now contains the value "no title" when you print it *}
|
||||||
|
{$title}
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="tips.passing.vars">
|
||||||
|
<title>Passing variable title to header template</title>
|
||||||
|
<para>
|
||||||
|
When the majority of your templates use the same headers and footers, it
|
||||||
|
is common to split those out into their own templates and include them.
|
||||||
|
But what if the header needs to have a different title, depending on
|
||||||
|
what page you are coming from? You can pass the title to the header when
|
||||||
|
it is included.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>Passing the title variable to the header template</title>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
mainpage.tpl
|
||||||
|
------------
|
||||||
|
|
||||||
|
{include file="header.tpl" title="Main Page"}
|
||||||
|
{* template body goes here *}
|
||||||
|
{include file="footer.tpl"}
|
||||||
|
|
||||||
|
|
||||||
|
archives.tpl
|
||||||
|
------------
|
||||||
|
|
||||||
|
{config_load file="archive_page.conf"}
|
||||||
|
{include file="header.tpl" title=#archivePageTitle#}
|
||||||
|
{* template body goes here *}
|
||||||
|
{include file="footer.tpl"}
|
||||||
|
|
||||||
|
|
||||||
|
header.tpl
|
||||||
|
----------
|
||||||
|
<HTML>
|
||||||
|
<HEAD>
|
||||||
|
<TITLE>{$title|default:"BC News"}</TITLE>
|
||||||
|
</HEAD>
|
||||||
|
<BODY>
|
||||||
|
|
||||||
|
|
||||||
|
footer.tpl
|
||||||
|
----------
|
||||||
|
</BODY>
|
||||||
|
</HTML>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
<para>
|
||||||
|
When the main page is drawn, the title of "Main Page" is passed to the
|
||||||
|
header.tpl, and will subsequently be used as the title. When the
|
||||||
|
archives page is drawn, the title will be "Archives". Notice in the
|
||||||
|
archive example, we are using a variable from the archives_page.conf
|
||||||
|
file instead of a hard coded variable. Also notice that "BC News" is
|
||||||
|
printed if the $title variable is not set, using the
|
||||||
|
<emphasis>default</emphasis> variable modifier.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="tips.dates">
|
||||||
|
<title>Dates</title>
|
||||||
|
<para>
|
||||||
|
As a rule of thumb, always pass dates to Smarty as timestamps. This
|
||||||
|
allows template designers to use <link
|
||||||
|
linkend="language.modifier.date.format">date_format</link> for full
|
||||||
|
control over date formatting, and also makes it easy to compare dates if
|
||||||
|
necessary.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
NOTE: As of Smarty 1.4.0, you can pass dates to Smarty as unix
|
||||||
|
timestamps, mysql timestamps, or any date parsable by strtotime().
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>using date_format</title>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
{$startDate|date_format}
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
Jan 4, 2001
|
||||||
|
|
||||||
|
|
||||||
|
{$startDate|date_format:"%Y/%m/%d"}
|
||||||
|
|
||||||
|
OUTPUT:
|
||||||
|
|
||||||
|
2001/01/04
|
||||||
|
|
||||||
|
|
||||||
|
{if $date1 < $date2}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
<para>
|
||||||
|
When using {html_select_date} in a template, The programmer will most
|
||||||
|
likely want to convert the output from the form back into timestamp
|
||||||
|
format. Here is a function to help you with that.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>converting form date elements back to a timestamp</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
// this assumes your form elements are named
|
||||||
|
// startDate_Day, startDate_Month, startDate_Year
|
||||||
|
|
||||||
|
$startDate = makeTimeStamp($startDate_Year,$startDate_Month,$startDate_Day);
|
||||||
|
|
||||||
|
function makeTimeStamp($year="",$month="",$day="")
|
||||||
|
{
|
||||||
|
if(empty($year))
|
||||||
|
$year = strftime("%Y");
|
||||||
|
if(empty($month))
|
||||||
|
$month = strftime("%m");
|
||||||
|
if(empty($day))
|
||||||
|
$day = strftime("%d");
|
||||||
|
|
||||||
|
return mktime(0,0,0,$month,$day,$year);
|
||||||
|
}
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="tips.wap">
|
||||||
|
<title>WAP/WML</title>
|
||||||
|
<para>
|
||||||
|
WAP/WML templates require a php Content-Type header to be passed along
|
||||||
|
with the template. The easist way to do this would be to write a custom
|
||||||
|
function that prints the header. If you are using caching, that won't
|
||||||
|
work so we'll do it using the insert tag (remember insert tags are not
|
||||||
|
cached!) Be sure that there is nothing output to the browser before the
|
||||||
|
template, or else the header may fail.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>using insert to write a WML Content-Type header</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// be sure apache is configure for the .wml extensions!
|
||||||
|
// put this function somewhere in your application, or in Smarty.addons.php
|
||||||
|
function insert_header($params) {
|
||||||
|
// this function expects $content argument
|
||||||
|
if(empty($params['content']))
|
||||||
|
return;
|
||||||
|
header($params['content']);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
your Smarty template <emphasis>must</emphasis> begin with the insert tag :
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
{insert name=header content="Content-Type: text/vnd.wap.wml"}
|
||||||
|
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
|
||||||
|
|
||||||
|
<!-- begin new wml deck -->
|
||||||
|
<wml>
|
||||||
|
<!-- begin first card -->
|
||||||
|
<card>
|
||||||
|
<do type="accept">
|
||||||
|
<go href="#two"/>
|
||||||
|
</do>
|
||||||
|
<p>
|
||||||
|
Welcome to WAP with Smarty!
|
||||||
|
Press OK to continue...
|
||||||
|
</p>
|
||||||
|
</card>
|
||||||
|
<!-- begin second card -->
|
||||||
|
<card id="two">
|
||||||
|
<p>
|
||||||
|
Pretty easy isn't it?
|
||||||
|
</p>
|
||||||
|
</card>
|
||||||
|
</wml>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="tips.componentized.templates">
|
||||||
|
<title>Componentized Templates</title>
|
||||||
|
<para>
|
||||||
|
Traditionally, programming templates into your applications goes as
|
||||||
|
follows: First, you accumulate your variables within your PHP
|
||||||
|
application, (maybe with database queries.) Then, you instantiate your
|
||||||
|
Smarty object, assign the variables and display the template. So lets
|
||||||
|
say for example we have a stock ticker on our template. We would
|
||||||
|
collect the stock data in our application, then assign these variables
|
||||||
|
in the template and display it. Now wouldn't it be nice if you could
|
||||||
|
add this stock ticker to any application by merely including the
|
||||||
|
template, and not worry about fetching the data up front?
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You can do this by writing a custom plugin for fetching the content and
|
||||||
|
assigning it to a template variable.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>componentized template</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// function.load_ticker.php
|
||||||
|
function smarty_function_load_ticker($params, &$smarty) {
|
||||||
|
// setup our function for fetching stock data
|
||||||
|
function fetch_ticker($params['symbol']) {
|
||||||
|
// put logic here that fetches $ticker_info
|
||||||
|
// from some resource
|
||||||
|
return $ticker_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
// call the function
|
||||||
|
$ticker_info = fetch_ticker("YHOO",$ticker_info);
|
||||||
|
|
||||||
|
// assign template variable
|
||||||
|
$smarty->assign($params['assign'],$ticker_info);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
index.tpl
|
||||||
|
---------
|
||||||
|
|
||||||
|
{* Smarty *}
|
||||||
|
|
||||||
|
{load_ticker symbol="YHOO" assign="ticker"}
|
||||||
|
|
||||||
|
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="tips.obfuscating.email">
|
||||||
|
<title>Obfuscating E-mail Addresses</title>
|
||||||
|
<para>
|
||||||
|
Do you ever wonder how your E-mail address gets on so many spam mailing
|
||||||
|
lists? One way spammers collect E-mail addresses is from web pages. To
|
||||||
|
help combat this problem, you can make your E-mail address show up in
|
||||||
|
scrambled javascript in the HTML source, yet it it will look and work
|
||||||
|
correctly in the browser. This is done with the mailto plugin.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>Example of Obfuscating an E-mail Address</title>
|
||||||
|
<programlisting>
|
||||||
|
<![CDATA[
|
||||||
|
index.tpl
|
||||||
|
---------
|
||||||
|
|
||||||
|
Send inquiries to
|
||||||
|
{mailto address=$EmailAddress encode="javascript" subject="Hello"}
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
<note>
|
||||||
|
<title>Technical Note</title>
|
||||||
|
<para>
|
||||||
|
This method isn't 100% foolproof. A spammer could conceivably program his
|
||||||
|
e-mail collector to decode these values, but not likely.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="resources">
|
||||||
|
<title>Resources</title>
|
||||||
|
<para>
|
||||||
|
Smarty's homepage is located at http://smarty.php.net/.
|
||||||
|
You can join the mailing list by sending an e-mail to
|
||||||
|
smarty-general-subscribe@lists.php.net. An archive of the mailing list can be
|
||||||
|
viewed at http://marc.theaimsgroup.com/?l=smarty&r=1&w=2
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="bugs">
|
||||||
|
<title>BUGS</title>
|
||||||
|
<para>
|
||||||
|
Check the BUGS file that comes with the latest distribution of Smarty, or
|
||||||
|
check the website.
|
||||||
|
</para>
|
||||||
|
</chapter>
|
||||||
|
</part>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-omittag:t
|
||||||
|
sgml-shorttag:t
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-always-quote-attributes:t
|
||||||
|
sgml-indent-step:1
|
||||||
|
sgml-indent-data:t
|
||||||
|
indent-tabs-mode:nil
|
||||||
|
sgml-parent-document:nil
|
||||||
|
sgml-default-dtd-file:"../../../../manual.ced"
|
||||||
|
sgml-exposed-tags:nil
|
||||||
|
sgml-local-catalogs:nil
|
||||||
|
sgml-local-ecat-files:nil
|
||||||
|
End:
|
||||||
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||||||
|
vim: et tw=78 syn=sgml
|
||||||
|
vi: ts=1 sw=1
|
||||||
|
-->
|
18
docs/en/bookinfo.xml
Executable file
18
docs/en/bookinfo.xml
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
<bookinfo id="bookinfo">
|
||||||
|
<title>Smarty - the compiling PHP template engine</title>
|
||||||
|
<authorgroup id="authors">
|
||||||
|
<author>
|
||||||
|
<firstname>Monte</firstname><surname>Ohrt <monte@ispi.net></surname>
|
||||||
|
</author>
|
||||||
|
<author>
|
||||||
|
<firstname>Andrei</firstname><surname>Zmievski <andrei@php.net></surname>
|
||||||
|
</author>
|
||||||
|
</authorgroup>
|
||||||
|
<edition>Version 2.0</edition>
|
||||||
|
<copyright>
|
||||||
|
<year>2001</year>
|
||||||
|
<year>2002</year>
|
||||||
|
<year>2003</year>
|
||||||
|
<holder>ispi of Lincoln, Inc.</holder>
|
||||||
|
</copyright>
|
||||||
|
</bookinfo>
|
6103
docs/en/designers.xml
Normal file
6103
docs/en/designers.xml
Normal file
File diff suppressed because it is too large
Load Diff
518
docs/en/getting-started.xml
Normal file
518
docs/en/getting-started.xml
Normal file
@@ -0,0 +1,518 @@
|
|||||||
|
<part id="getting.started">
|
||||||
|
<title>Getting Started</title>
|
||||||
|
|
||||||
|
<chapter id="what.is.smarty">
|
||||||
|
<title>What is Smarty?</title>
|
||||||
|
<para>
|
||||||
|
Smarty is a template engine for PHP. More specifically, it facilitates a
|
||||||
|
manageable way to separate application logic and content from its
|
||||||
|
presentation. This is best described in a situation where the application
|
||||||
|
programmer and the template designer play different roles, or in most cases
|
||||||
|
are not the same person. For example, let's say you are creating a web page
|
||||||
|
that is displaying a newspaper article. The article headline, tagline,
|
||||||
|
author and body are content elements, they contain no information about how
|
||||||
|
they will be presented. They are passed into Smarty by the application,
|
||||||
|
then the template designer edits the templates and uses a combination of
|
||||||
|
HTML tags and template tags to format the presentation of these elements
|
||||||
|
(HTML tables, background colors, font sizes, style sheets, etc.) One day
|
||||||
|
the programmer needs to change the way the article content is retrieved (a
|
||||||
|
change in application logic.) This change does not affect the template
|
||||||
|
designer, the content will still arrive in the template exactly the same.
|
||||||
|
Likewise, if the template designer wants to completely redesign the
|
||||||
|
templates, this requires no changes to the application logic. Therefore,
|
||||||
|
the programmer can make changes to the application logic without the need
|
||||||
|
to restructure templates, and the template designer can make changes to
|
||||||
|
templates without breaking application logic.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
One design goal of Smarty is the separation of business logic and
|
||||||
|
presentation logic. This means templates can certainly contain logic under
|
||||||
|
the condition that it is for presentation only. Things such as including
|
||||||
|
other templates, altering table row colors, upper-casing a variable,
|
||||||
|
looping over an array of data and displaying it, etc. are all examples of
|
||||||
|
presentation logic. This does not mean that Smarty forces a separation of
|
||||||
|
business and presentation logic. Smarty has no knowledge of which is which,
|
||||||
|
so placing business logic in the template is your own doing. Also, if you
|
||||||
|
desire NO logic in your templates you certainly can do so by boiling the
|
||||||
|
content down to text and variables only.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
One of the unique aspects about Smarty is the template compling. This means
|
||||||
|
Smarty reads the template files and creates PHP scripts from them. Once
|
||||||
|
they are created, they are executed from then on. Therefore there is no
|
||||||
|
costly template file parsing for each request, and each template can take
|
||||||
|
full advantage of PHP compiler cache solutions such as Zend Accelerator
|
||||||
|
(http://www.zend.com) or PHP Accelerator
|
||||||
|
(http://www.php-accelerator.co.uk).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Some of Smarty's features:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
It is extremely fast.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
It is efficient since the PHP parser does the dirty work.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
No template parsing overhead, only compiles once.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
It is smart about recompiling only the template files that have changed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
You can make <link linkend="language.custom.functions">custom functions</link>
|
||||||
|
and custom <link linkend="language.modifiers">variable modifiers</link>, so the
|
||||||
|
template language is extremely extensible.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Configurable template delimiter tag syntax, so you can use
|
||||||
|
{}, {{}}, <!--{}-->, etc.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The if/elseif/else/endif constructs are passed to the
|
||||||
|
PHP parser, so the {if ...} expression syntax can be as simple or as complex
|
||||||
|
as you like.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Unlimited nesting of sections, ifs, etc. allowed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
It is possible to embed PHP code right in your template files,
|
||||||
|
although this may not be needed (nor recommended)
|
||||||
|
since the engine is so customizable.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Built-in caching support
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Arbitrary template sources
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Custom cache handling functions
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Plugin architecture
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</chapter>
|
||||||
|
<chapter id="installation">
|
||||||
|
<title>Installation</title>
|
||||||
|
|
||||||
|
<sect1 id="installation.requirements">
|
||||||
|
<title>Requirements</title>
|
||||||
|
<para>
|
||||||
|
Smarty requires a web server running PHP 4.0.6 or later.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="installing.smarty.basic">
|
||||||
|
<title>Basic Installation</title>
|
||||||
|
<para>
|
||||||
|
Install the Smarty library files which are in the /libs/ directory of
|
||||||
|
the distribution. These are the PHP files that you SHOULD NOT edit. They
|
||||||
|
are shared among all applications and they only get updated when you
|
||||||
|
upgrade to a new version of Smarty.
|
||||||
|
</para>
|
||||||
|
<example>
|
||||||
|
<title>Smarty library files</title>
|
||||||
|
<screen>
|
||||||
|
<![CDATA[
|
||||||
|
Smarty.class.php
|
||||||
|
Smarty_Compiler.class.php
|
||||||
|
Config_File.class.php
|
||||||
|
debug.tpl
|
||||||
|
/core/*.php (all of them)
|
||||||
|
/plugins/*.php (all of them)
|
||||||
|
]]>
|
||||||
|
</screen>
|
||||||
|
</example>
|
||||||
|
<para>
|
||||||
|
Smarty uses a PHP constant named <link
|
||||||
|
linkend="constant.smarty.dir">SMARTY_DIR</link> which is the system
|
||||||
|
filepath Smarty library directory. Basically, if your application can find
|
||||||
|
the <emphasis>Smarty.class.php</emphasis> file, you do not need to set
|
||||||
|
SMARTY_DIR, Smarty will figure it out on its own. Therefore, if
|
||||||
|
<emphasis>Smarty.class.php</emphasis> is not in your include_path, or you
|
||||||
|
do not supply an absolute path to it in your application, then you must
|
||||||
|
define SMARTY_DIR manually. SMARTY_DIR <emphasis>must</emphasis> include a
|
||||||
|
trailing slash.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Here is how you create an instance of Smarty in your PHP scripts:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Create Smarty instance of Smarty</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
require('Smarty.class.php');
|
||||||
|
$smarty = new Smarty;
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Try running the above script. If you get an error saying the
|
||||||
|
<emphasis>Smarty.class.php</emphasis> file could not be found, you have to
|
||||||
|
do one of the following:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Supply absolute path to library file</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
require('/usr/local/lib/php/Smarty/Smarty.class.php');
|
||||||
|
$smarty = new Smarty;
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Add library directory to php_include path</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
// Edit your php.ini file, add the Smarty library
|
||||||
|
// directory to the include_path and restart web server.
|
||||||
|
// Then the following should work:
|
||||||
|
require('Smarty.class.php');
|
||||||
|
$smarty = new Smarty;
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Set SMARTY_DIR constant manually</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
define('SMARTY_DIR', '/usr/local/lib/php/Smarty/');
|
||||||
|
require(SMARTY_DIR . 'Smarty.class.php');
|
||||||
|
$smarty = new Smarty;
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Now that the library files are in place, it's time to setup the Smarty
|
||||||
|
directories for your application. Smarty requires four directories which
|
||||||
|
are (by default) named <emphasis>templates</emphasis>,
|
||||||
|
<emphasis>templates_c</emphasis>, <emphasis>configs</emphasis> and
|
||||||
|
<emphasis>cache</emphasis>. Each of these are definable by the Smarty class
|
||||||
|
properties <emphasis>$template_dir</emphasis>,
|
||||||
|
<emphasis>$compile_dir</emphasis>, <emphasis>$config_dir</emphasis>, and
|
||||||
|
<emphasis>$cache_dir</emphasis> respectively. It is highly recommended
|
||||||
|
that you setup a separate set of these directories for each application
|
||||||
|
that will use Smarty.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Be sure you know the location of your web server document root. In our
|
||||||
|
example, the document root is "/web/www.mydomain.com/docs/". The Smarty
|
||||||
|
directories are only accessed by the Smarty library and never accessed
|
||||||
|
directly by the web browser. Therefore to avoid any security concerns, it
|
||||||
|
is recommended to place these directories <emphasis>outside</emphasis> of
|
||||||
|
the document root.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
For our installation example, we will be setting up the Smarty environment
|
||||||
|
for a guest book application. We picked an application only for the purpose
|
||||||
|
of a directory naming convention. You can use the same environment for any
|
||||||
|
application, just replace "guestbook" with the name of your app. We'll
|
||||||
|
place our Smarty directories under
|
||||||
|
"/web/www.mydomain.com/smarty/guestbook/".
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You will need as least one file under your document root, and that is the
|
||||||
|
script accessed by the web browser. We will call our script "index.php",
|
||||||
|
and place it in a subdirectory under the document root called
|
||||||
|
"/guestbook/".
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Technical Note</title>
|
||||||
|
<para>
|
||||||
|
It is convenient to setup the web server so that "index.php" can be
|
||||||
|
identified as the default directory index, so if you access
|
||||||
|
"http://www.mydomain.com/guestbook/", the index.php script will be executed
|
||||||
|
without "index.php" in the URL. In Apache you can set this up by adding
|
||||||
|
"index.php" onto the end of your DirectoryIndex setting (separate each
|
||||||
|
entry with a space.)
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Lets take a look at the file structure so far:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Example file structure</title>
|
||||||
|
<screen>
|
||||||
|
<![CDATA[
|
||||||
|
/usr/local/lib/php/Smarty/Smarty.class.php
|
||||||
|
/usr/local/lib/php/Smarty/Smarty_Compiler.class.php
|
||||||
|
/usr/local/lib/php/Smarty/Config_File.class.php
|
||||||
|
/usr/local/lib/php/Smarty/debug.tpl
|
||||||
|
/usr/local/lib/php/Smarty/core/*.php
|
||||||
|
/usr/local/lib/php/Smarty/plugins/*.php
|
||||||
|
|
||||||
|
/web/www.mydomain.com/smarty/guestbook/templates/
|
||||||
|
/web/www.mydomain.com/smarty/guestbook/templates_c/
|
||||||
|
/web/www.mydomain.com/smarty/guestbook/configs/
|
||||||
|
/web/www.mydomain.com/smarty/guestbook/cache/
|
||||||
|
|
||||||
|
/web/www.mydomain.com/docs/guestbook/index.php
|
||||||
|
]]>
|
||||||
|
</screen>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Smarty will need write access to the <emphasis>$compile_dir</emphasis> and
|
||||||
|
<emphasis>$cache_dir</emphasis>, so be sure the web server user can write
|
||||||
|
to them. This is usually user "nobody" and group "nobody". For OS X users,
|
||||||
|
the default is user "www" and group "www". If you are using Apache, you can
|
||||||
|
look in your httpd.conf file (usually in "/usr/local/apache/conf/") to see
|
||||||
|
what user and group are being used.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Setting file permissions</title>
|
||||||
|
<programlisting role="shell">
|
||||||
|
<![CDATA[
|
||||||
|
chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/templates_c/
|
||||||
|
chmod 770 /web/www.mydomain.com/smarty/guestbook/templates_c/
|
||||||
|
|
||||||
|
chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/cache/
|
||||||
|
chmod 770 /web/www.mydomain.com/smarty/guestbook/cache/
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Technical Note</title>
|
||||||
|
<para>
|
||||||
|
chmod 770 will be fairly tight security, it only allows user "nobody" and
|
||||||
|
group "nobody" read/write access to the directories. If you would like to
|
||||||
|
open up read access to anyone (mostly for your own convenience of viewing
|
||||||
|
these files), you can use 775 instead.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
We need to create the index.tpl file that Smarty will load. This will be
|
||||||
|
located in your $template_dir.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Editing /web/www.mydomain.com/smarty/guestbook/templates/index.tpl</title>
|
||||||
|
<screen>
|
||||||
|
<![CDATA[
|
||||||
|
|
||||||
|
{* Smarty *}
|
||||||
|
|
||||||
|
Hello, {$name}!
|
||||||
|
]]>
|
||||||
|
</screen>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Technical Note</title>
|
||||||
|
<para>
|
||||||
|
{* Smarty *} is a template comment. It is not required, but it is good
|
||||||
|
practice to start all your template files with this comment. It makes
|
||||||
|
the file easy to recognize regardless of the file extension. For
|
||||||
|
example, text editors could recognize the file and turn on special
|
||||||
|
syntax highlighting.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Now lets edit index.php. We'll create an instance of Smarty, assign a
|
||||||
|
template variable and display the index.tpl file. In our example
|
||||||
|
environment, "/usr/local/lib/php/Smarty" is in our include_path. Be sure you
|
||||||
|
do the same, or use absolute paths.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Editing /web/www.mydomain.com/docs/guestbook/index.php</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// load Smarty library
|
||||||
|
require('Smarty.class.php');
|
||||||
|
|
||||||
|
$smarty = new Smarty;
|
||||||
|
|
||||||
|
$smarty->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
|
||||||
|
$smarty->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
|
||||||
|
$smarty->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
|
||||||
|
$smarty->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';
|
||||||
|
|
||||||
|
$smarty->assign('name','Ned');
|
||||||
|
|
||||||
|
$smarty->display('index.tpl');
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Technical Note</title>
|
||||||
|
<para>
|
||||||
|
In our example, we are setting absolute paths to all of the Smarty
|
||||||
|
directories. If '/web/www.mydomain.com/smarty/guestbook/' is within your
|
||||||
|
PHP include_path, then these settings are not necessary. However, it is
|
||||||
|
more efficient and (from experience) less error-prone to set them to
|
||||||
|
absolute paths. This ensures that Smarty is getting files from the
|
||||||
|
directories you intended.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Now load the index.php file from your web browser. You should see "Hello,
|
||||||
|
Ned!"
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You have completed the basic setup for Smarty!
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
<sect1 id="installing.smarty.extended">
|
||||||
|
<title>Extended Setup</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This is a continuation of the <link
|
||||||
|
linkend="installing.smarty.basic">basic installation</link>, please read
|
||||||
|
that first!
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
A slightly more flexible way to setup Smarty is to extend the class and
|
||||||
|
initialize your Smarty environment. So instead of repeatedly setting
|
||||||
|
directory paths, assigning the same vars, etc., we can do that in one place.
|
||||||
|
Lets create a new directory "/php/includes/guestbook/" and make a new file
|
||||||
|
called "setup.php". In our example environment, "/php/includes" is in our
|
||||||
|
include_path. Be sure you set this up too, or use absolute file paths.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Editing /php/includes/guestbook/setup.php</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// load Smarty library
|
||||||
|
require('Smarty.class.php');
|
||||||
|
|
||||||
|
// The setup.php file is a good place to load
|
||||||
|
// required application library files, and you
|
||||||
|
// can do that right here. An example:
|
||||||
|
// require('guestbook/guestbook.lib.php');
|
||||||
|
|
||||||
|
class Smarty_GuestBook extends Smarty {
|
||||||
|
|
||||||
|
function Smarty_GuestBook() {
|
||||||
|
|
||||||
|
// Class Constructor. These automatically get set with each new instance.
|
||||||
|
|
||||||
|
$this->Smarty();
|
||||||
|
|
||||||
|
$this->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
|
||||||
|
$this->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
|
||||||
|
$this->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
|
||||||
|
$this->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';
|
||||||
|
|
||||||
|
$this->caching = true;
|
||||||
|
$this->assign('app_name','Guest Book');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Now lets alter the index.php file to use setup.php:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<example>
|
||||||
|
<title>Editing /web/www.mydomain.com/docs/guestbook/index.php</title>
|
||||||
|
<programlisting role="php">
|
||||||
|
<![CDATA[
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require('guestbook/setup.php');
|
||||||
|
|
||||||
|
$smarty = new Smarty_GuestBook;
|
||||||
|
|
||||||
|
$smarty->assign('name','Ned');
|
||||||
|
|
||||||
|
$smarty->display('index.tpl');
|
||||||
|
?>
|
||||||
|
]]>
|
||||||
|
</programlisting>
|
||||||
|
</example>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Now you see it is quite simple to bring up an instance of Smarty, just use
|
||||||
|
Smarty_GuestBook which automatically initializes everything for our application.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
</part>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-omittag:t
|
||||||
|
sgml-shorttag:t
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-always-quote-attributes:t
|
||||||
|
sgml-indent-step:1
|
||||||
|
sgml-indent-data:t
|
||||||
|
indent-tabs-mode:nil
|
||||||
|
sgml-parent-document:nil
|
||||||
|
sgml-default-dtd-file:"../../../../manual.ced"
|
||||||
|
sgml-exposed-tags:nil
|
||||||
|
sgml-local-catalogs:nil
|
||||||
|
sgml-local-ecat-files:nil
|
||||||
|
End:
|
||||||
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||||||
|
vim: et tw=78 syn=sgml
|
||||||
|
vi: ts=1 sw=1
|
||||||
|
-->
|
90
docs/en/preface.xml
Normal file
90
docs/en/preface.xml
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<preface id="preface">
|
||||||
|
<title>Preface</title>
|
||||||
|
<para>
|
||||||
|
It is undoubtedly one of the most asked questions on the PHP mailing
|
||||||
|
lists: how do I make my PHP scripts independent of the layout? While
|
||||||
|
PHP is billed as "HTML embedded scripting language", after writing a
|
||||||
|
couple of projects that mixed PHP and HTML freely one comes up with the
|
||||||
|
idea that separation of form and content is a Good Thing [TM]. In
|
||||||
|
addition, in many companies the roles of layout designer and programmer
|
||||||
|
are separate. Consequently, the search for a templating solution
|
||||||
|
ensues.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In our company for example, the development of an application goes on
|
||||||
|
as follows: After the requirements docs are done, the interface
|
||||||
|
designer makes mockups of the interface and gives them to the
|
||||||
|
programmer. The programmer implements business logic in PHP and uses
|
||||||
|
interface mockups to create skeleton templates. The project is then
|
||||||
|
handed off to the HTML designer/web page layout person who brings the
|
||||||
|
templates up to their full glory. The project may go back and forth
|
||||||
|
between programming/HTML a couple of times. Thus, it's important to
|
||||||
|
have good template support because programmers don't want anything to
|
||||||
|
do with HTML and don't want HTML designers mucking around with PHP
|
||||||
|
code. Designers need support for config files, dynamic blocks and
|
||||||
|
other interface issues, but they don't want to have to deal with
|
||||||
|
intricacies of the PHP programming language.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Looking at many templating solutions available for PHP today, most of
|
||||||
|
them provide a rudimentary way of substituting variables into templates
|
||||||
|
and do a limited form of dynamic block functionality. But our needs
|
||||||
|
required a bit more than that. We didn't want programmers to be dealing
|
||||||
|
with HTML layout at ALL, but this was almost inevitable. For instance,
|
||||||
|
if a designer wanted background colors to alternate on dynamic blocks,
|
||||||
|
this had to be worked out with the programmer in advance. We also
|
||||||
|
needed designers to be able to use their own configuration files, and
|
||||||
|
pull variables from them into the templates. The list goes on.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
We started out writing out a spec for a template engine back in late
|
||||||
|
1999. After finishing the spec, we began to work on a template engine
|
||||||
|
written in C that would hopefully be accepted for inclusion with PHP.
|
||||||
|
Not only did we run into many complicated technical barriers, but there
|
||||||
|
was also much heated debate about exactly what a template engine should
|
||||||
|
and should not do. From this experience, we decided that the template
|
||||||
|
engine should be written in PHP as a class, for anyone to use as they
|
||||||
|
see fit. So we wrote an engine that did just that and
|
||||||
|
<productname>SmartTemplate</productname> came into existence (note: this
|
||||||
|
class was never submitted to the public). It was a class that did
|
||||||
|
almost everything we wanted: regular variable substitution, supported
|
||||||
|
including other templates, integration with config files, embedding PHP
|
||||||
|
code, limited 'if' statement functionality and much more robust dynamic
|
||||||
|
blocks which could be multiply nested. It did all this with regular
|
||||||
|
expressions and the code turned out to be rather, shall we say,
|
||||||
|
impenetrable. It was also noticably slow in large applications from all
|
||||||
|
the parsing and regular expression work it had to do on each
|
||||||
|
invocation. The biggest problem from a programmer's point of view was
|
||||||
|
all the necessary work in the PHP script to setup and process templates
|
||||||
|
and dynamic blocks. How do we make this easier?
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Then came the vision of what ultimately became Smarty. We know how fast
|
||||||
|
PHP code is without the overhead of template parsing. We also know how
|
||||||
|
meticulous and overbearing the PHP language may look to the average
|
||||||
|
designer, and this could be masked with a much simpler templating
|
||||||
|
syntax. So what if we combined the two strengths? Thus, Smarty was
|
||||||
|
born...
|
||||||
|
</para>
|
||||||
|
</preface>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-omittag:t
|
||||||
|
sgml-shorttag:t
|
||||||
|
sgml-minimize-attributes:nil
|
||||||
|
sgml-always-quote-attributes:t
|
||||||
|
sgml-indent-step:1
|
||||||
|
sgml-indent-data:t
|
||||||
|
indent-tabs-mode:nil
|
||||||
|
sgml-parent-document:nil
|
||||||
|
sgml-default-dtd-file:"../../../../manual.ced"
|
||||||
|
sgml-exposed-tags:nil
|
||||||
|
sgml-local-catalogs:nil
|
||||||
|
sgml-local-ecat-files:nil
|
||||||
|
End:
|
||||||
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
||||||
|
vim: et tw=78 syn=sgml
|
||||||
|
vi: ts=1 sw=1
|
||||||
|
-->
|
3264
docs/en/programmers.xml
Normal file
3264
docs/en/programmers.xml
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user