WebRex - Open Source CMS

Im Entwickler-Forum können Implementierungsdetails sowie Alternativen der Umsetzung diskutiert werden. // Here, developers can discuss implementation details of features of their projects.
TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

WebRex - Open Source CMS

Beitrag von TipTop » 10.12.2011, 23:55:57

Guten Abend!

Ich betreibe etwa seit einem halben Jahr ein eigenes Open Source CMS namens WebRex. Bisher habe ich immer auf eine eigene Klassen-Bibliothek gesetzt. Als Architekturmuster habe ich MVC gewählt, verschiedene Pattern integriert, aber jetzt bin ich dann doch mal an die Grenzen mit dieser Lib gestoßen. Daher hab ich mich entschieden, das CMS auf ein Framework umzustellen. Hab mir jetzt einige FWs grob angesehen und das APF hat einen richtig angehemen Eindruck hinterlassen :)

Ich hätte da jetzt mal ne Frage bzg. der Verzeichnisstruktur. Bisher sah die von meinem CMS folgendermaßen aus:
  • Rootverzeichnis
    • acp (admin control panel)
      • controllers
      • models
      • views
      • css
      • js
      • images
      • index.php
    • library
      • javascript (CodeMirror, CKEditor, jQuery UI, jQuery, Jquery-WebRex-Plugin)
      • php (FrontController, Registry, DB-Abstraktionen, Session Manager, Template-View-Pattern, ...)
    • controllers
    • models
    • views
    • layouts (extension - sowas wie Template/Themees in anderen CMS)
    • modules (extension)
    • upload (verzeichnis, in welches Benutzer über das Admin Control Panel Datein hochladen können)
    • installation
      • index.php
      • webrex.sql
    • index.php
    • configuration.php
Wie kann/sollte die Verzeichnisstruktur meines CMS in Verbindung mit APF aussehen?

In der Doku wird erwähnt, man sollte APF außerhalb des Document-Root-Verzeichnises aufbewahren, sodass es nicht für jeden erreichbar ist. Sollte es innerhalb des Document-Root-Verzeichnises vorzufinden sein, soll man das Ganze per .htaccess absichern.
Ersteres ist bei nem CMS etwas unkomfortabel, weil sich ein Laie dann ziemlich schwer tun wird, abgesehen davon muss man dann die Dateien des CMS aufteilen/auseinandernehmen.
Letzeres (.htaccess) ist ja meines Wissens auf nem ISS Webserver gar nicht vorhanden!?
Gibt es sonst noch eine Möglichkeit?



Grüße,
Nico

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: WebRex - Open Source CMS

Beitrag von dr.e. » 11.12.2011, 14:46:31

Hallo Nico,

freut mich, dass du das APF als gute Basis für dein CMS erachtest. :) Nachdem Ralf, Jan und ich ebenso CMS-Komponenten auf Basis des APF entwickelt haben, gehe ich davon aus, dass es für dein CMS ebenfalls anwendbar ist.
Wie kann/sollte die Verzeichnisstruktur meines CMS in Verbindung mit APF aussehen?
Grundsätzlich könntest du deine Struktur 1:1 übernehmen, da das APF keine verpflichtenden Strukturen vorgibt, sondern du einfach in der Applikation deine Ordner - wie du sie definiert hast - addressieren kannst. Ich persönlich würde jedoch einige Änderungen vornehmen um die Struktur in Richtung Komponenten-Struktur zu treiben:

Code: Alles auswählen

/apps/ --> Software-Komponenten für Webseite und ACP
    core/
    config/
    modules/
    tools/
    extensions/
    sites/
        project_a/ --> Konkrete Webseite
    webrex/ --> ACP
        core/
        component_a/ --> Komponente A (z.B. Seitenverwaltung)
            biz/
            data/
            pres/
                templates/
                controller/
        component_b/ --> Komponente A (z.B. Benutzerverwaltung)
            biz/
            data/
            pres/
                templates/
                controller/
