Hilfe für APF-Neuling

Hier finden sich Fragen und Ergänzung zur Dokumentation. // All questions and discussions about the documentation.
Antworten
Benutzeravatar
dr.e.
Administrator
Beiträge: 4606
Registriert: 04.11.2007, 16:13:53

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 20.05.2009, 17:57:54

Hallo Lutz,
Jetzt bleibt halt nur die Frage übrig (oder habe ich das auch überlesen?), ob der GORM bei normaler Verwendung (also kein PK über beide Spalten) von sich aus die Erstellung von doppelten Verknüpfungen verhindert?!
An sich sollte das schon funktionieren, da ich zumindest intern prüfe, ob eine Beziehung bereits besteht und falls ja, keine neue mehr erstelle. In dieser Konstellation habe ich das jedoch noch nicht explizit getestet. So let's give it a try. ;)

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Hilfe für APF-Neuling

Beitrag von MrNiceGuy » 06.06.2009, 10:26:15

Auf der Seite http://adventure-php-framework.org/Seit ... r-Tutorial verwendest du den "VariablenHandler", der jedoch in Version 1.9 durch den RequestHandler ersetzt wurde. Dieses Tutorial sollte entsprechend angepasst werden. Ich versuche jetzt erstmal selber dahinter zu kommen, wie ich das nun lösen muss, aber solltest du einen Tipp haben ... ;)

EDIT: Habs schon selbst gefunden in "Migration von 1.8 auf 1.9" :)
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

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

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 06.06.2009, 11:03:28

Hi Lutz,

ich habe die Dokumentation nun überarbeitet und die relevanten Stellen entsprechend ersetzt. Auch sind nun veraltete Klassen in der Dokumentation als solche gekennzeichnet.

Vielen Dank für den Hinweis! :)

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Hilfe für APF-Neuling

Beitrag von MrNiceGuy » 30.07.2009, 15:48:04

So, damit hier garnicht erst Ruhe einkehrt (ich muss den Urlaub ja sinnvoll nutzen und mich in Sachen APF weiterbilden :)), gleich mal der nächste Stolperstein, an dem ich gerade "verzweifle":

Ich habe mir überlegt für Newsletter und andere eMails, die versendet werden sollen einen Cronjob zu nutzen, der die zu verschickenden eMails aus einer Datenbank holt. Das ist soweit wohl auch erstmal kein Thema, ich stocke jedoch bereits beim Eintragen in die Datenbank. Undzwar möchte ich hier die Stärken des APF ausnutzen und eMails in Form von Templates vorhalten, die zum Einen unterschiedliche Sprachen unterstützen können und zum Anderen die Möglichkeit bieten mit Platzhaltern zu arbeiten. Wenn ich bei der Benutzerregistrierung also eine Zusammenfassung der Daten per eMail verschicken möchte, brauche ich nur das Template laden, die Platzhalter ersetzen und das Ergebnis von transform() in die DB speichern.

Soweit die Idee auch einfach klingt, hakt es bei der Umsetzung mit dem Template aktuell. Ich kann zwar ein neues Page-Objekt erstellen und mittels loadDesign() das passende Template laden, jedoch fehlt mir die Möglichkeit mittels setPlaceHolder() die Platzhalter zu ersetzen. Das ist ja erst mit dem DocumentController möglich. Die Frage ist nun also wie ich aus dem Script heraus auf die einfachste Art und Weise Daten in den DocumentController bekomme. Es ginge zwar über lokale Variablen die ich global über die Klassen hinweg einsetze, jedoch geht dabei sicher der grundgedanke von OOP etwas flöten. Sollte man vielleicht ein eigenes Model nutzen, um die Daten zentral zur Verfügung zu stellen? Aber irgendwie scheue ich mich noch davor extra für einen solchen Anwendungszweck ein Model anzulegen?! Oder gibt es eine andere Möglichkeit ein Template für derartige Zwecke zu laden?

Danke schonmal für die Hilfe!

Lutz
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

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

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 30.07.2009, 22:19:21

