Page 2 of 2

Posted: Thu Oct 05, 2006 11:21 pm
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 ...

Posted: Fri Oct 06, 2006 11:34 am
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

Posted: Fri Oct 20, 2006 10:50 pm
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