Ich mag die Art und Weise, wie WordPress mit seinen enqueue und localize Funktionen funktioniert, also habe ich basierend auf diesem Modell eine einfache Klasse geschrieben, um Skripte entsprechend ihrer Abhängigkeiten in die Seite einzufügen und zusätzliche Daten für das Skript verfügbar zu machen.
class mHeader {
private $scripts = array();
/**
* @param string $id Eindeutiger Skript-Identifier
* @param string $src Skript src Attribut
* @param array $deps Ein Array von Abhängigkeiten (Skript-Identifikatoren).
* @param array $data Ein Array, Daten, die json_encoded werden und für das Skript verfügbar sind.
*/
function enqueue_script($id, $src, $deps = array(), $data = array()) {
$this->scripts[$id] = array('src' => $src, 'deps' => $deps, 'data' => $data);
}
private function dependencies($script) {
if ($script['deps']) {
return array_map(array($this, 'dependencies'), array_intersect_key($this->scripts, array_flip($script['deps'])));
}
}
private function _unset($key, &$deps, &$out) {
$out[$key] = $this->scripts[$key];
unset($deps[$key]);
}
private function flattern(&$deps, &$out = array()) {
foreach($deps as $key => $value) {
empty($value) ? $this->_unset($key, $deps, $out) : $this->flattern( $deps[$key], $out);
}
}
function print_scripts() {
if (!$this->scripts)
return;
$deps = array_map(array($this, 'dependencies'), $this->scripts);
while ($deps)
$this->flattern($deps, $js);
foreach($js as $key => $script) {
$script['data'] && printf(" var %s = %s; " . PHP_EOL, key($script['data']), json_encode(current( $script['data'])));
echo "" . PHP_EOL;
}
}
}
Der Aufruf der Funktion enqueue_script()
dient dazu, ein Skript hinzuzufügen, die Quelle festzulegen und Abhängigkeiten zu anderen Skripts sowie zusätzliche benötigte Daten für das Skript anzugeben.
$header = new mHeader();
$header->enqueue_script('jquery-ui', '//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js', array('jquery'));
$header->enqueue_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js');
$header->enqueue_script('custom-script', '//custom-script.min.js', array('jquery-ui'), array('mydata' => array('value' => 20)));
$header->print_scripts();
Und die Methode print_scripts()
des obigen Beispiels wird diese Ausgabe senden:
var mydata = {"value":20};
Unabhängig davon, dass das Skript 'jquery' nach dem 'jquery-ui' eingefügt wird, wird es zuerst ausgegeben, weil in 'jquery-ui' festgelegt ist, dass es von 'jquery' abhängt. Zusätzliche Daten für das 'custom-script' befinden sich in einem neuen Skriptblock und werden vor diesem platziert. Es enthält das mydata
Objekt, das zusätzliche Daten enthält und nun für 'custom-script' verfügbar ist.