Hallo Lutz,
Undzwar möchte ich hier die Stärken des APF ausnutzen und eMails in Form von Templates vorhalten, die zum Einen unterschiedliche Sprachen unterstützen können und zum Anderen die Möglichkeit bieten mit Platzhaltern zu arbeiten. Wenn ich bei der Benutzerregistrierung also eine Zusammenfassung der Daten per eMail verschicken möchte, brauche ich nur das Template laden, die Platzhalter ersetzen und das Ergebnis von transform() in die DB speichern.
Für diese Aufgabenstellung gibt es mehrere Möglichkeiten:
  • Injizieren von Attributen in das initiale Dokument
  • Ablegen von Werten in der Registry
  • Erstellen eines eigenen Models
Für meinen Geschmack würde ich zu Variante mit dem Model tendieren. Die Platzhalter würde ich dann als eigene Taglib ausführen, die das Model kennen und die jeweiligen Werte daraus beziehen können. Das Template selbst besteht dann lediglich aus den Platzhalter-Tags und dem gewünschten Standard-Text. Sprachabhängigkeit kannst du dann ebenfalls mit den im APF integrierten Mitteln abbilden.
Die Frage ist nun also wie ich aus dem Script heraus auf die einfachste Art und Weise Daten in den DocumentController bekomme. Es ginge zwar über lokale Variablen die ich global über die Klassen hinweg einsetze, jedoch geht dabei sicher der grundgedanke von OOP etwas flöten.
Um es etwas konkreter zu gestalten:

Model:

Code: Alles auswählen

class NewsletterModel extends coreObject {
}
Template:

Code: Alles auswählen

<core:addtaglib namespace="3rdparty::newsletter::pres::taglib" prefix="nl" class="placeholder" />
<nl:placeholder name="Salutation" /><nl:placeholder name="LastName" />,

wir freuen uns, dass Sie sich bei uns registriert haben. 
...
Aufrufender Code: (kann eine Methode sein oder eine einfache php-Datei)

Code: Alles auswählen

$lang = ...;
$salutation = ...;
$lastname = ...;

$model = &Singleton::getInstance('NewsletterModel');
$model->setAttribute('Salutation',$salutation);
$model->setAttribute('LastName',$lastname);

$page = new Page();
$page->set('Language',$lang);
$page->loadDesign('3rdparty::newsletter::pres::template::notification','signup');
$emailTtext = $page->transform();
Taglib:

Code: Alles auswählen

class nl_taglib_placeholder extends Document {

   public function transform(){
      $model = &Singleton::getInstance('NewsletterModel');
      return $model->getAttribute($this->getAttribute('name'));
   }

}
Sollte man vielleicht ein eigenes Model nutzen, um die Daten zentral zur Verfügung zu stellen?
Das macht sicher Sinn. Hier wäre ein NewsletterDataProvider angebracht, der an Hand von definierten Informationen die Daten einer Person aus der Datenbank laden kann. Quasi ein Pendant zum umgtManager.
Aber irgendwie scheue ich mich noch davor extra für einen solchen Anwendungszweck ein Model anzulegen?! Oder gibt es eine andere Möglichkeit ein Template für derartige Zwecke zu laden?
Wenn du kein Model anlegen möchtest, bleibt noch die Registry- oder Injection-Variante. Erstere ist relativ einfach, die zweite etwas tricky:

1. Registry:
Aufrufender Code:

Code: Alles auswählen

$lang = ...;
$salutation = ...;
$lastname = ...;

$reg = &Singleton::getInstance('Registry');
$reg->register('3rdparty::newsletter::data','Salutation',$salutation);
$reg->register('3rdparty::newsletter::data','LastName',$lastname);

$page = new Page();
$page->set('Language',$lang);
$page->loadDesign('3rdparty::newsletter::pres::template::notification','signup');
$emailTtext = $page->transform();
Taglib:

Code: Alles auswählen

class nl_taglib_placeholder extends Document {

   public function transform(){
      $reg = &Singleton::getInstance('Registry');
      return $reg->retrieve('3rdparty::newsletter::data',$this->getAttribute('name'));
   }

}
2. Injection
Aufrufender Code:

Code: Alles auswählen

$lang = ...;
$salutation = ...;
$lastname = ...;

$page = new Page();
$page->set('Language',$lang);
$page->loadDesign('3rdparty::newsletter::pres::template::notification','signup');

