Problem mit HtmlHeader:AddPackageTag

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Antworten
Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Problem mit HtmlHeader:AddPackageTag

Beitrag von Paric » 27.08.2014, 11:02:22

Hallo,

erstmal großes Kompliment für das APF. Nach langer Suche habe ich mich entschieden mein vorhandenes Projekt in das APF umzusetzen. Da dies meine ersten Berührungspunkte mit dem Thema Framework sind, stoße ich an jeder Ecke und Kante auf Probleme. Alle bisherigen Probleme konnte ich irgendwie alleine Lösen, nur an einem Punkt komme ich nicht weiter.

Ich versuche über das "HtmlHeaderAddPackageTag" meine CSS-Dateien zu implementieren, doch das will mir nicht so recht gelingen. Mein aktueller Stand ist folgender:

- template-Datei:

Code: Alles auswählen

<core:addtaglib 
      class="APF\extensions\htmlheader\pres\taglib\HtmlHeaderAddPackageTag"
      prefix="htmlheader"
      name="addpackage"
   />

<htmlheader:addpackage
    name="login"
    type="css"
    fcaction="false"
/> 
- DEFAULT_actionconfig.ini:

Code: Alles auswählen

[JsCss]
ActionClass = "APF\extensions\htmlheader\biz\actions\JsCssInclusionAction" 
- DEFAULT_JsCssPackager.in:

Code: Alles auswählen

[login]
ClientCacheDays = "7"
PackageType = "css"
Files.1.Namespace = "TELLA\css"
Files.1.Filename  = "common" 
und naturlich die css-Datai im Order TELLA/css

er gibt mir keine Fehlermeldung aus, sondern macht es einfach nicht. Im Quelltext generiert er folgende url für das css:

http://SERVER/?TELLA_extensions_htmlhea ... :login.css

Ich vermute ich habe irgendetwas übersehen, so das er das action-script nicht ausführt, aber trotz intensivster Recherche habe ich keine Ahnung wo genau das Problem liegt.

Beste Grüße,
Paric

Coach83
Beiträge: 271
Registriert: 13.05.2010, 17:33:12
Kontaktdaten:

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von Coach83 » 27.08.2014, 17:34:18

was passiert denn, wenn Du die Datei direkt aufrufst?

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von Paric » 28.08.2014, 08:45:11

guten Morgen,

dann öffnet er ganz normal meine Hauptseite und scheind die action total zu ignorieren. Muss ich in der Bootstrap-Datei in irgendeiner Weise bekannt geben das es diese action gibt?

meine Bootstrap-Datei sieht wie folgt aus:

Code: Alles auswählen

$apfClassLoaderConfigurationRootPath = './TELLA';
include('./APF/core/bootstrap.php');

use APFcoreloaderRootClassLoader;
use APFcoreloaderStandardClassLoader;
use APFcoresingletonSingleton;
use APFcorefrontcontrollerFrontcontroller;

$classLoader = new StandardClassLoader('TELLA', 'TELLA');
RootClassLoader::addLoader($classLoader);

/* @var $fC Frontcontroller */
$fC = Singleton::getInstance('APF\core\frontcontroller\Frontcontroller', 'init');

$fC->registerAction('TELLA\biz\actions\registerAction', 'register-globals');
$fC->registerAction('TELLA\biz\actions\permissionAction', 'check-permissions');

echo $fC->start('TELLA\pres\templates', $fC->getAttribute('template'), 'login'); 
wobei das Attribute "template" in der permmissionAction gesetzt wird, wo geprüft wird ob der User eingeloggt ist oder eben nicht.

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

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von dr.e. » 28.08.2014, 20:02:04

Hallo Paric,

herzlich willkommen im APF-Forum! :)
dann öffnet er ganz normal meine Hauptseite und scheind die action total zu ignorieren. Muss ich in der Bootstrap-Datei in irgendeiner Weise bekannt geben das es diese action gibt?
Actions werden entweder explizit in der Bootstrap-Datei registriert (um sie bei jedem Request auszuführen) oder über eine Action-Anweisung in der URL getriggert (um sie nur bei Bedarf auszuführen).

