additional config pages do not need changes to the cgi code anymore

increased textarea size in textfile_edit
changed author field of html header
splitted config_filter to config_posting and config_processing
This commit is contained in:
lars 2005-12-23 18:10:08 +00:00
parent 1f5946bb1d
commit fa7bd2c6c7
13 changed files with 119 additions and 91 deletions

View file

@ -1,3 +1,5 @@
"cancel" button during text editing
restore user input after failed list_create (especially options)
support for:
@ -8,3 +10,5 @@ split filter and manipulate
allow dynamic addition of user-made config templates (seperate directory, ...)
language switch support
choose basic/expert to disable questions

View file

@ -40,12 +40,19 @@ font.feature {
#nav_bar ul {
color: #af8060;
margin: 0;
padding-left: 10px;
padding-left: 15px;
list-style: none;
}
#nav_bar li {
#nav_bar ul li {
margin-top: 0;
/* small space between highest level entries */
margin-bottom: 5px;
}
#nav_bar ul li ul li {
/* no space between lower level entries */
margin-bottom: 0;
}
#nav_bar li a.nav_active {

View file

@ -200,26 +200,11 @@ elsif ($action eq '' || $action eq 'list_select') {
}
} elsif (($action eq 'config_ask') || ($action eq 'config_do')) {
# User wants to see/change the configuration ...
if (defined($q->param('list'))) {
my $subset = $q->param('config_subset');
if (defined($q->param('list')) && ($subset ne '')
&& ($subset =~ /^[\w]*$/) && (-e "$TEMPLATE_DIR/config_$subset" . ".cs")) {
$success = 'UpdateConfig' if (($action eq 'config_do') && &update_config());
if ($q->param('config_subset') eq 'subscription') {
$pagename = 'config_subscription';
} elsif ($q->param('config_subset') eq 'posting') {
$pagename = 'config_posting';
} elsif ($q->param('config_subset') eq 'archive') {
$pagename = 'config_archive';
} elsif ($q->param('config_subset') eq 'admin') {
$pagename = 'config_admin';
} elsif ($q->param('config_subset') eq 'filter') {
$pagename = 'config_filter';
} elsif ($q->param('config_subset') eq 'main') {
$pagename = 'config_main';
} elsif (defined($q->param('part'))) {
$pagename = 'subscribers';
} else {
$error = 'ParameterMissing';
$pagename = 'list_select';
}
$pagename = 'config_' . $subset;
} else {
$error = 'ParameterMissing';
$pagename = 'list_select';

View file

@ -5,8 +5,8 @@ LanguageName = Deutsch
Lang {
Menue {
Create = Neue Liste anlegen
Delete = Liste löschen
ListCreate = Neue Liste anlegen
ListDelete = Liste löschen
Subscribers = AbonnentInnen
AllowList = Zulassungsliste
DenyList = Ablehnungsliste
@ -15,9 +15,9 @@ Lang {
ConfigMain = Einstellungen
ConfigSub = Einschreibung
ConfigPost = Einsendung
ConfigAdmin = Fern-Administration
ConfigAdmin = Administration
ConfigArchive = Archivierung
ConfigFilter = Filterung
ConfigProcess = Verarbeitung
TextFiles = Texte
ListSelect = Auswahl einer Liste
Properties = Eigenschaften von
@ -31,7 +31,7 @@ Lang {
ConfigPosting = Einsendungsregeln
ConfigAdmin = Fern-Administration der Liste
ConfigArchive = Archivierung der Liste
ConfigFilter = Nachrichtenfilterung
ConfigProcess = Nachrichtenverarbeitung
SubscriberList = AbonnentInnen der Liste
AllowList = Zugelassene Nutzer
DenyList = Abzuweisende Nutzer
@ -39,9 +39,9 @@ Lang {
ModList = ModeratorInnen der Liste
ListCreate = Anlegen einer neuen Liste
ListSelect = Auswählen einer Liste
ListDelete = Löschung von
FileSelect = Auswählen eines Textbausteins
FileEdit = Bearbeitung des Textbausteins
ConfirmDelete = Bestätige die Löschung von
}
@ -105,7 +105,7 @@ Lang {
a = Archiviere Mailinglisten-Mails
b = Nur Moderatoren dürfen auf das Archiv zugreifen
d = Aktiviere die Zusammenfassungsliste
f = Füge einen Vorspann zum Betreff der ausgehenden Mails hinzu
f = Füge ein Präfix zum Betreff der ausgehenden Mails hinzu
g = Verweigere unbekannten NutzerInnen den Zugriff auf das Archiv
h = Bei der Einschreibung in die Liste ist keine Bestätigungsmail erforderlich
i = Indiziere die Nachrichten zur Veröffentlichung im Internet (z.B. mit ezmlm-www)
@ -122,19 +122,19 @@ Lang {
t = Hänge eine Signatur an jede versandte Nachricht
u = Einsendungen von AbonnentInnen werden immer akzeptiert (dies gilt auch für moderierte Listen)
w = Entferne den Aufruf von ezmlm-warn aus den Verarbeitungsregeln (für sehr spezielle Konfigurationen)
x = Prüfe die Mime-Typen der Bestandteile eingehender Nachrichten
x = Prüfe die MIME-Typen der Anhänge eingehender Nachrichten
y = Fordere eine Bestätigung für jede eingesandte Nachricht an
}
Settings {
0 = Diese Liste is nur eine Unterliste
3 = Definiere eine andere Absender-Adresse ausgehender Mails
3 = Definiere die Absender-Adresse ausgehender Mails
4 = Eigene Einstellungen zum Versand von Zusammenfassungsmails (ezmlm-tstdig)
5 = Lege die Mailadresse des Verantwortlichen für diese Liste fest
6 = Verwende eine SQL-Datenbank
7 = Die Datenbank der Nachrichten-ModeratorInnen befindet sich in einem alternativen Verzeichnis
8 = Die Datenbank der Einschreibe--ModeratorInnen (und Fern-AdministratorInnen) befindet sich in einem alternativen Verzeichnis
8 = Die Datenbank der Einschreibe-ModeratorInnen (und Fern-AdministratorInnen) befindet sich in einem alternativen Verzeichnis
# 9 => not used - it is only an alternative to (8)
}
@ -151,7 +151,7 @@ Lang {
HeaderRemove = zu entfernende Kopfzeilen
HeaderAdd = hinzuzufügende Kopfzeilen
MimeRemove = Nachrichtenbestandteile dieses Typs werden entfernt
MimeReject = Nachrichten, die diese Datentype beinhalten, werden abgewiesen
MimeReject = Nachrichten, die einen der folgenden Datentypen enthalten, werden abgewiesen
EditFileInfo {
CommonTags = allgemeine Platzhalter
ListNameLocal = der lokale Teil (vor dem "@") der Listenadresse
@ -174,16 +174,18 @@ Lang {
SuggestDefaultPath = Es wird empfohlen, das Standard-Verzeichnis zu verwenden. Andernfalls kannst du die ModeratorInnen-Liste nicht mit ezmlm-web verwalten.
FooterText = eine Web-Oberfläche für
NoListsAvailable = Es sind keine passenden Listen vorhanden.
ConfirmDelete = Willst du wirklich diese Liste vollständig löschen?
}
Introduction {
ConfigAdmin = Fern-AdministratorInnen sind (per Voreinstellung) auch ModeratorInnen für die Einschreibung und für eingesandte Mails. Sie können berechtigt sein, per Mail Nutzer ein- und auszutragen, sowie Textbausteine zu verändern.
ConfigArchive = Das Mailinglisten-Archiv ist per Mail verfügbar. Außerdem benötigst du ein Archiv, falls du vergangene Mails im Internet zur Verfügung stellen möchtest (z.B. mit ezmlm-www).
ConfigFilter = Die Rubrik Filterung und Verarbeitung gestattet dir, viele Aspekte ausgehender Mails an deine Bedürfnisse anzupassen. Beipielsweise den Betreff, Kopfzeilen, eine Signatur sowie eine Filterung nach der Größe der Mail oder nach enthaltenen Datentypen.
ConfigProcess = Die folgenden Regeln werden auf alle Mails angewandt, bevor sie an die AbonnentInnen verteilt werden.
ConfigMain = Die allgemeinen Eigenschaften bestimmen einige wichtige Verhaltensweisen der Mailingliste.
ConfigPosting = Die Einsende-Konfiguration bestimmt, wer Nachrichten einsenden darf und wie diese Mails verarbeitet werden sollen.
ConfigSub = Hier kannst du festlegen, wer sich als Abonnent selbständig eintragen darf und wie der Einschreibungsprozess abläuft.
ListDelete = Die Mailingliste und alle damit verbundenen Daten werden hiermit vollständig entfernt.
AllowList = An die Adressen der Zulassungsliste werden keine Mails verschickt. Einsendungen durch diese Adressen werden so behandelt, als kämen sie von AbonnentInnen. Üblicherweise werden Aliase von AbonnentInnen in die Zulassungsliste eingetragen.
DenyList = Falls du Mails von bestimmte Mailadressen verweigern möchtest, dann füge sie einfach zur (aktivierten) Ablehnungsliste hinzu Dies kann nützlich sein, um unbeliebte Nutzer auszuschließen oder um störende Abwesenheitsbenachrichtigungen zu verhindern.
DigestList = Einige AbonnentInnen deiner Mailingliste sind möglicherweise nicht an jeder einzelnen Nachricht interessiert, sondern ziehen es vor, stattdessen regelmäßig automatisch erstellte Zusammenfassungen zu erhalten.
@ -199,8 +201,9 @@ Lang {
ConfigPosting = Einsende-Regeln
ConfigSub = Einschreibungsdetails
ConfigMain = Allgemeine Listen-Einstellungen
ConfigFilter = Filterungs- und Anpassungsregeln
ConfigProcess = Verarbeitungsregeln
ListCreate = Eigenschaften der neuen Liste
ListDelete = Löschung der Mailingliste
RelevantOptions = Relevante Optionen
MembersList = AbonnentInnen-Verwaltung
MembersAllow = Verwaltung der zulässigen Adressen

View file

@ -5,8 +5,8 @@ LanguageName = English
Lang {
Menue {
Create = Create new list
Delete = Delete list
ListCreate = Create new list
ListDelete = Delete list
Subscribers = Subscribers
AllowList = allow list
DenyList = deny list
@ -17,11 +17,10 @@ Lang {
ConfigPost = posting
ConfigAdmin = administration
ConfigArchive = archive
ConfigFilter = filtering
ConfigProcess = processing
TextFiles = Text files
ListSelect = Choose a list
Properties = Properties of
ConfirmDelete = Confirm deletion of
Help = Help (external)
}
@ -32,7 +31,7 @@ Lang {
ConfigPosting = Posting options
ConfigAdmin = Remote administration
ConfigArchive = Archive options
ConfigFilter = Message filtering
ConfigProcess = Message processing
SubscriberList = Subscribers of the list
AllowList = Allowed users
DenyList = Blocked users
@ -40,6 +39,7 @@ Lang {
ModList = Moderators of the mailinglist
ListCreate = Create a new list
ListSelect = Choose a list
ListDelete = Delete list
FileSelect = Choose a file for editing
FileEdit = Editing file
}
@ -175,16 +175,18 @@ Lang {
SuggestDefaultPath = It is recommended to use the default path for the moderation database. Otherwise you cannot manage the moderators' list with ezmlm-web.
FooterText = a web interface for
NoListsAvailable = I could not find any accessible list for you.
ConfirmDelete = Do you really want to remove this list completely?
}
Introduction {
ConfigAdmin = Remote administrators are (by default) also moderators for subscription and for posting. They may have the permission to (un)subscribe users and to change the text files of the list by sending emails to the mailing list software.
ConfigArchive = The mailing list archive can be accessed by mail. Additionally you will want to create a list archive, if you plan to publish it (e.g. with ezmlm-www).
ConfigFilter = Filtering allows you to add or remove mail headers, to prefix the subject, to add a trailer to every message and to block mails according to their size or attached filetypes.
ConfigProcess = Modify some message properties, before they are distributed to the subscribers.
ConfigMain = The basic properties of a list define some important settings (e.g. mail address) and the general behaviour (public or closed).
ConfigPosting = The posting configuration determines, who is allowed to send messages to the list and how these mails will be processed.
ConfigSub = Here you may define, who is allowed to subscribe to the list and you can set some details of the subscription process.
ListDelete = This mailinglist and everything inside of it will be removed completely.
AllowList = Members of the allow list will not receive outgoing mails, but they have the same rights, as normal subscribers. Usually the allow list will contain mail aliases of subscribers.
DenyList = If you want to prevent specific mail addresses from using this list (subscription, posting, ...), then you should add them to the deny list and activate it. This can be useful for annoying people and even for notorious vacation reply users. But since it is fairly easy to fake an mail address, this will not really improve security.
DigestList = Some users of your mailing list may prefer to receive a regular digest instead of all mailing list messages. They will usually not take part in discussions, but aret somehow interested anyway.
@ -200,8 +202,9 @@ Lang {
ConfigPosting = Posting rules
ConfigSub = Subscription details
ConfigMain = General list configuration
ConfigFilter = Filtering and manipulation rules
ConfigProcess = Processing rules
ListCreate = Properties of the new list
ListDelete = Remove this mailinglist
RelevantOptions = Useful settings
MembersList = Manage subscribers
MembersAllow = Manage allowed users

View file

@ -14,10 +14,12 @@
<ul>
<li><?cs call:checkbox("r") ?></li>
<li><?cs call:checkbox("r") ?>
<ul>
<li><?cs call:checkbox("l") ?></li>
<li><?cs call:checkbox("n") ?></li>
<li><?cs call:setting("8") ?></li>
</ul></li>
<li><!-- include default form values -->
<?cs include:TemplateDir + '/form_common.cs' ?>

View file

@ -14,10 +14,20 @@
<ul>
<li><?cs call:checkbox("a") ?></li>
<!-- archive messages -->
<li><?cs call:checkbox("a") ?>
<ul>
<!-- subscripiton and archive are public -->
<li><?cs call:checkbox("p") ?></li>
<!-- only moderators may access the archive -->
<li><?cs call:checkbox("b") ?></li>
<!-- block unknown users from archive -->
<li><?cs call:checkbox("g") ?></li>
</ul></li>
<!-- remove 'no-archive' header -->
<li><?cs call:checkbox("i") ?></li>
<li><!-- include default form values -->

View file

@ -33,6 +33,34 @@
<li><?cs call:setting("7") ?></li>
</ul></li>
<!-- message size limit -->
<li><input type="checkbox" name="msgsize_max_state"
value="selected" id="msgsize_max_state" <?cs
if:Data.List.MsgSize.Max>0 ?>checked="checked"<?cs /if ?>>
<label for="msgsize_max_state"><?cs var:html_escape(Lang.Misc.MessageSize.Max) ?></label>
<ul><li><input type="text" name="msgsize_max_value" size="10"
style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Max ?>30000<?cs /alt ?>"> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<li><input type="checkbox" name="msgsize_min_state"
value="selected" id="msgsize_min_state" <?cs
if:Data.List.MsgSize.Min>0 ?>checked="checked"<?cs /if ?>>
<label for="msgsize_min_state"><?cs var:html_escape(Lang.Misc.MessageSize.Min) ?></label>
<ul><li><input type="text" name="msgsize_min_value" size="10"
style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Min ?>2<?cs /alt ?>"> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<!-- mimeremove and mimereject -->
<li><?cs call:checkbox("x") ?>
<?cs if:(Data.List.Options.x == 1) ?><ul>
<!-- turn off mimermove, if "-x" is not activated, as it will be
removed during the next config_update -->
<li><?cs var:html_escape(Lang.Misc.MimeReject) ?>:<br/>
<textarea name="mimereject" rows="4" cols="70"><?cs
var:html_escape(Data.List.MimeReject) ?></textarea></li>
</ul></li><?cs /if ?>
<li><!-- include default form values -->
<?cs include:TemplateDir + '/form_common.cs' ?>

View file

@ -1,16 +1,16 @@
<div class="title">
<h1><?cs var:html_escape(Lang.Title.ConfigFilter) ?></h1>
<h1><?cs var:html_escape(Lang.Title.ConfigProcess) ?></h1>
</div>
<div class="introduction">
<p><?cs var:html_escape(Lang.Introduction.ConfigFilter) ?></p>
<p><?cs var:html_escape(Lang.Introduction.ConfigProcess) ?></p>
</div>
<fieldset class="form">
<legend><?cs var:html_escape(Lang.Legend.ConfigFilter) ?> </legend>
<legend><?cs var:html_escape(Lang.Legend.ConfigProcess) ?> </legend>
<form method="post" action="<?cs var:ScriptName ?>" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="config_subset" value="filter" />
<input type="hidden" name="config_subset" value="processing" />
<ul>
@ -40,29 +40,8 @@
<li><?cs var:html_escape(Lang.Misc.MimeRemove) ?>:<br/>
<textarea name="mimeremove" rows="4" cols="70"><?cs
var:html_escape(Data.List.MimeRemove) ?></textarea></li>
<li><?cs var:html_escape(Lang.Misc.MimeReject) ?>:<br/>
<textarea name="mimereject" rows="4" cols="70"><?cs
var:html_escape(Data.List.MimeReject) ?></textarea></li>
</ul></li><?cs /if ?>
<!-- message size limit -->
<li><input type="checkbox" name="msgsize_max_state"
value="selected" id="msgsize_max_state" <?cs
if:Data.List.MsgSize.Max>0 ?>checked="checked"<?cs /if ?>>
<label for="msgsize_max_state"><?cs var:html_escape(Lang.Misc.MessageSize.Max) ?></label>
<ul><li><input type="text" name="msgsize_max_value" size="10"
style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Max ?>30000<?cs /alt ?>"> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<li><input type="checkbox" name="msgsize_min_state"
value="selected" id="msgsize_min_state" <?cs
if:Data.List.MsgSize.Min>0 ?>checked="checked"<?cs /if ?>>
<label for="msgsize_min_state"><?cs var:html_escape(Lang.Misc.MessageSize.Min) ?></label>
<ul><li><input type="text" name="msgsize_min_value" size="10"
style="text-align:right" value="<?cs
alt:Data.List.MsgSize.Min ?>2<?cs /alt ?>"> <?cs
var:html_escape(Lang.Misc.MessageSize.Unit) ?></li></ul></li>
<!-- headerremove -->
<li><?cs var:html_escape(Lang.Misc.HeaderRemove) ?>:<br/>
<ul><li><textarea name="headerremove" rows="5" cols="70"><?cs

View file

@ -10,7 +10,7 @@
<meta http-equiv="cache-control" content="no-cache" /> <!-- for proxys -->
<meta http-equiv="content-language" content="<?cs var:html_escape(Language) ?>" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Author" content="guy-ezmlm[at]rucus.ru.ac.za" />
<meta http-equiv="Author" content="devel[at]sumpfralle.de" />
<meta http-equiv="expire" content="-1d" />
<link rel="stylesheet" type="text/css" href="<?cs var:Stylesheet ?>" />
</head>

View file

@ -1,14 +1,20 @@
<div class="title">
<h1><?cs var:html_escape(Lang.Title.ConfirmDelete) ?> <i><?cs var:html_escape(Data.List.Name) ?></i></h1>
<h1><?cs var:html_escape(Lang.Title.ListDelete) ?> &quot;<?cs var:html_escape(Data.List.Name) ?>&quot;</h1>
</div>
<form method="post" action="<?cs var:ScriptName ?>" enctype="application/x-www-form-urlencoded">
<div class="introduction">
<p><?cs var:html_escape(Lang.Introduction.ListDelete) ?></p>
</div>
<fieldset class="form">
<legend><?cs var:html_escape(Lang.Legend.ListDelete) ?> </legend>
<p><?cs var:Lang.Misc.ConfirmDelete ?></p>
<form method="post" action="<?cs var:ScriptName ?>" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="list" value="<?cs var:Data.List.Name ?>" />
<?cs if:Data.List.PartType ?>
<input type="hidden" name="part" value="<?cs var:Data.List.PartType ?>" />
<?cs /if?>
<input type="hidden" name="action" value="list_delete_do" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.ConfirmDeletion) ?></button>
</form>
</form>
</fieldset>

View file

@ -11,7 +11,7 @@
<?cs if:Data.Permissions.Create ?>
<li><a <?cs if:(Data.Action == "list_create") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?action=list_create_ask"
title="<?cs var:html_escape(Lang.Menue.Create) ?>"><?cs var:html_escape(Lang.Menue.Create) ?></a>
title="<?cs var:html_escape(Lang.Menue.ListCreate) ?>"><?cs var:html_escape(Lang.Menue.ListCreate) ?></a>
</li>
<?cs /if ?>
@ -44,8 +44,8 @@
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=subscription" title="<?cs var:html_escape(Lang.Menue.ConfigSub) ?>"><?cs var:html_escape(Lang.Menue.ConfigSub) ?></a></li>
<li><a <?cs if:(Data.Action == "config_posting") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=posting" title="<?cs var:html_escape(Lang.Menue.ConfigPost) ?>"><?cs var:html_escape(Lang.Menue.ConfigPost) ?></a></li>
<li><a <?cs if:(Data.Action == "config_filter") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=filter" title="<?cs var:html_escape(Lang.Menue.ConfigFilter) ?>"><?cs var:html_escape(Lang.Menue.ConfigFilter) ?></a></li>
<li><a <?cs if:(Data.Action == "config_processing") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=processing" title="<?cs var:html_escape(Lang.Menue.ConfigProcess) ?>"><?cs var:html_escape(Lang.Menue.ConfigProcess) ?></a></li>
<li><a <?cs if:(Data.Action == "config_archive") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=config_ask&amp;config_subset=archive" title="<?cs var:html_escape(Lang.Menue.ConfigArchive) ?>"><?cs var:html_escape(Lang.Menue.ConfigArchive) ?></a></li>
<li><a <?cs if:(Data.Action == "config_admin") ?> class="nav_active"<?cs /if ?>
@ -56,7 +56,7 @@
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=textfiles" title="<?cs var:html_escape(Lang.Menue.TextFiles) ?>"><?cs var:html_escape(Lang.Menue.TextFiles) ?></a></li>
<li><a <?cs if:(Data.Action == "list_delete") ?> class="nav_active"<?cs /if ?>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=list_delete_ask" title="<?cs var:html_escape(Lang.Menue.Delete) ?>"><?cs var:html_escape(Lang.Menue.Delete) ?></a></li>
href="<?cs var:ScriptName ?>?list=<?cs var:url_escape(Data.List.Name) ?>&amp;action=list_delete_ask" title="<?cs var:html_escape(Lang.Menue.ListDelete) ?>"><?cs var:html_escape(Lang.Menue.ListDelete) ?></a></li>
</ul></li>

View file

@ -13,12 +13,13 @@
<input type="hidden" name="list" value="<?cs var:Data.List.Name ?>">
<input type="hidden" name="file" value="<?cs var:Data.List.File.Name ?>">
<p><textarea name="content" rows="7"
<p><textarea name="content" rows="13"
cols="72"><?cs var:Data.List.File.Content ?></textarea></p>
<input type="hidden" name="action" value="textfile_save" />
<button type="submit" name="send" value="do"><?cs var:html_escape(Lang.Buttons.SaveFile) ?></button>
</form>
</fieldset>
<?cs include:TemplateDir + '/help_tag_substitution.cs' ?>