Liste aller Autoren (aber nicht in sidebar!)

Hier können Probleme und alles andere in Deutscher Sprache gelöst werden.
stm999999999
Regular
Posts: 1531
Joined: Tue Mar 07, 2006 11:25 pm
Location: Berlin, Germany
Contact:

Post by stm999999999 »

ok, weiter in meinem Monolog :-)

ich habe jetzt einen funktionsfähigen Code, der IMO auch dür Spartacus geeignet ist:

serendipity_event_userlist.php
http://nopaste.php-q.net/244619

lang_en.inc.php
http://nopaste.php-q.net/244620

(vorläufige) Lösung meines Problems:

Code: Select all


class serendipity_event_UserList extends serendipity_event {
    var $title = PLUGIN_EVENT_USERLIST_NAME;

    function introspect(&$propbag) {
    }


    function event_hook($event, &$bag, &$eventData, $addData = null) {
        global $serendipity;

        function smarty_showUsersByABC ($params, &$smarty) {
                 
       }

        $hooks = &$bag->get('event_hooks');

        if (isset($hooks[$event])) {
            switch($event) {
            	case 'entry_display':
          	
		            $serendipity['smarty']->register_function('serendipity_UserList_showUsersByABC', 'smarty_showUsersByABC');
	     
Die Funktion, die auf den smarty-Aufruf gemappt wird, muß sich nicht nur innerhalb der class befinden, sondern sogar in der function event_hook.

Nur, irgendwie finde ich das unbefriedigend, daß das alles da drin sein muß.

Kann man das wirklich nicht außerhalb der class-Definition machen machen? Oder zwar in der plugin-class, aber halt nicht in function event_hook?

mit $this-> hat es nicht funktioniert, hm ...
Ciao, Stephan
garvinhicking
Core Developer
Posts: 30022
Joined: Tue Sep 16, 2003 9:45 pm
Location: Cologne, Germany
Contact:

Post by garvinhicking »

Hi!

Richtig, Methoden sind keine Funktionen - daher kannst Du nicht showUsersByABC aufrufen, wenn das nur eine Klassenmethode ist.

Eine Funktion innerhalb einer Methode zu definieren ist mega-dreckig und wird mit PHP6 auch evtl. nicht funktionieren, darauf würde ich verzichten. Daher solltest Du die Methode einfach als Funktion umschreiben:

http://nopaste.php-q.net/244710

Ich würde dir ansonsten empfehlen diesen Codeteil in ein bestehend plugin, z.B. userprofiles einzufügen? Ein neues solches Plugin in Spartacus zu packen würde ich etwas redundant empfinden...?

Ich meine aber dass Smarty auch mit OO umgehen können müsste; probier mal "serendipity_event_UserList::smarty_showUsersByABC" stattdessen, man müsste die methode auch so ansprechen können. Oder mal die Smarty-Doku zu register_function wälzen?

Grüße,
Garvin
# Garvin Hicking (s9y Developer)
# Did I help you? Consider making me happy: http://wishes.garv.in/
# or use my PayPal account "paypal {at} supergarv (dot) de"
# My "other" hobby: http://flickr.garv.in/
stm999999999
Regular
Posts: 1531
Joined: Tue Mar 07, 2006 11:25 pm
Location: Berlin, Germany
Contact:

Post by stm999999999 »

OO scheint nicht zu funktionieren.
Aber ich habe was gefunden:
void register_function (string name, mixed impl, bool cacheable, mixed cache_attrs)
Wird verwendet, um Template-Funktion-Plugins dynamisch zu registrieren. Übergeben Sie dazu den Namen der Template-
Funktion und den Namen der PHP-Funktion, die die entsprechende Funktionalität bereitstellt.
Der Parameter impl kann als (a) einen Funktionnamen oder (b) einem Array der Form array(&$object, $method),
wobei &$object eine Referenz zu einem Objekt und $method der Name der Methode die aufgerufen werden soll ist, oder
als Array der Form array(&$class, $method), wobei $class der Name der Klasse und $method der Name der
Methode ist die aufgerufen werden soll, übergeben werden.
Das hat mir zwar nicht direkt geholfen, weil das mit dem $ nicht so recht geklappt hat. Und das php-manual war auch nicht weiter hilfreich, weil das dortige Beispiel genau diese Fälle nicht zeigte. Aber google neue Code-Suche hat dann Vergleichscode vorgebracht! (coole Suche!)

So geht das dann:

Code: Select all

$serendipity['smarty']->register_function('serendipity_UserList_showUsersByABC', array(&$this,'smarty_showUsersByABC'));
komplett unter http://nopaste.php-q.net/248080
Ciao, Stephan
Post Reply