$doc = &$page->getByReference('Document');
$doc->setAttribute('Salutation',$salutation);
$doc->setAttribute('LastName',$lastname);

$emailTtext = $page->transform();
Template:

Code: Alles auswählen

<@controller namespace="..." class="my_controller" file="my_controller" @>
<html:placeholder name="Salutation" /><html:placeholder name="LastName" />,

wir freuen uns, dass Sie sich bei uns registriert haben. 
...
Document-Controller:

Code: Alles auswählen

class my_controller extends baseController {

   public function transformContent(){
      $this->setPlaceHolder('Salutation',$this->__Document->getAttribute('Salutation'));
      $this->setPlaceHolder('LastName',$this->__Document->getAttribute('LastName'));
   }

}
Ich hoffe, das hilft dir weiter.

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Hilfe für APF-Neuling

Beitrag von MrNiceGuy » 31.07.2009, 14:50:21

Hi!

Danke für deine ausführliche Antwort. Ich habe mich zu der Lösung mit dem Model entschieden, da es sich besser in meine bisherige Struktur einfügt, als es die anderen Lösungen getan hätten. Soweit funktioniert es auch schon ganz gut, obwohl ich ein wenig mit dem Page-Objekt zu kämpfen hatte:

Damit das Laden von Sprach-Variablen weiterhin funktionierte musste ich noch ein $objectPageEMail->set ('Context', $this->__Context); vor das loadDesign() setzen, da sonst der Namespace des Templates der Context ist. In diesem Falle wird die Sprach-Datei hinterher nicht gefunden und ein Fehler geworfen. Das nur der Vollständigkeithalber.

Ich werde das noch ein bisschen austesten, bis es endgültig läuft.

EDIT:

So, ich habe es soweit zum Laufen gebracht, allerdings schleicht sich nun noch ein anderer Fehler ein: Der Output-Filter für den HTML-Code der Webseite greift ja auch bei der Transformation des EMail-Templates. Das sollte nach Möglichkeit nicht passieren. Kann man temporär die Output-Filter deaktivieren? Oder muss ich dafür in der Registry den Output-Filter abschalten und danach wieder einschalten?!
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

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

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 31.07.2009, 19:24:18

Hallo Lutz,

in diesem Fall musst du den Filter temporär deaktivieren und nach dem Transformieren der "Unter-Seite" wieder reaktivieren. Das geht deshalb nur so umständlich, weil eine Webseite üblicherweise nur aus einer Page besteht, du an dieser Stelle jedoch künstlich eine zweite einführst (was natürlich legal ist).

Viele Grüße,
Christian
Viele Grüße,
Christian

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Hilfe für APF-Neuling

Beitrag von MrNiceGuy » 01.08.2009, 08:36:24

OK, das habe ich nun auch gemacht. Lese vorher das Objekt aus der Registry aus, setze ein neues und hinterher setze ich das alte Objekt wieder ein. Ging doch einfacher als erst gedacht :)
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

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

Re: Hilfe für APF-Neuling

Beitrag von Screeze » 09.08.2009, 11:41:38

Ich hätte mal ne Frage bezüglich

Code: Alles auswählen

  <doc:createobject requestparam="key" defaultvalue="value" />  
eher gesagt bezüglich des speicherorts der daten.

Folgende ordnerstruktur:

Code: Alles auswählen

/htdocs
            /APF/sites
                              /mainpage
                                                 index.php
/APF
           /core
           /modules
           /sites
                             /mainpage
                                            /biz
                                            /data
                                            /pres
           /tools
Wenn ich nun in einem template der mainpage

Code: Alles auswählen

  <doc:createobject requestparam="key" defaultvalue="value" />  
benutze, muss die dazugehörige inhaltsdatei in /htdocs/APF/sites/mainpage/frontend/content sein.
Warum im öffentlichen bereich?
was wenn dateien dabei sind, deren inhalt nur für bestimmte benutzergruppen zugänglich sein soll? würde es nicht mehr sinn machen die inhaltsdateien im /pres ordner, oder paralell zum /pres ordner in einem /frontend ordner zu speichern?


