Location: PHPKode > projects > Boardnukers VKP Aka TIS > htdocs/includes/modules.php
<?php
/**
 * Boardnukers VKP
 *
 * LIZENZ
 *
 * Dieses Programm ist freie Software; Sie können sie beliebig verteilen
 * und/oder Änderungen vornehmen, solange Sie dieses unter den
 * Lizenzbedingungen der Version 2 oder höher der GNU General Public
 * License (GPL), veröffentlicht von der Free Software Foundation tun.
 *
 * Dieses Programm wurde in der Hoffnung erstellt, dass es für Sie
 * nützlich sein könnte. Es wird jedoch ohne jeden Anspruch auf
 * Gewährleistung veröffentlicht. Sie können auch nicht davon ausgehen,
 * dass das Programm Dinge verrichtet, wie es erwartet wird.
 *
 * Lesen Sie die Lizenzbedinguneg unter der URL
 * http://www.gnu.org/copyleft/gpl.html für weitere Details.
 *
 * @author Hinrich Donner
 * @copyright Hinrich Donner, (c) 2004
 * @version $Revision: 1.1 $
 * @since 13.07.2004
 * @package TIS
 * @subpackage API
 * @category Module
 * @link http://phpnuke-vkp.org/
 */

/**
 * vkpModule
 *
 * Diese Klasse enthält und verwaltet die Informationen rund um ein Modul.
 *
 * @since 5.5.1
 * @version 2
 * @author Hinrich Donner
 * @copyright Hinrich Donner, (c) 2004
 * @see vkpModules
 */
class vkpModule extends vkpDbComponent
{
    /**
     * _installed
     *
     * Speichert den Installationsstatus.
     *
     * @var bool
     * @access protected
     * @see vkpModule::IsInstalled()
     */
    var $_installed;

    /**
     * _path
     *
     * Der Pfad zum Modul.
     *
     * @var string
     * @access protected
     * @see vkpModule::GetPath()
     */
    var $_path;

    /**
     * mid
     *
     * Die ID des Datensatzes in der Datenbank.  Wenn es sich um einen neuen Datensatz
     * handelt, wird -1 verwendet.
     *
     * @var int
     */
    var $mid;

    /**
     * title
     *
     * Der wirkliche Name des Modules. Dieser ist identisch mit dem Verzeichnisnamen
     *
     * @var string
     */
    var $title;

    /**
     * custom_title
     *
     * Der anzuzeigende Name des Moduls.
     *
     * @var string
     */
    var $custom_title;

    /**
     * active
     *
     * Der Status des Moduls.
     *
     * @var bool
     */
    var $active;

    /**
     * view
     *
     * Der Zugriffsmode für das Modul.
     *
     * @var int
     */
    var $view;

    /**
     * main_module
     *
     * Diese Eigenschaft zeigt an, ob es sich bei dem Modul um das Startmodul handelt.
     *
     * @var bool
     */
    var $main_module;

    /**
     * vkpModule
     *
     * Der Konstruktor.
     *
     * @param mixed $record Ein Array oder eine abgeleitete Instanz mit den Daten
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function vkpModule($record = null)
    {
        parent::vkpDbComponent();
        if ($record === false)
            $this->_Init();
        else $this->Copy($record);
    }

    /**
     * _Init
     *
     * Setzt die Default-Eigenschaften.
     *
     * @access protected
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function _Init()
    {
        parent::_Init();
        $this->mid          = -1;
        $this->title        = '';
        $this->custom_title = '';
        $this->active       = false;
        $this->view         = VKP_VIEW_AUTHOR;
        $this->main_module  = false;
    }

    /**
     * _Free
     *
     * Gibt die Daten frei.
     *
     * @access protected
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function _Free()
    {
        parent::_Free();
        unset($this->mid,
              $this->title,
              $this->custom_title,
              $this->active,
              $this->view,
              $this->main_module,
              $this->_installed,
              $this->_path);
    }

    /**
     * _CopyFromArray
     *
     * Kopiert die Daten aus einem Array.
     *
     * @param array $source Die Daten
     * @return bool TRUE, wenn vollständig
     * @access protected
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     * @see vkpModule::Copy()
     */
    function _CopyFromArray(&$source)
    {
        $this->Clear();
        foreach ($source as $key => $value)
        {
            switch($key)
            {
                case 'mid':
                    $value = (int) $value;
                    if ($value > 0)
                        $this->mid = $value;
                    break;

                case 'title':
                    $this->title = vkpVarPrepForOs(substr($value, 0, 255));
                    break;

                case 'custom_title':
                    $this->custom_title = substr($value, 0, 255);
                    break;

                case 'active':
                case 'main_module':
                    $value = (int) $value;
                    $this->$key = (($value == 1) ? true : false);
                    break;

                case 'view':
                    if (($value == VKP_VIEW_ALL)
                            || ($value == VKP_VIEW_USER)
                            || ($value == VKP_VIEW_AUTHOR)
                            || ($value == VKP_VIEW_GUEST))
                        $this->view = $value;
                    break;
            }
        }
        // Bei der Anlage muss mindestens der Title (also Verzeichnisname) vorhanden sein.
        //
        if (empty($this->title))
            return false;
        // Titel als Default anpassen
        //
        if (empty($this->custom_title))
            $this->custom_title = str_replace('_', ' ', $this->title);
        return true;
    }

