Boardunity & Video Forum

Boardunity & Video Forum (https://boardunity.de/)
-   CalitrixWiki Supportforum (https://boardunity.de/calitrixwiki-supportforum-f68.html)
-   -   Spezialseiten-Entwicklung (https://boardunity.de/spezialseiten-entwicklung-t3748.html)

Bynaus 19.11.2005 10:30

Spezialseiten-Entwicklung
 
Hallo!
Ich möchte für die nächste Version meiner Seite www.planeten.ch gerne das Calitrix verwenden, allerdings muss ich dazu die Spezialseitenentwicklung beherrschen. Ich hab mich mal darin versucht, eine Spezialseite zu entwickeln, die eigentlich der Sitemap entspricht, aber nur einen bestimmten Namensraum ("Lexikon") auflistet.

Das führt dazu, dass ich in der special_sitemap.php die Datenbankquery folgendermassen abgeändert habe:

PHP-Code:

$result $db->query('SELECT page_namespace, page_name FROM '.DB_PREFIX.'pages '.
        
'WHERE page_namespace="lexikon" ORDER BY page_name'); 

Darauf erhalte ich folgende Fehlermeldung:
Zitat:

Warning: Smarty error: unable to read resource: "special_lexikon.tpl" in /home/www/web52/html/pages/next/libs/tpl/Smarty.class.php on line 1083
Da ich mich mit Smarty nicht so auskenne - wie lässt sich das beheben? Muss ich ein File "special_lexikon.tpl" erstellen, damit das funktioniert? Wenn ja, wie, und was enthält "special_lexikon.tpl"?

Sollten sich während der Entwicklung der weiteren Spezialseiten noch weitere Probleme ergeben, werd ich die natürlich auch hier posten... Ich hoffe auch, dass andere von diesem Thread profitieren können, die ebenfalls weitere Spezialseiten entwickeln wollen.

Vielen Dank schon mal für die Hilfe.
Freundliche Grüsse
Bynaus

Björn 20.11.2005 11:45

versuch mal so:
Code:

$result = $db->query('SELECT page_namespace, page_name FROM '.DB_PREFIX.'pages '.
        'WHERE page_namespace=\'lexikon\' ORDER BY page_name');


Bynaus 20.11.2005 11:58

Danke für die Antwort. Ich habe das soeben versucht, leider bleibt der Fehler derselbe.

Ich habe lediglich die sitemap-Datei abgeändert und überall "sitemap" durch "lexikon" ersetzt, auch im Titel.

Bynaus 20.11.2005 14:52

Ha, ich habs. Ich habe das special_sitemap.tpl-File kopiert und als special_lexikon.tpl wieder eingefügt, darin die Variable $sitemap durch $lexikon ersetzt, und jetzt klappts. Cool, dann kann ich mir jetzt meine Sitemaps für verschiedene Namensräume selbst erstellen... :)

Aber ich bin sicher, es werden hier noch mehr Fragen kommen... ;)

exe 25.11.2005 18:50

Deine Vorgehensweise war schonmal richtig. Spezialseiten werden nicht in dem Standardtemplate für Wikitexte angezeigt. Jede Spezialseite muss selber angeben, mit welchem Template sie angezeigt werden will. Das Template wird vom CalitrixWiki mit der Funktion "getTemplate()", die von jeder Spezialseite definiert werden muss, abgefragt. Wenn das Lexikontemplate das gleiche wie das Sitemaptemplate ist, kannst du auch einfach in der Funktion "getTemplate()" der special_lexikon.php das Template "special_sitemap.tpl" angeben.

Code:

        /**
        * Returns the template name for this special page.
        *
        * @author Johannes Klose <[email protected]>
        * @return string Template name
        **/
        function getTemplate()
        {
                return 'special_lexikon.tpl';
        }

ersetzen durch

Code:

        /**
        * Returns the template name for this special page.
        *
        * @author Johannes Klose <[email protected]>
        * @return string Template name
        **/
        function getTemplate()
        {
                return 'special_sitemap.tpl';
        }

Das Gleiche findet sich auch in der Doku: http://www.calitrix.de/SpezialseitenEntwicklung

Bynaus 26.11.2005 07:36

Vielen Dank.

Eine Frage habe ich auch noch: Wie kann man die Darstellung des "Namensraumes" vor dem Link (z.B. in der sitemap) unterdrücken? In einigen dieser "sitemap-Abzweiger" wäre das nämlich noch recht praktisch... Ich habe danach gesucht, aber nichts gefunden.

exe 26.11.2005 13:01

Die Überschrift steht in der header.tpl:

Code:

    <h1 class="page-title">{$pageTitle}{if $actionTitle != ''} - {$actionTitle}{/if}</h1>
    {$rBackLink}

Für deine Änderung müsstest du sie in alle anderen Templates verschieben, also action_*.tpl und special_*.tpl. In der special_sitemap.tpl kannst du dann eine andere Überschrift nehmen, beispielsweise

Code:

<h1 class="page-title">{$pageName}</h1>
{$pageTitle} enthält den Titel der Seite der unter Umständen (wenn der Namensraum vom Standardnamensraum abweicht) auch den Namensraum enthält.
{$pageName} enthält nur den Name der Seite ohne Namensraum.

Bynaus 26.11.2005 13:11

Vielen Dank, das hilft mir weiter. :)