edit:
Seh ich das richtig, dass wenn ich z.b. ein Formular auf einer der content seiten habe, ich dann diese methode nicht benutzen kann, sondern einen controller, ähnlich dem "5.2 Inhalte aus einer Datenbank", basteln muss?
Zuletzt geändert von Screeze am 09.08.2009, 20:35:50, insgesamt 1-mal geändert.

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

Re: Hilfe für APF-Neuling

Beitrag von Screeze » 09.08.2009, 16:57:01

und gleich noch eine...

ich hab grad glaub ich das ganze forum im schnelldurchgang nochmal durchgelesen, die forensuche benutzt, aber ich finds nicht :?

folgendes problem:
wenn ein formular durch den validator nicht durchgekommen ist, und ich zusätzlich zur roten umrandung noch eine infobox darüber anzeigen lassen will, mit einem hinweistext was falsch war... was muss ich nochmal machen??
Ich hab das heut morgen irgendwo gelesen, da hast du das glaub ich schon jemand in der form gesagt, aber ich finds grad einfach nichtmehr.

Kannst du nochmal kurz erklären?

Danke...


edit: nach nochmal ner halben stunde suchen hab ichs gefunden:

Code: Alles auswählen

<form:genericval  button="send" field="abc" validator="text">Bitte geben Sie einen Text ein!<br /></form:genericval>
das war des rätsels lösung...

p.s.: am besten gleich in die tutorials für formulare mit aufnehmen, das is ein wichtiges element, welches öfters verwendung findet normalerweiße.

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

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 09.08.2009, 22:10:04