    /**
     * _CopyFromObject
     *
     * Kopiert die Daten von einer abgeleiteten Klasse.
     *
     * @param vkpModule $source Die Daten
     * @return bool Immer TRUE
     * @access protected
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     * @see vkpModule::Copy()
     */
    function _CopyFromObject(&$source)
    {
        $this->mid          = $source->mid;
        $this->title        = $source->title;
        $this->custom_title = $source->custom_title;
        $this->active       = $source->active;
        $this->view         = $source->view;
        $this->main_module  = $source->main_module;
        return true;
    }

    /**
     * Copy
     *
     * Kopier die Daten von einer Quelle.  Als Quelle kommt ein Array
     * oder eine abgeleitete Klasse in Frage.
     *
     * @param mixed $source Ein Array oder eine abgeleitete Klasse
     * @return bool TRUE, wenn Fehlerfrei kopiert
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function Copy($source)
    {
        if (!isset($source) || empty($source))
            return false;
        elseif (is_array($source))
            return $this->_CopyFromArray($source);
        elseif (is_object($source && is_a($source, 'vkpModule')))
            return $this->_CopyFromObject($source);
    }

    /**
     * GetPath
     *
     * Liefert das Verzeichnis des Moduls
     *
     * @return string Das Verzeichnis mit abschließendem Slash
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function GetPath()
    {
        if (!isset($this->_path))
            $this->_path = sprintf(VKP_MODULES_DIR . '/%s/',
                                   $this->title);

        return $this->_path;
    }

    /**
     * GetFilename
     *
     * Liefert einen absoluten Pfad einer Datei.
     *
     * @param string $filename Der Dateiname
     * @return string Der vollständige Pfad
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function GetFilename($filename)
    {
        return $this->GetPath() . vkpVarPrepForOs($filename) . '.php';
    }

    /**
     * GetMainFilename
     *
     * Liefert den Namen der Hauptdatei.
     *
     * @param
     * @return
     * @access public
     * @version 1
     * @since
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function GetMainFilename()
    {
        return $this->GetPath() . 'index.php';
    }

    /**
     * GetLink
     *
     * Liefert einen relativen Link auf das Modul zurück.
     *
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function GetLink($args = array())
    {
        if (count($args) == 0)
            return (($this->main_module) ? 'index.php' : VKP_MODULES_URI . '?name=' . $this->title);
        $result = VKP_MODULES_URI . '?name=' . $this->title . '&amp;';
        foreach ($args as $name => $value)
            $result .= $name . '&amp;' . urlencode($value);
        return $result;
    }

    /**
     * IsInstalled
     *
     * Diese Methode prüft, ob das angegebene Modul installiert, also im Dateisystem
     * vorhanden ist
     *
     * @param
     * @return
     * @access public
     * @version 1
     * @since
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function IsInstalled()
    {
        if (!isset($this->_installed))
            $this->_installed = file_exists($this->GetMainFilename());
        return $this->_installed;
    }

    /**
     * IsMissing
     *
     * Diese Methode prüft, ob ein Modul wirklich existiert.
     *
     * @return bool TRUE, wenn das Modul fehlt.
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function IsMissing()
    {
        return !$this->IsInstalled();
    }

    /**
     * Delete
     *
     * Entfernt die Modulinformationen aus der Datenbank.
     *
     * @return bool FALSE, wenn ein Fehler aufgetreten ist.
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function Delete()
    {
        if ($this->main_module)
        {
            $this->system->log->AddError(sprintf('The module "%s" is the main module and can\'t be deleted!',
                                                 $this->title));
            return false;
        }
        if ($this->mid < 1)
        {
            $this->system->log->AddError(sprintf('The module "%s" is not in your database!',
                                                 $this->title));
            return false;
        }
        $sql = sprintf('DELETE FROM `%s_modules` WHERE `mid`=\'%d\'',
                       $this->system->config->prefix,
                       $this->mid);
        $result = $this->_Query($sql);
        $this->system->log->AddNormal(sprintf('The module "%s" (%d) is removed from the database!',
                                              $this->title,
                                              $this->mid));
        $this->mid = -1;
        return $result;
    }
}

/**
 * vkpModules
 *
 * Diese Klasse enthält eine Liste aller installierten Module.
 *
 * @version 2
 * @since 5.5.1
 * @author Hinrich Donner
 * @copyright Hinrich Donner, 2003-2004
 * @see vkpModule
 */
class vkpModules extends vkpListDbComponent
{
    /**
     * _main_module
     *
     * Enthält eine Instanz des Hauptmoduls.
     *
     * @var vkpModule
     * @access protected
     * @since 5.5.2
     * @see vkpModules::GetMain()
     */
    var $_main_module;

    /**
     * vkpModules
     *
     * Der Konstruktor.
     *
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function vkpModules()
    {
        parent::vkpListDbComponent();
    }

    /**
     * Init
     *
     * Die Initialisierung der Klasse.
     *
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function Init()
    {
        $this->Load();
        $must_reload = false;
        foreach ($this->items as $key => $module)
        {
            // Modul verschwunden?
            //
            if ($module->IsMissing())
            {
                $module->Delete();
                $must_reload = true;
                continue;
            }
        }
        // Zweiter Durchgang, falls die Datenbank verändert wurde.
        //
        if ($must_reload)
            $this->Load();
    }

    /**
     * Load
     *
     * Läd alle Datensätze aus der Datenbank.
     *
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function Load()
    {
        $this->Clear();
        $sql = sprintf('SELECT t1.mid,
                               t1.title,
                               t1.custom_title,
                               t1.active,
                               t1.view,
                               (t2.main_module = t1.title) as `main_module`
                        FROM `%s_modules` as `t1`,
                             `%s_main` as `t2`
                        ORDER BY t1.custom_title ASC,
                                 t1.title ASC',
                       $this->system->config->prefix,
                       $this->system->config->prefix);
        if (false === ($dbr = $this->_Query($sql)))
            die('Unable to read the module table');
        while (!$dbr->EOF)
        {
            $this->Add(new vkpModule($dbr->GetRowAssoc(false)));
            $dbr->MoveNext();
        }
        $dbr->Close();
        return true;
    }

    /**
     * Clear
     *
     * Löscht die enthaltenen Daten
     *
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function Clear()
    {
        unset($this->_main_module);
        parent::Clear();
    }

    /**
     * GetByTitle
     *
     * Liefert ein Modul anhand dessen Namen.
     *
     * @param string $title Der Name.
     * @return vkpModule Das Modul oder FALSE
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function &GetByTitle($title)
    {
        foreach ($this->items as $key => $module)
        {
            if ($module->title == $title)
                return $this->items[$key];
        }
        return false;
    }

    /**
     * IsActive
     *
     * Prüft, ob das angegebene Modul aktiv ist
     *
     * @param string $name Der Name des Moduls
     * @return bool TRUE, wenn das Modul existiert und aktiv ist.
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function IsActive($name)
    {
        if (empty($name) || (false === ($module =& $this->GetByTitle($name))))
            return false;
        return $module->active;
    }

    /**
     * GetMain
     *
     * Liefert eine Instanz des Startmoduls.
     *
     * @return vkpModule
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function &GetMain()
    {
        if (!isset($this->_main_module))
        {
            $this->_main_module = false;
            foreach ($this->items as $key => $module)
            {
                if (!$module->main_module)
                    continue;

                $this->_main_module =& $this->items[$key];
                    break;
            }
        }
        return $this->_main_module;
    }

    /**
     * GetMainTitle
     *
     * Liefert den Namen des Startmoduls
     *
     * @return string Der Titel
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     * @see vkpModule::GetMain()
     */
    function GetMainTitle()
    {
        if (false === ($module =& $this->GetMain()))
            return '';
        return $module->title;
    }

    /**
     * Current
     *
     * Liefert das zur Zeit aktive Module.
     *
     * @return string Der Name des laufenden Moduls
     * @access public
     * @version 1
     * @since 5.5.2
     * @author Hinrich Donner
     * @copyright Hinrich Donner, (c) 2004
     */
    function Current()
    {
        $result = $this->system->request_vars->Get('name', false, $this->GetMainTitle());
        if (empty($result))
            $result = $this->GetMainTitle();
        return $result;
    }
}

/*
 * $Log: modules.php,v $
 * Revision 1.1  2004/07/13 11:49:25  hdonner
 * - Strukturänderungen
 *
 */
?>
Return current item: Boardnukers VKP Aka TIS