Bynaus 01.12.2005 21:18

Nun, da wäre die nächste Frage... Wie schaff ich es, einen extern eingebundenen Text zu Parsen wie einen Text in der Wiki-Text-Datenbank? Das heisst, wenn ich aus einer externen Datenbank einen Text mit einem [[Link]] importiere, wir bringe ich Calitrix dazu, diesen auch wirklich in einen Link zu verwandeln?
Das gleiche gilt für Bilder (niedrigere Priorität, Links wären wichtiger), etc. Ich habe es mit Vergleichen zum "include"-Plugin versucht, aber es will mir nicht recht gelingen. Das mag damit zusammenhängen, dass ich nicht wirklich verstehe, was da im "include"-Plugin wirklich geschieht... ;)

Wenn jemand eine Idee oder einen Hinweis hat, wäre ich dankbar.

exe 01.12.2005 22:15

Den Parser des Wikis für andere Texte als Artikel zu verwenden funktioniert nicht, da er Informationen (einen Seitenname, Namensraum usw.) benötigt die nur ein Artikel besitzt. Das Problem ist mir aber auch schon bekannt und bis zur 1.0 wird der Parser noch verbessert um beliebige Texte damit zu parsen.

Als eine Art "ugly Hack" könntest du für den Parser eine leere Dummyseite erstellen, den Text dieser Seite auf den zu parsenden Text setzen und das ganze durch den Parser jagen:
PHP-Code:

<?PHP
$meinText 
'Foo [[Bar]] baz [[quux]]';
$parser = &singleton("parser"); // Instanz vom Parser holen

// Leere Dummyseite holen
$dummy $GLOBALS['wiki']->getPage("Dummy"false);
// Text der Dummyseite setzen
$dummy['page_text'] = $meinText;

// Dummy parsen
$text $parser->parseText($dummy);
?>


Bynaus 02.12.2005 07:51

Funktioniert... ! Vielen Dank.

Auf wann ist der Release von 1.0 eigentlich geplant?

EDIT: Mir ist soeben etwas aufgefallen, was man noch verbessern könnte: wenn man als User auf Zufallsseite klickt, dann kommen ab und zu auch Seiten, auf die man keinen Zugang hätte - entsprechend kriegt man eine Fehlermeldung. Wäre es vielleicht möglich, das so einzustellen, dass die Spezialseite "Zufallsseite" nur Seiten aufruft, die man auch betrachten darf? Sonst bekommt man mit der Zeit recht viele "Absagen", je nach dem, wie gross der Umfang der "versteckten" bzw. "verbotenen" Seiten ist.