/acp/
    css/ --> CSS für ACP
    js/ --> CKEditor, ...
    images/
    installation/
        index.php
        webrex.sql
    index.php
/media --> Medien-Dateien (idealerweise eigene Domain) aller Art
    upload/ 
    module_a/
    module_b/
    ...
/website/
    index.php
In der Doku wird erwähnt, man sollte APF außerhalb des Document-Root-Verzeichnises aufbewahren, sodass es nicht für jeden erreichbar ist. Sollte es innerhalb des Document-Root-Verzeichnises vorzufinden sein, soll man das Ganze per .htaccess absichern.
Korrekt. Im APF werden z.B. Datenbank-Zugangsdaten in ini-Dateien abgelegt, die von aussen lesbar wären. Sofern du das also nicht absicherst, baust du dir eine Sicherheitslücke ein.
Ersteres ist bei nem CMS etwas unkomfortabel, weil sich ein Laie dann ziemlich schwer tun wird, abgesehen davon muss man dann die Dateien des CMS aufteilen/auseinandernehmen.
In meiner Struktur hatte ich das so vorgesehen. Grundsätzlich kannst du das ACP jedoch auch in dein Package direkt inkludieren - so wie dein Ansatz - und per .htaccess schützen.
Letzeres (.htaccess) ist ja meines Wissens auf nem ISS Webserver gar nicht vorhanden!?
Gibt es sonst noch eine Möglichkeit?
Für den IIS kannst du die web.config entsprechend anpassen, damit bestimmte Verzeichnisse nicht zugegriffen werden dürfen. Eine gute Resource ist http://learn.iis.net/page.aspx/557/tran ... webconfig/.

Vor einiger Zeit hatte ich mal den SVN-Stand meiner CMS-Implementierung gepostet. Vielleicht kannst du dir daraus ein paar Anregungen ziehen. Alternativ haben Ralf (de/viewtopic.php?f=11&t=759) und Jan (de/viewtopic.php?f=11&t=615) ebenfalls CMS-Tools erstellt.

Solltest du weitere Fragen haben, dann her damit! ;)
Viele Grüße,
Christian

TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 11.12.2011, 16:09:58

Hi und danke für die Antwort. :)


Zum Thema Sicherheit:
Im CMS-Package muss ich nur eine .htaccess und web.config Datei mitliefern, je nach Webserver wird dann eine von den beiden Datein ausgeführt. In beiden Datein müsste ich lediglich den Aufruf der Konfigurations (.ini) Datei unterbinden!? Und dann wärs auch kein Problem, wenn man das ganze CMS-Paket (also inkl. APF) in das Dokument-Root Verzeichnis läd, oder gibt es da sonst noch sensible Datein?

wwwroot/apps/config/webrex/configuration.ini <- die Konfigurationsdatei müsste ich hier (?) anlegen. Da kommen dann Datenbankdaten und andere Daten die mein CMS betreffen rein, oder?



Nun zur Verzeichnisstruktur nochmal. So wie ich das verstanden habe, kommen in /apps/sites/ die Controller, Models und Templates/Views rein, die für den Frontend benötigt werden!? Ich dachte daran, den /wwwroot/apps/webrex/ Ordner in frontend und backend zu unterteilen. Somit befindet sich in apps nur ein WebRex-spezifischer Ordner (eben webrex).

Was hat es mit /website/index.php auf sich? Benötige ich diesen website Ordner überhaupt? Könnte ich ja weg lassen, da ja /wwwroot/index.php im Prinzip die Bootstrap Datei der eigentlichen Website (des Frontends) ist?

Wenn ich die Verzeichnisstruktur, wie oben erwähnt, anpasse, sieht sie folgendermaßen aus:
  • /wwwroot/
    • apps/
      • core/
      • config/
        • webrex/
          • configuration.ini
      • modules/
      • tools/
      • extensions/
      • webrex/
        • core/
        • frontend/
          • component_a/
            • biz/
            • data/
            • pres/
              • templates/
              • controller/
        • backend/
          • component_a/
            • biz/
            • data/
            • pres/
              • templates/
              • controller/
    • acp/
      • css/
      • js/
      • images/
      • index.php
    • media/
      • upload/
      • layouts/
      • modules/
    • installation/
      • index.php
      • webrex.sql
    • index.php
