Memyc Entwicklung anhand einer Wissensdatenbank

Ziel: "Eine Wissensdatenbank soll es Webseitenbesuchern ermöglichen, dass Sie über Suchwörter einen entsprechenden Artikel finden. Ist das Suchwort nicht bekannt, soll der Webseitenbesucher über die Auswahl der Kategorie entsprechende Artikel gezeigt bekommen."

Mit der Erweiterung "Wissensdatenbank", ich nenne Sie nun Knowledgebase, soll Entwicklern die Möglichkeit gegeben werden sich in die Programmierung von Memyc einzufinden. Durch die strikte Trennung von Backup und Frontend kann man sich zuerst dem Backend zuwenden und dann in aller Ruhe das Frontend programmieren.

Knowledgebase im Backend

Zu allerest wird eine Basisstruktur benötigt, die nahezu für alle neuen Anwendungen anwendbar ist.

Lege innerhalb des Verzeichnis /conf/backend/ das Verzeichnis "knowledgebase" an. Innerhalb des Verzeichnisses "knowledgebase" werden für den ersten Teil vier Verzeichnisse benötigt: configuration, controller, model und view. Innerhalb des Verzeichnisses configuration wird die Datei Configuration.php mit folgendem Inhalt angelegt:

[?php
/**
 * memyc.org, © 2014-2018. All rights reserved.
 *
 * Memyc - Me and my content. The Frontend / Backend framework
 *
 * @author  Andreas Lehmann
 */
namespace memyc\beuser\knowledgebase {
    defined('SEC_VAR') or die('Direct access to this location is not allowed');
    /**
     * Class Configuration
     *
     * Configuration for knowledgebase
     *
     * @package memyc\beuser\knowledgebase
     */
    class Configuration
    {
        const DEPENDENCIES = 'memyc\backend\backendaccess';
        /**
         * @var array CSS files to load always
         */
        public $cssAlwaysLoadFileList = array(
            'etc/css/default.css',
        );
    }
}

defined('SEC_VAR') or die('Direct access to this location is not allowed'); verhindert, dass die Datei direkt über den Browser aufgerufen werden kann. Innerhalb der Konstante DEPENDENCIES wird kommasepariert festgelegt, von welchen anderen Modulen die Knowledgebase abhängt. In diesem Fall ist es memyc\backend\backendaccess, da die Knowledgebase erst nach dem Login aufgerufen wird.

Hierbei ist zu sagen, dass alle Module und deren Abhängigkeiten topologisch sortiert werden. Das bedeutet, dass alle hier angefügten Module erst vor dem eigentlichen Modul geladen werden. Dies ist notwendig, wenn man beispielsweise Daten aus einem Modul benötigt und dieses vorab geladen werden muss.

Innerhalb des Verzeichnis model wird die Datei Model.php mit folgendem Inhalt angelegt:

[?php
/**
 * memyc.org, © 2014-2018. All rights reserved.
 *
 * Memyc - Me and my content. The Frontend / Backend framework
 *
 * @author  Andreas Lehmann
 */
namespace memyc\beuser\knowledgebase{
    defined('SEC_VAR') or die('Direct access to this location is not allowed');
    /**
     * Class Model
     *
     * @package memyc\beuser\knowledgebase
     */
    class Model extends \memyc\bootstrap\mycbase\Model
    {
    }
}

Es wird nur von memyc\bootstrap\mycbase\Model abgeleitet wodurch eine Menge an Methoden für die Entwicklung bereitstehen.

Innerhalb des Verzeichnis view wird die Datei View.php mit folgendem Inhalt angelegt:

[?php
/**
 * memyc.org, © 2014-2018. All rights reserved.
 *
 * Memyc - Me and my content. The Frontend / Backend framework
 *
 * @author  Andreas Lehmann
 */
namespace memyc\beuser\knowledgebase {
    defined('SEC_VAR') or die('Direct access to this location is not allowed');
    /**
     * Class View
     *
     * View for knowledgebase
     *
     * @package memyc\beuser\knowledgebase
     */
    class View extends \memyc\bootstrap\mycbase\View
    {
    }
}

Hier wird von memyc\bootstrap\mycbase\View abgeleitet wodurch auch hier eine Menge an Methoden für die Entwicklung bereitstehen.

Die Datei Controller.php wird im Verzeichnis controller angelegt und enthält den folgenden Inhalt:

[?php
/**
 * memyc.org, © 2014-2018. All rights reserved.
 *
 * Memyc - Me and my content. The Frontend / Backend framework
 *
 * @author  Andreas Lehmann
 */
namespace memyc\beuser\knowledgebase{
    defined('SEC_VAR') or die('Direct access to this location is not allowed');
    /**
     * Class Controller
     *
     * @package memyc\beuser\knowledgebase
     */
    final class Controller extends \memyc\bootstrap\mycbase\ControllerBackend
    {
        /**
         * Controller constructor.
         *
         * @param \memyc\interfaces\Request $oRequest
         * @param \memyc\interfaces\Response $oResponse
         */
        public function __construct(\memyc\interfaces\Request $oRequest, \memyc\interfaces\Response $oResponse)
        {
            $this->oRequest = $oRequest;
            $this->oResponse = $oResponse;
            $this->oRegistry = \memyc\resources\Registry::getInstance();
        }
        /**
         * Route
         *
         * @return array
         */
        public function init()
        {
            $init[] = array();
            return $init;
        }
    }
}

Die Datei sorgt dafür, dass alle Anfragen, Requests, und alle Ausgaben, Response, als sog. Dependency Injection geladen werden. Das bedeutet: Alle Anfragen, die reinkommen, kann die Erweiterung auswerten und entsprechend entscheiden, ob in irgendeiner Weise darauf in Form eines Response reagiert werden soll.

Sind alle Dateien ordnungsgemäß angelegt, kann man im Backend unter dem Menüpunkt Setup > Modules unter den Backend Modulen den Eintrag "memyc\beuser\knowledgebase" sehen. Die Erweiterung wird also bereits geladen.

Im nächsten Schritt werden im Backend wichtige Menüpunkte angelegt.

Hauptmenüpunkt im Backend

Es wird ein Menüpunkt benötigt, um die Knowledgebase verwalten zu können. Dieser Menüpunkt soll als Kachel im Hauptmenü vorhanden sein.

Dazu wird die Datei Controller.php aufgerufen. Innerhalb der Methode init() wird nach $init[] = array(); der folgende Eintrag in eine neue Zeile eingefügt.

$init[] = array(
    'description' => 'Show title of the extension at the main menu',
    'url' => 'backend/*',
    'handler' => array(
        'component' => 'Controller',
        'action' => 'getMainMenu' ),
    'output' => array(
        'placeholder'=>'#backendmenu',
        'row'=>'500')
);

Das bedeutet, dass immer wenn in der URL etwas wie /backend aufgerufen wird, innerhalb von Controller die Methode getMainMenu() aufgerufen wird. Die Ausgabe wird in #backendmenu an Position 500 gepackt. Damit nun etwas sichtbar wird, wird nach der Methode init() der folgende Inhalt eingefügt:

/**
 * Knowledge Base main menu
 *
 * @return stdClass
 */
public function getMainMenu()
{
    $oStdClass = new stdClass();
    $oStdClass->name = 'Knowledgebase';
    $oStdClass->description = 'Manage your knowledge';
    $oStdClass->url = 'backend/knowledgebase';
    $oStdClass->icon = 'fa fa-leanpub';
    $oStdClass->cssClass = 'knowledgebase';
    return $oStdClass;
}

Gehe nun in das Hauptmenü. Dort sollte nun eine neue Kachel mit dem Namen "Knowledgebase" auftauchen. Wenn auf diese Kachel geklickt wird, bleibt man innerhalb des Backends, findet aber noch keine Inhalte vor.