EDIT2: Noch einmal zu deinem "ugly hack": Könnte ich dafür nicht auch eine andere (bereits existierende) Seite nehmen? So lange ich ja unter "/Text der Dummyseite setzten" den wahren Text für den Parser "überschreibe", sollte das doch keine Rolle spielen. Oder doch? Ich ändere ja dann an der Seite selber nichts, trage nichts in die Datenbank ein, etc..

exe 02.12.2005 18:20

Klar, wenn du bereits eine Seite geladen hast, kannst du auch die verwenden. Nur extra eine zu laden wäre verschwendung, schliesslich kostet das eine eigene Datenbankabfrage.

Zitat:

Auf wann ist der Release von 1.0 eigentlich geplant?
Im Dezember wirds wahrscheinlich nix mehr aber im Januar dann.

Bynaus 08.12.2005 10:35

Hm, ich hab wieder mal eine Frage: Angenommen, ich möchte eine Seite einrichten, mit der ich in Calitrix Änderungen in der Datenbank vornehmen kann (in gesonderten Tabellen). Wie pack ich das am besten an? Über Spezialseiten? Über Actions? Über Plugins?

Gibt es die Möglichkeit, eine php-Seite zu includen? Vielleicht könnte man ein Plugin schreiben, welches das includen von php-Seiten ermöglichen würde?

EDIT: Ich habs mal versucht... Leider funktioniert das nicht ganz so wie gewünscht: der Text, der auf der includeten Seite mit print ausgegeben wird, wird ganz zuoberst im Wiki (also noch vor der Top-Leiste, ausserhalb des Textfeldes) ausgegeben. Dazu funktionieren relative Links nicht.

Hat jemand eine Idee?

PHP-Code:

class plugin_phpinclude
{
    var 
$pageText '';
    
    function 
plugin_phpinclude(&$params$text)
    {
        
$url $params['page'];
        
        
$url "http://www.url.com/wiki/includes/include_" $url ".php";
        
        
$this->pageText = include($url);
    }
    
