Camping_RIDER: PHP Code in externer Datei

Beitrag lesen

Aloha ;)

Prinzip: statt einer statischen JS-Datei wird ein Template über den Loader gezogen. Die JavaScript-Datei also als Template-Datei mit Platzhaltern. Hier kannste dann vom Server her kommend, Variablen einbauen.

Derselbe Vorgang, wie beim Einbau von Platzhaltern in eine HTML-Datei, den Head- oder andere Script-Bereiche. Mit Loader ist es halt explizit nur das JavaScript.

Alles richtig soweit. Noch etwas ausführlicher für den TO:

Das Javascript schreibst du ganz normal, wie man eben JS schreibt. Für alle Variablen, die du aus php ziehen willst, schreibst du Platzhalter. Wenn du z.B. die userid willst, könntest du soetwas machen:

var userid = "\*|PHPVAR-userid|\*";

Platzhalter für $userid ist also \|PHPVAR-userid|\

Geschickterweise leitest du Platzhalter ein wie Kommentare, dann kommen Editoren mit Syntax-Highlightning nicht durcheinander und es besteht weniger Verwechslungsgefahr mit richtigen Strings. Ansonsten bist du da aber in der Qual der freien Wahl ;)

Die loader.php macht dann folgendes:

* Alle Variablen, die benötigt werden, definieren bzw. sicherstellen, dass sie sich im Scope von loader.php befinden
* das Javascript, dessen Dateiname dir der GET-Parameter file verrät, in einen String $out laden (hier bitte ganz besonders restriktiv vorgehen, also z.B. nur files mit .js akzeptieren oder von vornherein file ohne Dateiendung ins Get und .js immer dranhängen. Wir wollen ja nicht, dass der Loader zum Freibrief wird, alle Dateien im Klartext auszulesen - sondern eben nur Javascripts)
* in der Variable $out per str_replace alle Platzhalter durch den jeweiligen Variablen-Inhalt ersetzen
* header-content-type festlegen und echo $out;

Vorteile dieser Methode gegenüber dem von mir genannten Ansatz:

  • Der client bekommt die Variablen nie alle komfortabel zu Gesicht, müsste sie also aus dem Quelltext rauslesen (Verschleierung)
  • Manipulation zur Laufzeit ist komplizierter, da der Platzhalter an mehreren Stellen im JS benutzt werden kann, somit sind z.B. regelmäßige Checks im JS möglich (z.B. if (userid != "\*|PHPVAR-userid|\*") { ... ). Wohlgemerkt: Manipulationen sind noch immer möglich, nur deutlich komplizierter vorzunehmen
  • Es stehen in jedem Skript nur die tatsächlich nötigen PHP-Variablen zur Verfügung - es werden dem client keine Variableninhalte "unnötigerweise" verraten

Im HTML steht dann nur noch (hier wie vorfeschlagen ohne Dateiendung:

<script src="loader.php?file=skript1></script>  
<script src="loader.php?file=skript2></script>

Ergebnis ist, dass die Dateien Skript1.js und Skript2.js geladen und mit ordentlich ersertzten Platzhaltern beim client ankommen.

Nachteile:

  • Die Rechenzeit ist nicht wie bei meinem Ansatz geringer sondern wieder etwa gleich groß wie in deinem ursprünglichen Ansatz
  • du musst auch hier die zu verwendenden Variablen erst wieder definieren (im HTML-Konstruktor sind sie ja schon vorhanden)

Gleichbleibender Vorteil ggü. der ursprünglichen Methode
* Javascript ist nicht mit php vermischt (nur mit Platzhaltern, aber das find ich weniger schlimm)
* Übersichtlichkeit der JS-Quelltexte ist gegeben
* du musst die Variablen aus php nicht in jedes einzelne JS extra einbringen, sondern hast eine zentrale Anlaufstelle (dont repeat yourself)

Zuletzt noch eine weitere mögliche Optimierung:
Für große Projekte mit vielen, vielen verschiedenen Platzhaltern ist es evtl. günstig, die Platzhalter so wie von mir vorgeschlagen (oder gleichwertig anders) zu nehmen und die Ersetzungen nicht einzeln per str_replace vorzunehmen, sondern über reguläre Ausdrücke in einer for-Schleife. Die Namen der Variablen innerhalb der Platzhalter kann dann direkt als key der einzusetzenden Variablen im $GLOBALS (oder einem anderen) Array genutzt werden. Sehr effizient, aber zu aufwendig für nur wenige Ersetzungen.

Und noch eine:
Auch dein HTML-erzeugendes PHP nimmt die Variablen irgendwoher. Wenn du diese Stellen auslagern und per include einbinden kannst, kannst du die ausgelagerten Stellen auch in loader.php includieren. Dann ist das don't repeat yourself perfektioniert ;)

Grüße,

RIDER

--
Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller
ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[