2017-01-22 3 views
0

J'apprends Mediawiki et je regarde certaines des extensions.

Manual:$wgUser sur mediawiki.org indique que la variable globale $wgUser ne doit pas être utilisée pour le nouveau code.

Manual:RequestContext.php indique que l'objet de contexte doit être utilisé à la place, en utilisant $this->getUser() ou $context->getUser().

Cependant, lorsque je tente d'utiliser $this->getUser()->getName() dans l'extension pour Qui est en ligne j'obtenir l'erreur suivante:

Fatal error: Using $this when not in object context in /home/ghsfhaco/public_html/wiki/extensions/WhosOnline/WhosOnlineHooks.php on line 19 

Et quand je change à $context->getUser()->getName() je reçois cette erreur:

Fatal error: Call to a member function getUser() on null in /home/ghsfhaco/public_html/wiki/extensions/WhosOnline/WhosOnlineHooks.php on line 19 

Le plein Extension:WhosOnline peut être trouvé à Mediawiki, mais voici la page spécifique:

class WhosOnlineHooks { 

    // update online data 
    public static function onBeforePageDisplay() { 
     global $wgUser; 

     // write to DB (use master) 
     $dbw = wfGetDB(DB_MASTER); 
     $now = gmdate('YmdHis', time()); 

     // row to insert to table 
     $row = array(
      'userid' => $wgUser->getId(), 
      'username' => $wgUser->getName(), 
      'timestamp' => $now 
     ); 

     $method = __METHOD__; 
     $dbw->onTransactionIdle(function() use ($dbw, $method, $row) { 
      $dbw->upsert(
       'online', 
       $row, 
       array(array('userid', 'username')), 
       array('timestamp' => $row['timestamp']), 
       $method 
      ); 
     }); 

     return true; 
    } 

    public static function onLoadExtensionSchemaUpdates($updater) { 
     $updater->addExtensionUpdate(array('addTable', 'online', 
      __DIR__ . '/whosonline.sql', true)); 
     return true; 
    } 
} 

Comment exactement devrait-il être fait?

BTW, j'utilise Mediawiki 1.28.0.

+0

Eh bien, '$ this' /' $ context' doit exister avant de pouvoir appeler des méthodes. Il semble que votre vraie question est "comment fonctionnent les objets en PHP?", Et lire [le manuel de PHP] (https://secure.php.net/manual/fr/language.oop5.basic.php) est la meilleure façon apprendre ça. – Tgr

Répondre

0

partir de la page que vous avez lié (Travailler avec demande Contextes>Lorsque vous utilisez des crochets): Si votre crochet fournit un OutputPage comme argument faire usage du contexte fourni par celui-ci.BeforePageDisplay fournit une OutputPage, il suffit donc d'utiliser sa méthode getUser().

+0

OK, je suis arrivé, mais j'ai besoin de lire plus sur les objets PHP. Il y avait là le code final: 'public static function onBeforePageDisplay ($ wgOut)' et ' 'userid' => $ wgOut-> getUser() -> getId(), et' ' 'nom d'utilisateur' => $ wgOut-> getUser() -> getName(), '. J'ai également supprimé 'global $ wgUser;'. –

+0

Vous devriez probablement l'appeler '$ out', le préfixe' wg' étant conventionnellement réservé aux variables globales. – Tgr

+0

Bon point. Mis à jour à $ out. –