    function 
getContent()
    {
        return 
$this->pageText;
    }



exe 08.12.2005 12:18

Das kommt erstmal drauf an, wie du die Änderungen an der Datenbank durchführen willst. Wenn du eine extra Seite haben willst die Inhalte in die Datenbank einfügt und wieder anzeigt (beispielsweise ein Gästebuch oder Newsseite) bieten sich Spezialseiten an. Wenn du innerhalb eines Artikels ein Script aufrufen willst welches eine bestimmte Aktion durchführt (beispielsweise ein Hitcounter) bietet sich ein Plugin an (da muss ja keine extra Seite angezeigt werden). Actions brauchst du nur, wenn du zu den bestehenden Aktionen (Bearbeiten, History, Optionen usw.) etwas hinzufügen willst.

PHP-Includes wären prinzipiell machbar. Wenn ein via include eingebundenes Script aber eigene Daten via echo ausgibt, musst du diese abfangen da sie sonst, wie du siehst, vor allen anderen Ausgaben auftauchen. Die benötigten Funktionen dafür sind ob_start(), ob_get_contents() und ob_end_clean().

PHP-Code:

ob_start();
include 
$url;
$this->pageText ob_get_contents();
ob_end_clean(); 

Bei solchen Sachen musst du aber gut auf Sicherheit achten. Nicht das ein Benutzer ein willkürliches PHP-Script einbinden kann, welches dann böswilligen PHP-Code auf deinem Server ausführt. Nebenbei musst du includes nicht via URL sondern über das Dateisystem des Servers einbinden, wenn du PHP-Code ausführen willst. An das Wurzelverzeichnis des Wikis kommst du über die Konfiguration:

PHP-Code:

$GLOBALS['wiki']->cfg['doc_root'


Bynaus 08.12.2005 13:52

Vielen Dank für die Antwort.

Das phpinclude werd ich mal so umschreiben und dann sehen, was dabei rauskommt. Was die Sicherheit angeht: wie du oben siehst, verwende ich einen speziellen Namen (der, der dem Plugin per "page=" übergeben wird und unter $url abgespeichert wird), der dann einem bestimmten Verzeichnis zugewiesen wird, in dem alle "erlaubten" php-Files liegen. Da gibt es dann keine Möglichkeit, auszubrechen, oder? Ich könnte ausserdem noch Testen, ob im übergebenen Namen nur Buchstaben vorkommen.

Für richtige Datenbank"interfaces" wären aber wohl doch Spezialseiten besser. Ich schau mal, was sich da eher anbietet.

EDIT: Cool, funktioniert! Wers kopieren will: (einen Ordner "includes" ist im Wiki-Rootverzeichnis zu erstellen, in dem alle gewünschen php-Includes unter dem Format include_irgendwas.php abgespeichert werden. Dem Plugin wird unter dem Namen Page dann "irgendwas" übergeben.)

PHP-Code:

class plugin_phpinclude
{
    var 
$pageText '';
    
    function 
plugin_phpinclude(&$params$text)
    {
        
$url $params['page'];
        
        if(
ereg("[a-zA-Z0-9]+",$url,$regs))
        {
            
$url $GLOBALS['wiki']->cfg['doc_root']  . "/includes/include_" $url ".php";
        }
        
        
ob_start();
        @include 
$url;
        
$this->pageText ob_get_contents();
        
ob_end_clean();         
    }
    
    function 
getContent()
    {
        return 
$this->pageText;
    }



exe 09.12.2005 08:06

Zitat:

Zitat von Bynaus
Da gibt es dann keine Möglichkeit, auszubrechen, oder? Ich könnte ausserdem noch Testen, ob im übergebenen Namen nur Buchstaben vorkommen.

Doch, bei deiner Prüfung ist das noch möglich, da du nur prüfst ob eine Folge von Buchstaben in der URL vorkommt, nicht ob die auch vom ersten bis zum letzten Zeichen geht. Man könnte eventuell immer noch mit ../../../foo aus dem include-Verzeichnis ausbrechen.

PHP-Code:

if(preg_match("/^[a-zA-Z0-9]+$/",$url)) 

Damit prüfst du, das die Buchstabenfolge auch wirklich vom ersten bis zum letzten Zeichen in der URL anhält.

Bynaus 09.12.2005 10:30

Du hast recht, daran hab ich gar nicht gedacht. Vielen Dank, habe das geändert.

EDIT: Mir ist gerade aufgefallen, dass mein Skript zwar prüft, ob nur Buchstaben im übergebenen Text vorkommen - aber danach gar nichts damit macht. Korrekt sollte es also heissen:

PHP-Code:

if(ereg("[a-zA-Z0-9]+",$url,$regs))
        {
            
$url $GLOBALS['wiki']->cfg['doc_root']  . "/includes/include_" $url ".php";
        
            
ob_start();
            @include 
$url;
            
$this->pageText ob_get_contents();
            
ob_end_clean();         
        } 


exe 10.12.2005 11:14

PHP-Code:

class plugin_phpinclude
{
    var 
$pageText '';
    
    function 
plugin_phpinclude(&$params$text)
    {
        
$url $params['page'];
        
        if(
preg_match("/^[a-zA-Z0-9]+$/",$url))
        {
            
$url $GLOBALS['wiki']->cfg['doc_root']  . "/includes/include_" $url ".php";
            
            
ob_start();
            @include 
$url;
            
$this->pageText ob_get_contents();
            
ob_end_clean();         
        }
    }
    
    function 
getContent()
    {
        return 
$this->pageText;
    }


So sollte es funktionieren ..


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 Uhr.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25