Die /wwwroot/index.php wäre demnach die Bootstrap Datei für den Frontend, die /wwwroot/acp/index.php für den Backend des CMS.

In /wwwroot/apps/webrex/core/ kann ich vermutlich Klassen/Libs reinsetzen, die ich für WebRex benötige - sowas wie AbstractController oder eventuell 3rd Party Libs wie PHPMailer oder die PclZip-Lib?



Grüße
Nico

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von Screeze » 11.12.2011, 16:46:41

Hi,
m CMS-Package muss ich nur eine .htaccess und web.config Datei mitliefern, je nach Webserver wird dann eine von den beiden Datein ausgeführt. In beiden Datein müsste ich lediglich den Aufruf der Konfigurations (.ini) Datei unterbinden!? Und dann wärs auch kein Problem, wenn man das ganze CMS-Paket (also inkl. APF) in das Dokument-Root Verzeichnis läd, oder gibt es da sonst noch sensible Datein?
Alle sensiblen Daten liegen im /config/ Ordner, sofern dieser geschützt ist, ist alles gut.
wwwroot/apps/config/webrex/configuration.ini <- die Konfigurationsdatei müsste ich hier (?) anlegen. Da kommen dann Datenbankdaten und andere Daten die mein CMS betreffen rein, oder?
nicht ganz, normalerweise bekommt jedes modul unter seinem eigenen Namespace im config Ordner eine eigene Konfigurationsdatei.
Die Datenbankzugänge sollten also, sofern du die DB-Funktionen des APF nutzen willst unter /wwwroot/apps/config/core/database/{CONTEXT}/{ENVIRONMENT}_connections.ini liegen. Context und Environment kann per einstellung auch deaktiviert und dann weggelassen werden, sofern nicht benötigt.
Weitere Details: http://adventure-php-framework.org/Seit ... ionManager

Grüße,
Ralf

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: WebRex - Open Source CMS

Beitrag von dr.e. » 11.12.2011, 19:35:27

Hallo Nico,
Die /wwwroot/index.php wäre demnach die Bootstrap Datei für den Frontend, die /wwwroot/acp/index.php für den Backend des CMS.
Das funktioniert so.
In /wwwroot/apps/webrex/core/ kann ich vermutlich Klassen/Libs reinsetzen, die ich für WebRex benötige - sowas wie AbstractController oder eventuell 3rd Party Libs wie PHPMailer oder die PclZip-Lib?
Korrekt. Wie gesagt, das ist nur ein Vorschlag, du könntest die Daten auch an einen anderen Ort legen - vorausgesetzt dieser ist unter /apps.

HInsichtlich der Konfiguration hat dir Ralf schon einen Hinweis gegeben. Mehr dazu findest du unter http://adventure-php-framework.org/Seit ... figuration.
Viele Grüße,
Christian

TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 11.12.2011, 20:19:07

Gut, dann is ma alles klar. Danke euch beiden für die Hilfe! :)

TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 12.12.2011, 12:57:56

Das Ganze ist jetzt doch komplizierter als ich es mir vorgestellt habe. Ich glaube, ich hab noch nicht so wirklich den Durchblick.
Verständnisprobleme habe ich derzeit im Routing.


Habe folgenden Artikel gefunden: http://wiki.adventure-php-framework.org ... controller
Diesem zufolge wären FrontActions das selbe wie Filter-Ketten!? Für den Admin Control Panel müsste ich z.B. eine Login-FrontAction anlegen, sodass bei jedem Request geprüft wird, ob eine Session existiert bzw. falls nicht, dass ein Login-Formular ausgegeben wird, oder?

In APF steckt
-> das V von MVC in /pres/templates,
-> das C von MVC in /pres/controllers,
-> und das M von MVC in /biz/
In /data/ befindet sich ein Mapper, der eine Verbindung zwischen Model und Datenbank errstellt - ist das soweit richtig!?