Deine index.php registriert zwei statische Actions (register-globals und check-permissions), die in der Request-Verarbeitung entsprechend ausgeführt werden. Für diese hast du entsprechende Konfigurationen angelegt. Die htmlheader-Extension bringt eine eigene Action mit - die JsCssInclusionAction - die ebenfalls eine Konfiguration zur Definition benötigt (siehe http://wiki.adventure-php-framework.org ... ausliefern). Sobald diese angelegt ist, versteht der Front-Controller auch die URL http://SERVER/?TELLA_extensions_htmlhea ... :login.css. Da dies bei dir alles gegeben ist, gehe ich von einem anderen Fehler aus.

Kannst du mal deine index.php wie folgt anpassen:

Code: Alles auswählen

$apfClassLoaderConfigurationRootPath = './TELLA';
include('./APF/core/bootstrap.php');

use APFcorefrontcontrollerFrontcontroller;
use APFcoreloaderRootClassLoader;
use APFcoreloaderStandardClassLoader;
use APFcoresingletonSingleton;

$classLoader = new StandardClassLoader('TELLA', 'TELLA');
RootClassLoader::addLoader($classLoader);

/* @var $fC Frontcontroller */
$fC = Singleton::getInstance('APF\core\frontcontroller\Frontcontroller');

$fC->registerAction('TELLA\biz\actions\registerAction', 'register-globals');
$fC->registerAction('TELLA\biz\actions\permissionAction', 'check-permissions');

echo $fC->start('TELLA\pres\templates', 'login'); 
Zur Erklärung:
1) Die Methode getInstance() sollte bei der Erzeugung des Front-Controller nicht mit einem Instance-ID-Parameter versehen werden, da sonst andere Komponenten - wie beispielsweise die Input-Filter - keine Chance haben Actions der identischen Instanz zuzuweisen. Dies wird sicher dein Problem lösen, das Actions "ignoriert" werden.
2) Die Methode start() nimmt nur 2 Parameter entgegen wobei der zweite der Name des initialen Templates ist. Dieses kann nicht dynamisch gewählt werden, sondern die Dynamik kann erst ab dem initialen Template "erzeugt" werden. Damit funktioniert schon mal dein Login.

Wenn du dynamisch Templates laden möchtest, kannst du das entweder an Hand des "incparam"-Parameters des <core:importdesign />-Tags tun oder einen eigenen Tag schreiben, der den Parameter deiner Action direkt nutzt. Die erste Option ist relativ einfach umzusetzen:

a) Der <core:importdesign />-Tag wird wie folgt definiert:

Code: Alles auswählen

<core:importdesign
   namespace="TELLA\pres\templates"
   template="[layout = login]"
   incparam="layout"
/>

b) Deine Action setzt einen entsprechenden Request-Parameter, der den Namen des Wertes aus dem "incparam"-Parameter-Attribut des <core:importdesign />-Tag trägt.

Alternative ist sicherlich auch http://adventure-php-framework.org/Seit ... design-Tag.

Hoffe das hilft dir weiter!
Viele Grüße,
Christian

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von Paric » 29.08.2014, 09:38:13

Hallo Christian,

vielen Dank für die ausführliche Antwort. Diese hat mein Problem tatsächlich gelöst. Doch da tut sich jetzt ein neues Problem auf.

Ich habe wie vorgeschlagen in bootstrap-Datei geändert:

Code: Alles auswählen

echo $fC->start('TELLA\pres\templates', 'index'); 
in der index.html ist folgender Inhalt:

Code: Alles auswählen

    <core:importdesign
        namespace="TELLA\pres\templates\content"
        template="[layout = start]"
        incparam="layout"
    /> 
nun stellt sich mir die Frage, wie bekomme ich jetzt meine permissionAction dazu das, falls der User schon eingeloggt, das templet der login.html zu laden? Leider habe ich dazu noch keinen Ansatz gefunden.

Mit besten Grüßen,
Paric

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von Paric » 29.08.2014, 13:26:09

ich habe das Problem nun versucht anders zu lösen.

in meiner permissionAction speichere ich in der Session ob ich eingeloggt bin oder nicht.
in meiner main.html rufe ich die zugehörige Controller-Klasse auf und werte dort aus ob ich eingeloggt bin oder nicht.

die MainController-Klasse schaut wie folgt aus:

Code: Alles auswählen

namespace TELLAprescontroller;

use APFcorepagecontrollerBaseDocumentController;
use APFcoresessionSession;

class MainController extends BaseDocumentController
{
    public function transformContent()
    {
        
        $sM = new Session('TELLA\biz');
        if (!$sM->load('loggedIn'))
        {
            $this->getTemplate('login')->transformOnPlace();
        }
        else
        {
            $this->getTemplate('content')->transformOnPlace();
        }
    }
} 
und in meinem template (main.html) habe ich es so eingebunden:

Code: Alles auswählen

    <html:template name="login">
        <template:importdesign
            namespace="TELLA\pres\templates\content"
            template="login"
        />
    </html:template>
    <html:template name="content">
        <template:importdesign
            namespace="TELLA\pres\templates\content"
            template="[page = start]"
            incparam="page"
        />
    </html:template> 
leider klappt es nicht. der Tag >importdesign< scheint nur auf der html-ebene zu funktionieren, oder? Ich verzweifel hier langsam...

Beste Grüße,
Paric

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

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von dr.e. » 30.08.2014, 11:32:37

Hallo Paric,
vielen Dank für die ausführliche Antwort. Diese hat mein Problem tatsächlich gelöst.
Sehr gerne! :)
nun stellt sich mir die Frage, wie bekomme ich jetzt meine permissionAction dazu das, falls der User schon eingeloggt, das templet der login.html zu laden? Leider habe ich dazu noch keinen Ansatz gefunden.
Der <core:importdesign />-Tag arbeitet mit Request-Parametern, sprich deine Action kann - da sie gemäß Timing-Modell zuvor ausgeführt wird - einfach ein

Code: Alles auswählen

$_REQUEST['layout'] = 'logged-in'; 
oder ähnliches definieren.
ich habe das Problem nun versucht anders zu lösen.
Auch das ist eine absolut valide Option. Warum das nicht funktioniert, liegt an der Tatsache, dass innerhalb des Template-Tags nur die unter http://adventure-php-framework.org/Seit ... 3-Template dokumentierten Tags funktionieren. Um den <core:importdesign />-Tag innerhalb des Templates wiederverwenden zu können musst du diesen nochmals für diese Ebene unter einem anderen Präfix registrieren. Das ist leider in Version 2.X eine Schwäche des APF, dass jeder Tag nur exakt auf der Ebene bekannt ist und verarbeitet wird, auf der ere auch definiert wurde.

Die Gute Nachricht ist, dass das in Version 3.0 nicht mehr der Fall ist und du einen Tag für eine Applikation nur einmal registrieren musst (siehe hierzu z.B. http://tracker.adventure-php-framework. ... php?id=218).

Um deine Applikation zum Laufen zu bringen ist im Template folgende Anpassung notwendig:

Code: Alles auswählen

<html:template name="login">
   <template:addtaglib
      class="APF\core\pagecontroller\TemplateTag"
      prefix="template"
      name="importdesign"
   />
   <template:importdesign
         namespace="TELLA\pres\templates\content"
         template="login"
         />
</html:template>
<html:template name="content">
   <template:addtaglib
      class="APF\core\pagecontroller\TemplateTag"
      prefix="template"
      name="importdesign"
   />
   <template:importdesign
         namespace="TELLA\pres\templates\content"
         template="[page = start]"
         incparam="page"
         />
</html:template>  
Kleiner Tipp: solche Verarbeitungsfehler (Tag wird nicht gefunden) findest du recht schnell wenn du einen Blick in den HTML-Quellcode der generierten Seite wirfst. Dort taucht dein <template:importdesign /> bei fehlendem <template:addtaglib /> im Klartext auf.
Ich verzweifel hier langsam...
Das musst du nicht, wir helfen dir gerne! :)
Viele Grüße,
Christian

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von Paric » 01.09.2014, 08:48:32

Hallo Christian,

manchmal liegt das Einfache so nah. :oops:
Da mir die direkte Bearbeitung der $_Request nicht so zusagt, wollte ich das ganze in eine erweiterte Klasse des RequestHandlers auslagern, in einer Methode namens setValue(). Leider klappt das nicht, da die RequestHandler final ist. :(

Schade.

Wäre das nicht eine Erweiterung des RequestHandlers, also eine setValue()-Methode? Nur so ein Gedankenanstoß.... :mrgreen:

Ansonsten ist hier ja das eigentliche Problem behandelt worden, und ich werde den Thread mal ruhen lassen. Ggf. werde ich einen neuen Thread starten bei zukünftigen Problemen, Anregungen etc. 8-)

Beste Grüße,
Paric

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

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von dr.e. » 03.09.2014, 07:39:56

Hallo Paric,

Anregungen und Ideen sind immer herzlich Willkommen. Für 3.0 hatte ich ohnehin noch vor einen HTTP Request und Response Implementierung zu erstellen um den RequestHandler typisierter zu gestalten.

Wenn du magst, dann formuliere deinen Wunsch im Tracker, ich schreibe meine Ideen dann gerne dazu.
Viele Grüße,
Christian

Benutzeravatar
Paric
Beiträge: 45
Registriert: 25.08.2014, 08:51:04

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von Paric » 04.09.2014, 08:05:34

so habe ich das mal getan. Ich hoffe verständlich genug :D

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

Re: Problem mit HtmlHeader:AddPackageTag

Beitrag von dr.e. » 05.09.2014, 07:55:24

Na klar! :) Schreibe meine Ideen bei Gelegenheit dazu.
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast