|
|
| (4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) |
| Zeile 1: |
Zeile 1: |
| ==Beschreibung==
| | #redirect [[Benutzer:Rene/SGPack]] |
| Die Parser-Erweiterung CacheArray ermöglicht das anlegen und auslesen eines Arrays. Das besondere dabei ist das diese Arrays nur einmal angelegt werden müssen und dann auch von anderen Seiten benutzt werden können. '''Hinweis:''' ''Natürlich bleibt das Array nicht erhalten wenn die ursprünglich angefragte Seite an den Browser ausgegeben wurde. Es kann nur während des Seitenaufbaus von aufgerufenen Seiten bzw. Vorlagen benutzt werden.''
| |
| | |
| ==Einsatz==
| |
| ===Aufruf===
| |
| <pre><nowiki>{{carray:<Name_des_Array>|<Befehl>[''Parameter''…''Array-Werte'']}}</nowiki></pre>
| |
| * '''Name_des_Array'''
| |
| :Die Erweiterung ist in der Lage beliebig viele Arrays zu verwalten. Zur Unterscheidung dient dabei der Array-Name.
| |
| ===Befehle===
| |
| * '''w''' oder '''write'''
| |
| :Der Befehl '''write''' füllt das Array mit den angegebenen Werten. Ist das Array bereits angelegt wird der Befehl ignoriert. Um ein Array erneut anzulegen muss es zuerst gelöscht werden, siehe Befehl '''delete'''.
| |
| :Die Definition der Array-Werte erfolgt analog zur <nowiki>{{#switch:}}</nowiki> Definition. Ein Beispiel:
| |
| <pre><nowiki>{{carray:EpName|w
| |
| | #default = <span class="error">Episodencode ungültig</span>
| |
| | SGA_1x01/02 = Aufbruch in eine neue Welt
| |
| | SGA_1x01 = Aufbruch in eine neue Welt, Teil 1
| |
| | SGA_1x02 = Aufbruch in eine neue Welt, Teil 2
| |
| | SGA_1x03 = Dunkle Schatten
| |
| | SGA_1x04 = 38 Minuten
| |
| }}</nowiki>
| |
| </pre>
| |
| :Das Array-Element '''#default''' wird immer dann ausgegeben wenn die Anfrage nach einem nicht definierten Wert gestellt wird, siehe Befehl '''read'''.
| |
| * '''r''' oder '''read'''
| |
| :Mit dem Befehl '''read''' erfolgt die Abfrage des Arrays. Das folgende Beispiel
| |
| <pre><nowiki>{{carray:EpName|r|SGA_1x01}}</nowiki></pre>
| |
| würde nach der oben angegebenen Definition den Wert
| |
| <pre>Aufbruch in eine neue Welt, Teil 1</pre>
| |
| zurück liefern. Ist kein Wert definiert wird entweder nichts oder, wenn definiert, der Inhalt der Zeile '''#default''' ausgegeben.
| |
| * '''rw''' oder '''readwrite'''
| |
| :Mit der Kombination der Befehle '''read''' und '''write''' wird das Array zuerst gefüllt und dann die entsprechende Zelle ausgelesen. Der Aufruf muss daher lauten:
| |
| <pre><nowiki>{{carray:EpName|rw|SGA_1x01
| |
| | #default = <span class="error">Episodencode ungültig</span>
| |
| | SGA_1x01/02 = Aufbruch in eine neue Welt
| |
| | SGA_1x01 = Aufbruch in eine neue Welt, Teil 1
| |
| | SGA_1x02 = Aufbruch in eine neue Welt, Teil 2
| |
| | SGA_1x03 = Dunkle Schatten
| |
| | SGA_1x04 = 38 Minuten
| |
| }}</nowiki></pre>
| |
| * '''u''' oder '''used'''
| |
| :Um zu prüfen ob ein Array bereits angelegt ist sollte der Befehl '''used''' benutzt werden. Ist das Array bereits vorhanden liefert die Anfrage die Anzahl der definierten Array-Elemente, ansonsten wird nichts zurück geliefert.
| |
| <pre><nowiki>{{carray:EpName|u}}</nowiki></pre>
| |
| * '''c''' oder '''count'''
| |
| :Der Befehl gibt die Anzahl der definierten Array-Elemente zurück. Ist das Array noch nicht definiert ist das Ergebnis 0.
| |
| <pre><nowiki>{{carray:EpName|c}}</nowiki></pre>
| |
| * '''d''' oder '''delete'''
| |
| :Mit dem Befehl '''delete''' wird das Array gelöscht. Dies ist immer dann nötig wenn das Array neu geschrieben werden soll, da das Überschreiben nicht möglich ist.
| |
| <pre><nowiki>{{carray:EpName|d}}</nowiki></pre>
| |
| | |
| ==Hinweise zum Einsatz==
| |
| Die Erweiterung kann, richtig eingesetzt, den Aufbau von Seiten beschleunigen die häufig eine Vorlage aufrufen die aus einer großen Anzahl an Werten einen Wert liefert. Dazu sollte eine eigene Seite angelegt werden die nur das Array füllt. Auf der eigentlichen Vorlagenseite sollte mit dem Befehl '''used''' geprüft werden ob das Array bereits gesetzt wurde. Wenn nicht kann die "Full"-Vorlage aufgerufen werden. Sonst sollte immer nur das Array ausgelesen werden.
| |
| | |
| Durch diese Konstruktion erreicht man das die große, daher langsame, 'Füll'-Vorlage nur einmal abgearbeitet werden muss und alle weiteren Zugriffe auf das Cache-Array erfolgen.
| |
| | |
| Die entsprechende Anweisung sollte wie folgt aussehen, definiert in Vorlage:EpName
| |
| | |
| <pre><nowiki>{{#if: {{carray:EpName|u}} || {{EpName/Fill}} }}{{carray:EpName|r|{{{1}}}}}</nowiki>
| |
| </pre>
| |
| | |
| Die Vorlage EpName/Fill füllt das Array ''EpName'' mit Werten die dann von der Vorlage EpName ausgelesen wird.
| |
| | |
| ==Code==
| |
| <pre><nowiki>
| |
| <?php
| |
| if(!defined('MEDIAWIKI')) {
| |
| die('This filse is a MediaWIki extension, it is not a valid entry point');
| |
| }
| |
| // About
| |
| $wgExtensionCredits['parserhook'][] = array(
| |
| 'name' => 'CacheArray',
| |
| 'version' => '0.5',
| |
| 'url' => 'http://www.stargate-wiki.de/index.php/Benutzer:Rene/CacheArray',
| |
| 'author' => 'René Raule',
| |
| 'description' => 'Cached Array for templates',
| |
| );
| |
| // Define a setup function
| |
| $wgExtensionFunctions[] = 'efCacheArray_Setup';
| |
| // Add a hook to initialise the magic word
| |
| $wgHooks['LanguageGetMagic'][] = 'efCacheArray_Magic';
| |
| // Cache
| |
| $efCacheArray_cache = array();
| |
| | |
| // Register extension
| |
| function efCacheArray_Setup() {
| |
| global $wgParser;
| |
| | |
| $wgParser->setFunctionHook( 'carray', 'efCacheArray_Render',SFH_NO_HASH );
| |
| }
| |
| | |
| // Define magic word(s)
| |
| function efCacheArray_Magic( &$magicWords, $langCode ) {
| |
| $magicWords['carray'] = array( 0, 'carray' );
| |
| return true;
| |
| }
| |
| | |
| // Cache main part
| |
| function efCacheArray_Render() {
| |
| global $efCacheArray_cache;
| |
| | |
| // minimum parser, cachenumber and action are needed
| |
| if(func_num_args() < 3) {
| |
| return array('','noparse'=>true);
| |
| }
| |
| // get the parser parameter
| |
| $param = func_get_args();
| |
| $parser = current($param);
| |
| // get the first two wiki-parameters (chachenumber, action)
| |
| $cnumber = trim(next($param));
| |
| $action = strtolower(trim(next($param)));
| |
| // default output is empty
| |
| $output = '';
| |
| // action
| |
| switch($action) {
| |
| case 'w' : // only create new carray
| |
| case 'write' :
| |
| case 'rw' : // write new carray and read one value
| |
| case 'readwrite' :
| |
| // read key (only if readwrite)
| |
| if(($action == 'rw') or ($action == 'readwrite')) {
| |
| $key = trim(next($param));
| |
| }
| |
| // if carray is already set do not read it again (cache!)
| |
| if(!isset($efCacheArray_cache[$cnumber])) {
| |
| // read the keys and values and save in carray
| |
| while($values = next($param)) {
| |
| list($index,$value) = explode('=',$values,2);
| |
| $efCacheArray_cache[$cnumber][trim($index)] = trim($value);
| |
| }
| |
| }
| |
| // leave switch (only if write)
| |
| if(($action == 'w') or ($action == 'write')) {
| |
| break;
| |
| }
| |
| case 'r' : // read value out of carray
| |
| case 'read' :
| |
| // read key, if not already set by action readwrite
| |
| if(!isset($key)) {
| |
| $key = trim(next($param));
| |
| }
| |
| // read cache
| |
| $value = $efCacheArray_cache[$cnumber][$key];
| |
| // if no value, look for default
| |
| if(isset($value)) {
| |
| $output = $value;
| |
| } else {
| |
| if(isset($efCacheArray_cache[$cnumber]['#default'])) {
| |
| $output = $efCacheArray_cache[$cnumber]['#default'];
| |
| }
| |
| }
| |
| break;
| |
| // delete carray
| |
| case 'd' :
| |
| case 'delete' :
| |
| unset($efCacheArray_cache[$cnumber]);
| |
| break;
| |
| case 'c' : // count elements in carray
| |
| case 'count' :
| |
| $output = count($efCacheArray_cache[$cnumber]);
| |
| break;
| |
| case 'u' : // test if cache is used
| |
| case 'used' :
| |
| // if carray is used give size
| |
| if(isset($efCacheArray_cache[$cnumber])) {
| |
| $output = count($efCacheArray_cache[$cnumber]);
| |
| }
| |
| break;
| |
| }
| |
| return array($output,'noparse'=>true);
| |
| }
| |
| </nowiki></pre>
| |