Bei mir sah das Routing immer so aus, dass man per URL 2 Parameter übergeben hat: http://adresse.tld/?controller=NameDesControllers&action=MethodeDesControllers
Demnach wurde eine Controller-Klasse mit dem per controller-Paramenter übergebenen Namen instanziiert - anschließend wurde die per action-Parameter übergebene Methode des Controllers aufgerufen.


Wie sieht denn das beim APF aus? In der bootstrap Datei definiere ich ja per...

Code: Alles auswählen

$frontControllerObejct->start('applikation', 'index'); 
...welches Template standardmäßg aufgerufen wird, sofern kein anderes Template per URL übergeben wird? Das Template instanziiert dann über den Controller-Taglib in der ersten Zeile einen (Dokument-)Controller!? Das H von MVC kommt deswegen dazu, da ich in dem aufgerufenen Template über eine TagLib (nur welche??) weitere Templates einbinden kann, welche wiederum eigene (Dokument-)Controller beinhalten dürfen!?

Welche parameter muss ich in der URL übergeben, damit ich andere Templates und somit andere Controller selektieren kann?


Grüße
Nico

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von Screeze » 12.12.2011, 13:01:07

Welche parameter muss ich in der URL übergeben, damit ich andere Templates und somit andere Controller selektieren kann?
Das definierst du dir frei. Einfachste Möglichkeit wäre, im angegebenen Start-Template eine <core:importdesign /> Taglib zu definieren. Dort kannst du angeben welcher parameter beachtet werden soll, und aus welchem Ordner die Templates geladen werden sollen.
Siehe http://adventure-php-framework.org/Seit ... portdesign

Hilft das?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: WebRex - Open Source CMS

Beitrag von dr.e. » 12.12.2011, 13:26:46

Hallo Nico,

ich antworte dir heute Abend nochmal ausführlicher, sollte dir der Post von Ralf nicht direkt weiterhelfen.
Viele Grüße,
Christian

TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 12.12.2011, 13:33:40

Screeze hat geschrieben:
Welche parameter muss ich in der URL übergeben, damit ich andere Templates und somit andere Controller selektieren kann?
Das definierst du dir frei. Einfachste Möglichkeit wäre, im angegebenen Start-Template eine <core:importdesign /> Taglib zu definieren. Dort kannst du angeben welcher parameter beachtet werden soll, und aus welchem Ordner die Templates geladen werden sollen.
Siehe http://adventure-php-framework.org/Seit ... portdesign

Hilft das?
Ja, danke.
Aber wenn ich das jetzt richtig verstanden habe, würde somit das Template, welches ich in der bootstrap Datei mittels frontControllerObject::start() definiere, immer aufgerufen werden - sprich für jede Seite. Für den Login und die erste Seite im Admin Control Panel ist das noch in Ordnung, aber spätestens wenn ich im ACP bin und eine andere Seite aufrufen möchte, soll das eig. über Ajax geschehen. Und durch einen Request wie z.B. ?page=layouts und den folgenden JS-Code...

Code: Alles auswählen

        function loadPage(url) 
        {    
            $('#content').fadeOut(300, function() {
                $('#content').empty();
                $('#webrex-page-loader').fadeIn(300);
                $.ajax({
                    url: url,
                    cache: false,
                    success: function(content) 
                    {
                        $('#webrex-page-loader').fadeOut(300, function() {
                            $('#content').html(content).fadeIn(500);
                            // ...
                        });
                    }
                });            
            });
        } 
...würde immer das komplette HTML Dokument in den div mit der ID content geladen werden - dann hätte ich im HTML Dokument noch ein 2. HTML Dokument was natürlich nicht geht. Ich bräuchte also eine Möglichkeit, lediglich den Inhalt zu laden - den Code, der vom frontControllerObject::start()-Template kommt benötige ich nicht. Wie realisiert man das? Gibts im APF dafür eigene Methoden?

Grüße

Megger
Beiträge: 1233
Registriert: 04.11.2008, 10:57:37

Re: WebRex - Open Source CMS

Beitrag von Megger » 12.12.2011, 13:56:13

Das könntest du über eine Action lösen, welche du mit AJAX ansprichst. Diese Action liefert dir dann sozusagen nur noch den entsprechenden Inhalt und nicht mehr das komplette Gerüst drumherum
Tutorial: Browsergame mit dem APF (Die ersten Parts handeln von Installation und Inbetriebnahme des APFs, deswegen sicherlich auch für alle Nicht-Browsergame-Programmierer interessant)

APF-Version
  • Entwicklung: 2.0
  • Produktiv: 1.15

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von Screeze » 12.12.2011, 13:56:20

Hierfür habe ich immer eine AjaxAPI als Frontcontroller-Action geschrieben, welche dann nur bestimmte Inhalte ausliefert, und nicht mehr das komplette Design.
Ich hatte vor einiger Zeit mal meine Vorgehensweise im Wiki beschrieben, vielleicht hilft dir das etwas, aber Vorsicht, das ist nicht mehr ganz auf dem aktuellsten Stand vom APF.
http://wiki.adventure-php-framework.org ... nd_das_APF

Wenn du in einer dieser Actions dann nur ein bestimmtes Template ausliefern willst, kannst du in der Action einfach ein neues Page() Objekt erzeugen mit dem bestimmten Template. Siehe http://wiki.adventure-php-framework.org ... _einbinden

TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 12.12.2011, 16:10:32

Hab mich nun so entschieden, Ajax nur in wenigen Bereich einzusetzten, womit es anfangs keine Rolle spielt. Ich habe nun versucht mittels taglib und eigener taglib Klasse das per URL ausgewählte Template zu laden, allerdings wird, so wie es aussieht, von meiner taglib Klasse erst gar kein Objekt erzeugt.

Hier die index.html, welche ich in frontControllerObject->start() anführe:

Code: Alles auswählen

<!DOCTYPE html>
<html>
    <head>
	    <title>WebRex :: Admin Control Panel</title>
	    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<meta name="robots" content="noindex, nofollow" />	
	</head>
	
	<body>
		<div id="content">
		    <core:addtaglib namespace="webrex::core::taglib" prefix="html" class="content" /> 
		</div>
	</body>
</html>

wwwroot/apps/webrex/core/taglib/html_taglib_content.php:

Code: Alles auswählen

<?php
import('tools::request', 'RequestHandler');
import('core::registry', 'Registry');

class html_taglib_content extends core_taglib_importdesign
{
    public function __construct()
    {
        parent::__construct();
    }
    
    public function onParseTime()
    {
        $component = RequestHandler::getValue('component', 'pages');
        $page      = RequestHandler::getValue('page', 'index');
            
        $pathToPage = Registry::retrieve('apf::core', 'URLBasePath') . '/' . $component . '/' . $page . '.html';    
            
        // show the content of the called page
        if (file_exists($pathToPage)) {
            $this->setAttribute('namespace', 'webrex::backend::' . $component . '::pres::templates');
            $this->setAttribute('template', $page); 
            return true;
        }
        
        // show 404.html because the componente or page does not exists
        $this->setAttribute('namespace', 'webrex::backend');
        $this->setAttribute('template', '404'); 
            
        parent::onParseTime();        
    }
} 

Was übersehe ich :?:
Zuletzt geändert von TipTop am 12.12.2011, 16:18:22, insgesamt 1-mal geändert.

jprangenberg
Beiträge: 410
Registriert: 16.08.2010, 22:14:54

Re: WebRex - Open Source CMS

Beitrag von jprangenberg » 12.12.2011, 16:16:16

TipTop hat geschrieben:Was übersehe ich :?:
Du musst noch <html:content /> unter dem AddTagLib hinzufügen.

TipTop
Beiträge: 193
Registriert: 25.08.2011, 22:37:08
Wohnort: Klagenfurt, Österreich
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 12.12.2011, 17:27:42

Danke, klappt jetzt! :D

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste