Lieber HeikoH,
ich habe nopch nie mit Smarty gearbeitet. Ich kenne es vom Hörensagen, habe aber weiter keine Ahnung davon. Ich baue mir meine Templates selbst.
<?
$xajax->printJavascript("js/");
?>
hier weiss ich z.B. nicht ob das <? für PHP oder XML steht und wie stelle ich es dann im Template da.
Du meinst da_r_stellen? *SCNR* Also meiner Meinung nach solltest Du den JavaScript-Code als externe Datei in Deine Seite einbauen. Du könntest dazu PHP benutzen, um diesen JavaScript-Code zu generieren, denn PHP kann nicht nur HTML-Dateien "erstellen"...
Dazu kannst Du ja in der HTML-Datei Dein PHP-Script referenzieren, welches dann eben Deine JS-Datei erstellt. Wenn das JavaScript jedesmal individuell neu zusammengestellt werden soll, dann kannst Du einen URL-Parameter aus der aktuellen Serverzeit (Timestamp) hinten anfügen, damit das JavaScript nicht jedesmal aus dem Browsercache entnommen, sondern tatsächlich frisch vom Server geladen wird.
<script src="/pfad/script.php?time=1234567"></script>
function addOption(selectId, txt, val) {
var objOption = new Option(txt, val);
document.getElementById(selectId).options.add(objOption);
}
[...]
Ja, das meine ich. Kommt das nun ins Template oder bleibt es in der PHP Datei?
Weder noch. Das wird in einer externen JavaScript-Datei abgelegt, die als statische Datei auf dem Server bereitliegt. Feste Scriptbestandteile kannst Du in einer festen JS-Datei ablegen. Die dynamisch zu verändernden Bestandteile werden dann von einem PHP-Script generiert (s.o.). Dazu könnte es sich anbieten, dass man in JavaScript eine Art übergeordnetes Objekt definiert, dem man alle diese Funktionen als Methoden gibt, und dem man in der vom PHP-Script nachgelieferten Datei zusätzliche Eigenschaften verleiht.
Ich improvisiere zu Anschauungszwecken einmal das, was ich meine an einem schlechten kleinen Beispiel:
--- Datei 'fest.js' ---
var MeineAjaxMaschine = {
values : {}, // leeres Objekt -> wird in anderer JS-Datei befüllt
addOption : function (selectId, txt, val) {
var objOption = new Option(txt, val),
obj = document.getElementById(selectId);
if (obj) {
obj.options.add(objOption);
}
}
};
--- Ende der Datei ---
--- Datei 'script.php?time=xyz' ---
if (typeof(MeineAjaxMaschine) == "object") {
// MeineAjaxMaschine existiert, also die Werte vergeben
MeineAjaxMaschine.values = {
// das folgende hier wurde von PHP zusammengestellt
herkunftsland : 'string-Wert',
bundesland . ['array-wert1', 'array-wert2']
};
}
--- Ende der Datei ---
<select name="txtfrom" id="txtfrom"
onchange="xajax_addtxtstateprovince('txtstateprovince', document.frmPlan.txtfrom.value)">
[...]
Desweiteren sollte JavaScript-Code mittels JavaScript ins Dokument geschrieben werden (Stichwort "unobtrusive").
Das möchte ich machen wenn alles funktioniert. Du hast recht, es ist dann auch aufgeräumter. Aber bis dahin habe ich es lieber wenn alles "beisammen" ist.
Du kannst ja den Script-Inhalt der in meinem Beispiel 'fest.js' genannten Datei direkt im Kopf Deines HTML-Dokumentes eintragen, um es dann später als externe Datei auszulagern. Das mit dem PHP-generierten JavaScript ist so eine Sache. Es muss als zusätzlicher Request nachgeladen werden und kann daher auch für Deine Testzwecken nicht in die HTML-Datei hinein.
Du kannst ja eine HTML-Datei als Vorlage definieren, deren Inhalt dann in etwa so aussieht:
--- Datei 'template.html' ---
<!DOCTYPE ... (ich kürze hier ab) >
<html>
<head>
<title>Vorlage</title>
<script type="text/javascript">//<![CDATA[
var MeineAjaxMaschine = { (abgekürzt) };
//]]></script>
<script src="/pfad/script.php?time=124356789"></script>
</head>
<body>
<h1>Meine Überschrift</h1>
<p>Das folgende ist jedesmal anders...</p>
{content}
<p>Jetzt kommt wieder Template-Inhalt.</p>
<p>Copyright is alles meins!</p>
</body>
</html>
--- Ende der Datei ---
Die Zeichenfolge "{content}" kannst Du ja nach Abarbeiten Deines PHP-Scripts mittels str_replace() durch Deinen dynamischen Content ersetzen. Ganz ohne Smarty.
Liebe Grüße aus Ellwangen,
Felix Riesterer.
ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)