Hallo Screeze,
[..]muss die dazugehörige inhaltsdatei in /htdocs/APF/sites/mainpage/frontend/content sein.
Warum im öffentlichen bereich?
was wenn dateien dabei sind, deren inhalt nur für bestimmte benutzergruppen zugänglich sein soll? würde es nicht mehr sinn machen die inhaltsdateien im /pres ordner, oder paralell zum /pres ordner in einem /frontend ordner zu speichern?
Der Tag ist schon recht alt (siehe Klassensignatur) und bisher gab es noch nicht die Notwendigkeit diesen anzupassen. Ich gebe dir jedoch Recht, die Daten im via HTTP zugänglichen Bereich abzulegen ist unschön, wenngleich nicht problematisch. Um die Funktion zu ändern kannst du die Taglib-Klasse überschreiben (genauer gesagt die Methode __getContent() neu implementieren und nach deinen Anforderungen gestalten. Dieses Mittel hast du übrigens bei (fast) allen APF-Taglibs.
Seh ich das richtig, dass wenn ich z.b. ein Formular auf einer der content seiten habe, ich dann diese methode nicht benutzen kann, sondern einen controller, ähnlich dem "5.2 Inhalte aus einer Datenbank", basteln muss?
Das kommt auf den Anwendungsfall an. Die von dir genannte Taglib ist dazu gedacht, Inhalte in eigene Template-Dateien auszulagern. Diese können dabei weitere Taglibs und Controller-Definitionen enthalten. Du bist jedoch aber frei, die von dir gewünschten Inhalte über einen Document-Controller oder eine eigene Taglib in die Seite zu integrieren. Wenn du hier ein kleines Beispiel brauchst, sag einfach Bescheid.

Wenn du in deinem dynamischen Content weitere Tags hast, bietet sich an, eine eigene Taglib zu schreiben, da du dort zum Parsen der Inhalte nach weiteren Tags einfach die Methode __extractTagLibTags() nutzen kannst. Im Fall von Formularen brauchst du einen Controller, da ein Formular ja im Allgemeinen behandelt werden muss.

Ist das soweit klar geworden?

Viele Grüße,
Christian
Viele Grüße,
Christian

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

Re: Hilfe für APF-Neuling

Beitrag von dr.e. » 09.08.2009, 22:13:43

Hallo nochmal,

nun zu Teil 2:
wenn ein formular durch den validator nicht durchgekommen ist, und ich zusätzlich zur roten umrandung noch eine infobox darüber anzeigen lassen will, mit einem hinweistext was falsch war... was muss ich nochmal machen??
Ich hab das heut morgen irgendwo gelesen, da hast du das glaub ich schon jemand in der form gesagt, aber ich finds grad einfach nichtmehr.
Hier kannst du entweder mit Hilfe eines Document-Controllers oder des <form:genericval />-Tags eine Meldung ausgeben. Dies wird - wie bei meiner Antwort im Dokumentation-Forum angedeutet - in Zukunft einfacher.
p.s.: am besten gleich in die tutorials für formulare mit aufnehmen, das is ein wichtiges element, welches öfters verwendung findet normalerweiße.
Ist nachgetragen.

Viele Grüße,
Christian
Viele Grüße,
Christian

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

Re: Hilfe für APF-Neuling

Beitrag von Screeze » 10.08.2009, 11:08:19

dr.e. hat geschrieben:Hallo Screeze,
Der Tag ist schon recht alt (siehe Klassensignatur) und bisher gab es noch nicht die Notwendigkeit diesen anzupassen. Ich gebe dir jedoch Recht, die Daten im via HTTP zugänglichen Bereich abzulegen ist unschön, wenngleich nicht problematisch. Um die Funktion zu ändern kannst du die Taglib-Klasse überschreiben (genauer gesagt die Methode __getContent() neu implementieren und nach deinen Anforderungen gestalten. Dieses Mittel hast du übrigens bei (fast) allen APF-Taglibs.

Ok, dazu noch ne frage:
Kann ich von meiner überschriebenen methode aus, irgendwo auslesen, wo sich der APF ordner befindet?

Ich hab jetzt mal übergangsweise die methode so überschrieben:

Code: Alles auswählen

protected function __getContent($pageName){

         $file = $_SERVER['DOCUMENT_ROOT'] . '/../APF/sites/GAME_mainpage/pres/frontend/content/c_'.$this->__Language.'_'.strtolower($pageName).'.html';

         if(!file_exists($file)){
            $file = $_SERVER['DOCUMENT_ROOT'] . '/../APF/sites/GAME_mainpage/pres/frontend/content/c_'.$this->__Language.'_404.html';
          // end else
         }

         return file_get_contents($file);

       // end function
      }
Allerdings funktioniert dass so jetzt nur für die eine seite logischerweise. In irgend ner variable is doch bestimmt der entsprechende namespace/context gespeichert, oder?

Benutzeravatar
MrNiceGuy
Beiträge: 749
Registriert: 03.02.2009, 16:49:42
Wohnort: Nienburg / Weser

Re: Hilfe für APF-Neuling

Beitrag von MrNiceGuy » 10.08.2009, 11:10:00

Schau mal in die Konstante APPS__PATH :)
There are only 10 Types of people in the world:
Those who understand binary and those who don't.

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

Re: Hilfe für APF-Neuling

Beitrag von Screeze » 10.08.2009, 11:13:45

Das kommt auf den Anwendungsfall an. Die von dir genannte Taglib ist dazu gedacht, Inhalte in eigene Template-Dateien auszulagern. Diese können dabei weitere Taglibs und Controller-Definitionen enthalten. Du bist jedoch aber frei, die von dir gewünschten Inhalte über einen Document-Controller oder eine eigene Taglib in die Seite zu integrieren. Wenn du hier ein kleines Beispiel brauchst, sag einfach Bescheid.

Wenn du in deinem dynamischen Content weitere Tags hast, bietet sich an, eine eigene Taglib zu schreiben, da du dort zum Parsen der Inhalte nach weiteren Tags einfach die Methode __extractTagLibTags() nutzen kannst. Im Fall von Formularen brauchst du einen Controller, da ein Formular ja im Allgemeinen behandelt werden muss.
hmm das is nich klar geworden.
also der 1. absatz besagt, dass ich auch in den content-dateien controller, taglibs ect. benutzen kann.
aber wie passt jetzt der 2. absatz dazu? sry versteh nicht ganz für was ich dann eigene taglibs benötigen würde


edit:
@mrniceguy:
Ok danke, damit konnte ich schonmal soweit kürzen

Code: Alles auswählen

$file = APPS__PATH . '/sites/GAME_mainpage/pres/frontend/content/c_'.$this->__Language.'_'.strtolower($pageName).'.html';
Wie komme ich jetzt an den context der seite die es benötigt?

Antworten