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:

Re: WebRex - Open Source CMS

Beitrag von TipTop » 12.12.2011, 22:55:32

Ich hab versucht das Usermanagement-Modul für den ACP zu verwenden. Der Login funktioniert, auch das Logout, nur bin ich mir nicht sicher, wie ich bestimmte Bereiche sperren kann. Ist man eingeloggt, soll das Loginformular nicht angezeigt werden und dafür aber die Öberfläche des ACP. Ist man ausgeloggt, soll der ACP ausgeblendet werden und stattdessen das Loginformular angezeigt werden. Umgesetzt hab ich das jetzt so, dass ich in der index.html, welche von FrontController->start() aufgerufen wird, mit dem condition-Attribut des umgt-Taglibs prüfe, ob der User eingeloggt ist. Ich bin mir nun halt nicht sicher, ob das ausreicht und ob dadurch andere Controller nicht mehr instanziiert werden.

Hier der Code der index.html:

Code: Alles auswählen

<core:addtaglib namespace="modules::usermanagement::pres::taglib" prefix="umgt" class="template" />

<!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" />        
        <link rel="stylesheet" type="text/css" href="css/design.css" />            
    </head>
    
    <body>     
        <umgt:template condition="logged-in" transform-on-place="true">
            <ul id="webrex-acp-menu-top">
                <li><a href="?component=pages&page=website">Website</a></li>            
                <li><a href="?component=layouts&page=layouts">Layouts</a></li>    
                <li><a href="?component=layouts&page=fileManager">Dateimanager</a></li>                    
            </ul>            
            <template:addtaglib namespace="modules::usermanagement::pres::taglib" prefix="umgt" class="logoutlink" />
            <a href="<umgt:logoutlink />">Logout</a>                      
            <template:addtaglib namespace="webrex::core::taglib" prefix="html" class="content" /> 
            <html:content />
        </umgt:template>        
        <core:importdesign namespace="modules::usermanagement::pres::templates::login" template="login" />
    </body>
</html> 
Ist man ausgeloggt, wird nur das Formular angezeigt. Ist man allerdings eingeloggt, wird statt dem Formular folgendes ausgegeben:
Sie sind bereits eingeloggt. Hier können Sie sich ausloggen.
Gibt es eine Möglichkeit, diese Meldung zu unterdrücken?

Das Login-Formular (nur der HTML-Code) würde ich gerne abändern. Ist dieses ev. überschreibbar?

Grüße

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, 23:28:36

Hallo Nico,

ich versuche mal chronologisch richtig zu antworten: :)

1) AJAX + Templating
Das APF ist nach dem HMVC-Pattern entworfen. Das bedeutet, dass du immer mit einem Basis-Template einsteigst, in dem du dann jedoch je nach Anwendungsfall unterschiedliche Elemente "einblenden" kannst. Da der HMVC-DOM-Baum dynamisch aufgebaut wird, kannst du beispielsweise innerhalb des Root-Templates mit einem <core:importdesign /> je nach Url-Parameter, Logik in einem eigenen <*:importdesign /> Tag oder einer Front-Controller-Action entscheiden, was angezeigt wird.

Sofern du nicht unbedingt die gleiche Bootstrap-Datei nutzen musst, kannst du auch für ACP und Webseite eigene index.php's nutzen, die jeweils ihre eigene statischen Templates definieren. Für AJAX-Calls kannst du eigene Front-Controller-Actions schreiben, die nur dann aufgerufen werden, wenn explizit adressiert. Falls nicht, werden sie auch nicht ausgeführt, sondern einfach das Standard-Template geladen. Die konkrete Ausführung kannst du im Diagramm unter http://adventure-php-framework.org/Seit ... Einleitung nachlesen. Weitere Informationen zum APF-DOM-Baum-Handling steht unter http://wiki.adventure-php-framework.org ... Controller beschrieben.

2) Login-Switch
Umgesetzt hab ich das jetzt so, dass ich in der index.html, welche von FrontController->start() aufgerufen wird, mit dem condition-Attribut des umgt-Taglibs prüfe, ob der User eingeloggt ist. Ich bin mir nun halt nicht sicher, ob das ausreicht und ob dadurch andere Controller nicht mehr instanziiert werden.
Korrekt. Wie oben beschrieben wird der DOM-Baum dynamisch und nach der Funktionalität der Taglibs (gesteuert durch den Page-Controller) aufgebaut und damit kannst du direkt in den Aufbau eingreifen. Sofern ein Zweig nicht ausgeführt wird, existiert dafür auch keine Baum-Struktur und die Funktion wird nicht ausgeführt.
Ist man ausgeloggt, wird nur das Formular angezeigt. Ist man allerdings eingeloggt, wird statt dem Formular folgendes ausgegeben
Das ist das Standard-Verhalten des mitgelieferten Login-Formulars und kann dadurch geändert werden, dass du im zuständigen Document-Controller einen Redirect einführst. Vielleicht könnten wir das in das nächste Release per Konfiguration aufnehmen - das ist sicher nicht uninteressant. Als Implementierungs-Basis gibt es ja die RedirectProvider, die man nutzen könnte um bei erfolgtem Login ein Redirect stattfindet.
Das Login-Formular (nur der HTML-Code) würde ich gerne abändern. Ist dieses ev. überschreibbar?
Grundsätzlich kannst du das Template auch austauschen und den mitgelieferten Controller damit nutzen oder das Login selbt schreiben. Die Basis-Komponenten (UmgtManager) sind ja vorhanden. Allerdings lässt sich das Formular per CSS sehr flexibel formatieren. Ob nebeneinander oder untereinander - die Felder sind beliebig anordnebar. Solltest du hierzu Hilfe brauchen, sag Bescheid.

Ich hoffe, ich konnte deine Fragen beantworten. Falls nicht, können wir gerne die einzelnen Bereiche mit konkreten Code-Beispielen diskutieren.
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 » 13.12.2011, 18:21:14

Das ist das Standard-Verhalten des mitgelieferten Login-Formulars und kann dadurch geändert werden, dass du im zuständigen Document-Controller einen Redirect einführst. Vielleicht könnten wir das in das nächste Release per Konfiguration aufnehmen - das ist sicher nicht uninteressant. Als Implementierungs-Basis gibt es ja die RedirectProvider, die man nutzen könnte um bei erfolgtem Login ein Redirect stattfindet.
Einen Redirect habe ich nach dem Login bereits, welchen ich in einer RedirectUrlProvider Klasse definiert habe. Der Redirect aktualisiert im Prinzip nur die Seite. Den Login erreiche ich über http://foobar.tld/acp, nach dem Login bleibt bis auf 2 Parametern alles gleich -> http://foobar.tld/acp/?component=pages&page=website

Wie aber kann ein Redirect mein Problem lösen? Durch den Redirect wird ja nur die Bootstrap Datei (http://foobar.tld/acp/index.php) erneut aufgerufen, die darin befindende $frontController->start() Methode ruft erneut die index.html auf in welcher der core:importdesign-TagLib wiederum das Login-Template inkludiert - nur dass halt nach erfolgreichem Login eine Meldung anstatt des Formulars ausgegeben wird.

Mir sind jetzt 2 "Lösungen" eingefallen, beide sind aber eher unelegant:
Ich könnte nach erfolgreichem Login auf eine andere Bootstrap Datei umleiten, welche dann ein anderes Main-Template dem FrontController übergibt.
Oder ich entferne einfach die Meldungen aus der .ini Datei (DEFAULT_labels.ini) - also den Wert von already.logged.in?

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

Re: WebRex - Open Source CMS

Beitrag von Screeze » 13.12.2011, 18:27:11

Korrekt, du kannst einfach die Konfiguration mit den Sprachwerten anpassen, damit ist das Problem schon gelöst.

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

Re: WebRex - Open Source CMS

Beitrag von Megger » 13.12.2011, 18:32:22

Oder du importierst das Login Formular nur, wenn der User ausgeloggt ist. Denn das was du mit umgt:template machst, gibt es auch für umgt:importdesign
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

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

Re: WebRex - Open Source CMS

Beitrag von TipTop » 13.12.2011, 18:51:12

Megger hat geschrieben:Oder du importierst das Login Formular nur, wenn der User ausgeloggt ist. Denn das was du mit umgt:template machst, gibt es auch für umgt:importdesign
hm, etwas zu spät gelesen. Hab jetzt halt eine andere Lösung gefunden, die im Prinzip deiner aber ähnelt - hab mich dabei an deinem Browsergame-Tut. orientiert :)

Code: Alles auswählen

class html_taglib_content extends core_taglib_importdesign
{
    public function __construct()
    {
        parent::__construct();
    }
    
    public function onParseTime()
    {
        // try to get an user object
        $umgtSessionStore = $this->getServiceObject('modules::usermanagement::biz', 'UmgtUserSessionStore', 'SESSIONSINGLETON');
        $userObject = $umgtSessionStore->getUser($this->getContext());
        
        if ($userObject !== null) {
            $component = RequestHandler::getValue('component', 'pages');
            $page      = RequestHandler::getValue('page', 'index');

            $pathToPage = __DIR__ . '/../../backend/' . $component . '/pres/templates/' . $page . '.html';    
        
            if (file_exists($pathToPage)) {
                $this->setAttribute('namespace', 'webrex::backend::' . $component . '::pres::templates');
                $this->setAttribute('template', $page); 
            } else {
                $this->setAttribute('namespace', 'webrex::backend');
                $this->setAttribute('template', '404'); 
            }    
        } else {        
            // there is no user object, so the user is not logged id -> show login form
            $this->setAttribute('namespace', 'modules::usermanagement::pres::templates::login');
            $this->setAttribute('template', 'login');
        }
        
        parent::onParseTime();        
    }
} 

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

Re: WebRex - Open Source CMS

Beitrag von TipTop » 13.12.2011, 21:25:44

Megger hat geschrieben:Oder du importierst das Login Formular nur, wenn der User ausgeloggt ist. Denn das was du mit umgt:template machst, gibt es auch für umgt:importdesign
Ich versuche es grade so umzusetzten, allerdings ohne Erfolg. Der Tag wird nicht geparst:

Code: Alles auswählen

<core:addtaglib namespace="modules::usermanagement::pres::taglib" prefix="umgt" class="template" />
<!DOCTYPE html>
<html>
    <head>
        <title>WebRex :: Admin Control Panel</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
    </head>
    
    <body>     
        <umgt:template condition="logged-in" transform-on-place="true">
            <template:addtaglib namespace="webrex::core::taglib" prefix="html" class="content" /> 
            <html:content />            
        </umgt:template>

        <umgt:importdesign namespace="webrex::backend" template="login" condition="logged-out" />
    </body>
</html> 
Ich importiere hier nicht direkt das umgtr-Template, sondern eine login.html, die ich angelegt habe. In dieser importiere ich dann das UMGT-Login-Formular. Die login.html hab ich angelegt, um das Login mit ein paar eigenen Elementen zu umschließen.
Im Seitenquelltext ist der <umgt:importdesign namespace="webrex::backend" template="login" condition="logged-out" />-Tag vorzufinden. Wieso wird er nicht geparst?

[EDIT]
Hat sich erledigt - hab vergessen den taglib einzubinden :roll:
[/EDIT]


Grüße
Nico

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

Re: WebRex - Open Source CMS

Beitrag von TipTop » 14.12.2011, 16:23:44

Derzeit versuche ich ein Formular mit der Form-TagLib zu erstellen, bis jetzt aber ohne Erfolg. Die Tags werden geparst, zumindest sind sie im Quellcode nicht mehr zu finden, allerdings auch kein generierter HTML Code. Woran liegt das?

Code: Alles auswählen

<core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
<div id="content">
    <h2>Neues Layout erstellen</h2>    
    <html:form name="newLayout" method="post">
        <label for="layoutName">Layoutname:</label> <form:validate button="createLayout" field="layoutName" id="layoutName" type="text" msginputreq="" />
        <form:text name="layoutName" validate="true" button="createLayout" />
        <form:button name="createLayout" value="Layout erstellen" />
    </html:form>
</div> 
Der daraus resultierende Quelltext:

Code: Alles auswählen

<div id="content">
    <h2>Neues Layout erstellen</h2>    
</div> 

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

Re: WebRex - Open Source CMS

Beitrag von Megger » 14.12.2011, 16:26:43

Wie schaut der Controller dazu aus?

Weil ein Formular muss erst transformiert werden, siehe Verwendung von Formularen (ab Version 1.11) (gleich in der ersten Codebox)
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

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

Re: WebRex - Open Source CMS

Beitrag von TipTop » 14.12.2011, 17:35:17

Megger hat geschrieben:Wie schaut der Controller dazu aus?

Weil ein Formular muss erst transformiert werden, siehe Verwendung von Formularen (ab Version 1.11) (gleich in der ersten Codebox)
Controller hatte ich noch gar keinen angelegt - das erklärt natürlich alles :oops:
Danke.

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

Re: WebRex - Open Source CMS

Beitrag von TipTop » 14.12.2011, 18:50:36

Code: Alles auswählen

<div id="content">
    <h2>Neues Layout erstellen</h2>    
    <html:form name="newLayout" method="post">
        <form:listener control="layoutName" validator="TextLengthValidator"><p>Sie müssen einen Namen für das Layout angeben.</p></form:listener>
        <form:addvalidator class="TextLengthValidator" control="layoutName" button="createLayout" />    
        <p><label for="layoutName">Layoutname:</label> <form:text name="layoutName" button="createLayout" maxlength="100" mode="strict" /></p>
        <p><form:button name="createLayout" value="Layout erstellen" /></p>
    </html:form>
</div> 
Versuche gerade den Form-Listener einzusetzten, so dass beim versenden eines leeren Textfeldes (layoutName) eine Fehlermeldung angezeigt wird. Allerdings ist das nicht der Fall!?

APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von APFelsahne » 14.12.2011, 19:20:55

Du müsstest dann noch dem Textfeld ne mindestlänge mitgeben:

Code: Alles auswählen

<form:text name="layoutName" button="createLayout" minlength="1" maxlength="100" mode="strict" />
Grüße, Florian
BildAPF-Extension wsCatalyst

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

Re: WebRex - Open Source CMS

Beitrag von dr.e. » 14.12.2011, 21:46:30

Ich habe den Thread mal unter Entwicklung verschoben, dieser Platz passt IMHO besser.
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 » 14.12.2011, 22:19:48

APFelsahne hat geschrieben:Du müsstest dann noch dem Textfeld ne mindestlänge mitgeben:

Code: Alles auswählen

<form:text name="layoutName" button="createLayout" minlength="1" maxlength="100" mode="strict" />
Hinzugefügt hab ich das minlength-Attribut, ausgegeben wird die Fehlermeldung aber nachwievor nicht :?

APFelsahne
Beiträge: 222
Registriert: 18.03.2010, 13:13:07
Wohnort: Ludwigshafen am Rhein
Kontaktdaten:

Re: WebRex - Open Source CMS

Beitrag von APFelsahne » 14.12.2011, 22:30:32

probier mal folgendes aus:

Code: Alles auswählen

    <div id="content">
        <h2>Neues Layout erstellen</h2>    
        <html:form name="newLayout" method="post">
            <form:listener control="layoutName" name="listener-layoutName"><p>Sie müssen einen Namen für das Layout angeben.</p></form:listener>
            <form:addvalidator class="TextLengthValidator" control="layoutName" button="createLayout" />    
            <p><label for="layoutName">Layoutname:</label> <form:text name="layoutName" minlength="1" maxlength="100" mode="strict" /></p>
            <p><form:button name="createLayout" value="Layout erstellen" /></p>
        </html:form>
    </div> 
hab beim listener das validator-attribut rausgeholt, das wird glaub ich nur bei validatoren benutzt die mit dem attribut type="special" versehen sind.
zudem hab ich noch beim text-feld das button-attribut entfernt.
Grüße, Florian
BildAPF-Extension wsCatalyst

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast