web-dev-qa-db-fra.com

Couche FTP - Comment faire la journalisation?

J'ai une extension personnalisée sur laquelle j'ai besoin d'écrire des informations dans un fichier journal. Pour cela j'utilise ce code:

jimport('joomla.log.log'); // Include the log library
$priorities = JLog::ALL ^ JLog::WARNING; // exclude warning (because of deprecated)
$logFileName = 'myextension.log.php';
$logCategory = 'com_myextension';
try {
    JLog::addLogger(array('text_file' => $logFileName), $priorities, $logCategory);
    JLog::add($msg, JLog::INFO, $logCategory);
} catch (Exception $e) {
    // logging failed because of unknown reasons, no further action / attempts
}

Cela fonctionne parfaitement sur toutes les installations Joomla 2.x à 3.x, à l'exception de celles pour lesquelles la couche FTP est activée.

J'ai lu sur la liste de Joomla Dev CMS que JLog ne supporte pas la couche FTP.

Comment puis-je y faire face? Ou plus précisément: comment puis-je écrire ma propre version de JLogLoggerFormattedtext qui utilise FTP lorsque cette couche est activée?

Merci!

4
hbit

Vous pouvez remplacer la classe JLogLoggerFormattedtext par votre propre version de deux manières:

plugin système

Via un plugin System qui déclenche onAfterInitialise ():

/**
* Registers core library overrides.
*
* @return   void
*/
public function onAfterInitialise()
{
    // Override /libraries/joomla/log/logger/formattedtext.php 
    JLoader::register('JLogLoggerFormattedtext', JPATH_LIBRARIES . '/custom/core-overrides/joomla/log/logger/formattedtext.php');
}

Cependant, au moment où onAfterInitialise () est appelée, de nombreuses classes de base ont déjà été initialisées et cette méthode ne fonctionnera donc pas. Je ne sais pas si JLogLoggerFormattedtext tombe dans cette catégorie ou non.

Core Hack

Premièrement, évidemment, les piratages sont mauvais. Mais je n'ai pas encore trouvé de solution efficace lorsque la méthode du plugin ne fonctionne pas.

Modifiez /ROOT/index.php et/ou /ROOT/administrator/index.php (selon si vous avez besoin de cette modification pour les exécutions en back-end ou front-end. Mettez ce code:

require_once JPATH_LIBRARIES . '/custom/core-overrides/coreOverrideAutoloader.php';
spl_autoload_register('CoreOverrideAutoloader::loader', true, true);

directement avant:

require_once JPATH_BASE . '/includes/framework.php';

(les deux fichiers index.php ont cette ligne)

Créez /custom/core-overrides/coreOverrideAutoloader.php:

<?php
class CoreOverrideAutoloader
{

    public static $requested = array();
    public static $filesLoaded = array();
    public static $filesNotLoaded = array();

    public static function loader($class)
    {
        CoreOverrideAutoloader::$requested[] = $class;

        $filename = __DIR__ . '/' . strtolower($class) . '.php';
        $file=$filename;

        if (!file_exists($file))
        {
            CoreOverrideAutoloader::$filesNotLoaded[] = $file;
            return false;
        }
        include $file;
        CoreOverrideAutoloader::$filesLoaded[] = $file;
    }
}

Créez ensuite /custom/core-overrides/jlogloggerformattedtext.php

Cela contiendra votre classe JLogLoggerFormattedtext modifiée:

<?php
defined('JPATH_PLATFORM') or die;

jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');

class JLogLoggerFormattedtext extends JLogLogger
{
    ...
}

Créer tout autre remplacement de bibliothèque est aussi simple que de créer des fichiers jclassname.php supplémentaires dans ce même dossier.

1
Drew G