Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Variablen in einem Template ersetzen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • #46
    Hallo KarlEgon,

    Danke für deine Zeit.
    Ich denke ich werde das ganze dann dabei auf Blanks umstellen.
    Gerne. Ich werde das in nächster Zeit verstärkt testen und dann im Release 1.8-BETA es entsprechend ankündigen oder rausnehmen. Die Doku versehe ich noch mit einem Hinweis, dass als Tag-zu-Attribut-Trennzeichen ein Leerzeichen erwartet wird.

    Habe im moment nur das Problem, dass ich die Sourceforge Dateien nicht einbinden kann, liegt irgendwie an dem Format oder so, bin mir da nicht so sicher. Gibt auf jedenfall Probleme beim Download, mit deinen Zip Files gab es diese Probleme nicht.

    Kannst du es vielleicht in ein Zip Ordner packen und bereitstellen? Das wäre sehr nett.
    Gerne. Unter http://media.adventure-php-framework..._export.tar.gz steht nun ein ZIP mit dem Code des aktuellen trunks zur Verfügung. Ich habe im Rahmen der neuen Seite auch überlegt, nightly buiilds zur Verfügung zu stellen...

    Ansonsten komme ich eigentlich ganz gut vorran und arbeite mich langsam ein. Es wird alles ein bisschen durchsichtiger und ich verstehe es besser.
    Das freut mich. Die große Hürde beim Einstieg ist sicher die generische Struktur, die einem aber mit der Zeit ans Herz wächst.

    Ist dies so die richtige Vorgehensweise oder sollte ich etwas anderes machen?
    Das würde ich spontan auch so lösen. Vielleicht kannst du das - um die URL schöner aussehen zu lassen - auch mit einer statischen/permanenten Action lösen, die einfach nur Standard-Parameter aus der URL zieht und diese dann als Model-Informationen nutzt. Grundsätzlich ist das jedoch genau so sinnvoll. Übrigens ist das implizit schon HMVC!

    Kann ich irgendwie ein <html:template> global verfügbar machen, sodass ich es aus jedem Controller aufrufen kann?
    Klar. Dir stehen in jedem Controller und jedem Tag der komplette DOM-Baum zur Verfügung. Mit den Attributen $this->__Document im Controller und $this->__ParentObject und $this->__Children in der Tag-Implementierung kannst du auf den kompletten Baum zugreifen. Die Art und Weise bestimmt die Komplexität deiner Struktur.

    Um nun in einem konkreten Modul ein Template im "Haupt-View" zu definieren und in den Unterviews, die mit einem importdesign-Tag eingebunden wirden verwenden zu können, kannst du statt einem

    PHP-Code:
    $Template $this->__getTemplate('bla'); 
    auch einfach ein

    PHP-Code:
    $parentTemplateName 'DesiredName';
    $parentTemplate null;
    $docParent $this->__Document->__ParentObject;
    $children $docParent->getByReference('Children'); 
    foreach(
    $children as $objectId => $DUMMY){
       if(
    get_class($children[$objectId]) == 'html_taglib_template' && $children[$objectId]->getAttribute('name') == $parentTemplateName){
          
    $parentTemplate $children[$objectId];   
       }
    }
    $parentTemplate->setPlaceHolder('Test','...');
    echo 
    $parentTemplate->transformTemplate(); 
    schreiben und dieses verwenden. Wichtig ist dabei, dass du sicherstellst, dass es das Template auch gibt, sonst produzierst du ganz einfach einen Nullpointer. Auch wichtig ist, dass transformOnPlace() nicht funktioniert, da du das Template ja in einem anderen Bereich verwendest.

    So etwas wie "importiere mir ein Template genau hier" gibt es nicht, du kannst soetwas jedoch ganz einfach umsetzen, indem du einfach einen weiteren Tag definierst, der das darin geparste Template bei seinem Vater (=Knoten, wo du es bei der Transformation im Controller haben möchtest) einhängt.

    Wie ich oben schon meinte: die generische Struktur erschreckt zwar erst, ist aber hinterher sehr nützlich.

    Viel Spass beim coden!
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #47
      Das würde ich spontan auch so lösen. Vielleicht kannst du das - um die URL schöner aussehen zu lassen - auch mit einer statischen/permanenten Action lösen, die einfach nur Standard-Parameter aus der URL zieht und diese dann als Model-Informationen nutzt. Grundsätzlich ist das jedoch genau so sinnvoll. Übrigens ist das implizit schon HMVC!
      Soweit ich das verstanden habe, ist es eine permanente Action, wenn ich in der index.php
      PHP-Code:
      $fC->registerAction('main','changeView'); 
      angebe oder?

      Habe das mal zum Test gemacht und funktioniert eigentlich Problemlos, meine Navigationen passen sich immer schön an.

      Die Sache mit dem Parent Template werde ich wahrscheinlich heute Abend ausprobieren, finde ich ganz nützlich für Listen usw.

      Dein Zip Paket muss ich anscheinend auch später testen, irgendwie will er im Moment gar nichts runterladen, muss ich noch mal schauen wo da der Fehler liegen könnte, aber trotzdem danke.

      Kommentar


      • #48
        Hi,
        Soweit ich das verstanden habe, ist es eine permanente Action, wenn ich in der index.php
        PHP-Code:
        $fC->registerAction('main','changeView');

        angebe oder?
        genau. Wobei "main" der entsprechende Namespace zur Action-Konfiguration ist, wie er auch in der URL angegeben wird.

        Habe das mal zum Test gemacht und funktioniert eigentlich Problemlos, meine Navigationen passen sich immer schön an.
        Sehr schön.

        Die Sache mit dem Parent Template werde ich wahrscheinlich heute Abend ausprobieren, finde ich ganz nützlich für Listen usw.
        OK, vielleicht können wir auch aus der Idee ein globales Feature bauen.
        Viele Grüße,
        Dr.E.

        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        1. Think about software design [B]before[/B] you start to write code!
        2. Discuss and review it together with [B]experts[/B]!
        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
        4. Write [I][B]clean and reusable[/B][/I] software only!
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        Kommentar


        • #49
          Habe nun mal deine Dateien ausprobiert, allerdings habe ich seitdem den Fehler:
          Code:
          Error! 
          
          Error-ID: 4de916b1f9ee1146d8d32975fec73b6c 
          Message: Undefined variable: tagAttributeDel 
          Number: 8 
          File: C:\xampp\xampp\htdocs\APF\core\pagecontroller\pagecontroller.php 
          Line: 273
          Dies liegt doch nicht an mir oder?

          Kommentar


          • #50
            Hi,

            das liegt eigentlich nicht an dir. Ich verstehe nur nicht am wem dann. Im Code ist hierzu folgendes zu finden:

            PHP-Code:
                     // search for taglib to attributes string delimiter
                     
            $tagAttributeDel_Blank strpos($TagString,' ');

                     
            // BUGFIX: fixes the issue, that a TAB character is no valid delimiter
                     
            $tagAttributeDel_Tab strpos($TagString,"\t");

                     if(
            $tagAttributeDel_Tab !== false){

                        if(
            $tagAttributeDel_Blank $tagAttributeDel_Tab){
                           
            $tagAttributeDel $tagAttributeDel_Tab;
                         
            // end if
                        
            }

                      
            // end if
                     
            }
                     else{
                        
            $tagAttributeDel $tagAttributeDel_Blank;
                      
            // end else
                     

            Sollte kein Tab gefunden werden, so greift der else-Zweig. Es sollte also immer ein $tagAttributeDel definiert sein. Kannst du zum Debuggen mal die Inhalte von $tagAttributeDel_Blank und $tagAttributeDel_Tab beim relevanten Code ausgeben lassen, bzw. mir ein Beispiel schicken?

            Sollte nichts helfen, werde ich diese Änderung wieder zurückgängig machen.

            //EDIT: damit du weiter arbeiten kannst, würde ich vorschlagen, du lädst die das aktuelle 1.7-stable unter http://files.adventure-php-framework...-2204-php5.zip herunter. Hier funktionieren zwar keine Tabs, aber der Parser ist getestet.
            Viele Grüße,
            Dr.E.

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            1. Think about software design [B]before[/B] you start to write code!
            2. Discuss and review it together with [B]experts[/B]!
            3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
            4. Write [I][B]clean and reusable[/B][/I] software only!
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            Kommentar


            • #51
              Code:
              Blank: 14
              Tab: 29
              Da liegt das Problem, durch den neuen Pagecontroller kann man nirgends mehr einen Tab verwenden, da du, sobald ein Tab vorhanden ist, in den if-zweig springst, hier aber nochmal prüfst ob Blank größer Tab ist und nur dann wird $tagAttributeDel gesetzt, ansonsten bleibt es undefiniert.

              Habe das ganze nun so erweiter, dass funktioniert im Moment:
              PHP-Code:
              // search for taglib to attributes string delimiter
                       
              $tagAttributeDel_Blank strpos($TagString,' ');

                       
              // BUGFIX: fixes the issue, that a TAB character is no valid delimiter
                       
              $tagAttributeDel_Tab strpos($TagString,"\t");

                       if(
              $tagAttributeDel_Tab !== false){
                          if(
              $tagAttributeDel_Blank $tagAttributeDel_Tab){
                             
              $tagAttributeDel $tagAttributeDel_Tab;
                           
              // end if
                          
              } else {
                              
              $tagAttributeDel $tagAttributeDel_Blank;
                          }

                        
              // end if
                       
              }
                       else{
                          
              $tagAttributeDel $tagAttributeDel_Blank;
                        
              // end else
                       

              Edit:
              Die Einbindung des Captchas nach Mitgelieferte-Module geht bei mir so nicht, nachdem ich erstmal herausfinden musste, dass er beim holen der Captcha Konfiguration auf einmal sites::main:res::templates als Context verwendet, auch wenn ich $fC->set('Context','main') mache oder so, danach war das Problem, dass immernoch kein Bild angezeigt wurde. Habe ich allerdings den Pfad aus dem dem <img src=...> herauskopiert und eingefügt, funktionierte das ganze wunderbar, dann wurde mir auch ein Bild angezeigt, nur wenn ich es in einem Formular eingebunden habe funktioniert es nicht.

              Kommentar


              • #52
                Hallo KarlEgon,

                ich hatte in der Mittagspause nochmal Gelegenheit darüber nachzudenken und bin auch genau auf diesen Fall gekommen. Da wir hier ohnehin schlechtere Performance erreichen, schlage ich vor, den Code wieder zu entfernen. Einverstanden?

                Habe ich allerdings den Pfad aus dem dem <img src=...> herauskopiert und eingefügt, funktionierte das ganze wunderbar, dann wurde mir auch ein Bild angezeigt, nur wenn ich es in einem Formular eingebunden habe funktioniert es nicht.
                Wichtig ist an dieser Stelle, dass der Context vor dem Starten des FrontControllers gesetzt wird. Sonst verwendet wer FrontController den Namespace-Paramater der start()-Methode als Context. Das Thema Konfiguration wird unter Adventure PHP Framework - Konfiguration nochmal genauer erläutert. Sollte das immer noch nicht funktionieren, poste mir einfach mal das Formular und deine index.php. Ich bin mir sicher, das kriegen wir auch noch hin.
                Viele Grüße,
                Dr.E.

                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                1. Think about software design [B]before[/B] you start to write code!
                2. Discuss and review it together with [B]experts[/B]!
                3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                4. Write [I][B]clean and reusable[/B][/I] software only!
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                Kommentar


                • #53
                  Kann ruhig wieder rausgenommen werden, habe ich kein Problem mit im Moment.

                  Zum Captcha:
                  register.html
                  Code:
                  <@controller namespace="modules::game::register::pres::documentcontroller" file="register_controller" class="RegisterController" @>
                  <core:addtaglib namespace="tools::form::taglib" prefix="html" class="form" />
                  <div id="register">
                  	<p>Die Registrierungsdaten werden auch f&uuml;r das Portal verwendet</p>
                  	<html:form name="RegisterForm" method="post" action="">
                  		<div class="1column">Nick:</div><div class="2column"><form:text name="username" class="eingabe_feld" validate="true" validator="Text" button="register" /></div>
                  		<div class="1column">Passwort:</div><div class="2column"><form:password name="userpass" class="eingabe_feld" validate="true" validator="Text" button="register" /></div>
                  		<div class="1column">Passwort Wiederholung:</div><div class="2column"><form:password name="userpass2" class="eingabe_feld" validate="true" validator="Text" button="register" /></div>
                  		<div class="1column">Email:</div><div class="2column"><form:text name="useremail" class="eingabe_feld" validate="true" validator="EMail" button="register" /></div>
                  		<div class="1column">Email Wiederholung:</div><div class="2column"><form:text name="useremail2" class="eingabe_feld" validate="true" validator="EMail" button="register" /></div>
                  		<form:addtaglib namespace="modules::captcha::pres::taglib" prefix="form" class="captcha" />
                  	    <form:captcha
                  		      text_class="eingabe_feld"
                  		      text_style="width: 318px;"
                  		      validate="true"
                  		      button="register"
                  	    />
                  		<div class="3column"><form:button name="register" value="Registrieren" class="eingabe_feld" /></div>
                  	</html:form>
                  </div>
                  index.php
                  PHP-Code:
                  <?php
                     
                  include_once('./core/pagecontroller/pagecontroller.php');

                     
                  import('core::frontcontroller','Frontcontroller');
                     
                  import('sites::main::biz','global_Model');
                     
                  import('sites::main::biz','north_TemplateModel');
                     
                  import('sites::main::biz','west_TemplateModel');

                     
                  $fC = &Singleton::getInstance('Frontcontroller');
                     
                  $GlobalModel = &Singleton::getInstance('GlobalModel');
                     
                  $NorthModel = &Singleton::getInstance('NorthTemplateModel');
                     
                  $WestModel = &Singleton::getInstance('WestTemplateModel');

                     
                  $GlobalModel->setAttribute('titel','KarlWars');
                     
                  $NorthModel->addTemplate('modules::game::right_top_box::pres::templates','right_top_box',1);
                     
                  $WestModel->addTemplate('modules::game::navigation::pres::templates','subnavigation',1);

                     
                  $fC->set('Context','APF');
                     
                  $fC->registerAction('sites::main','changeView');
                     
                  $fC->start('sites::main::pres::templates','main');

                     
                  $T = &Singleton::getInstance('benchmarkTimer');
                     
                  $T->setCriticalTime(0.99);
                     echo 
                  $T->createReport();
                  ?>
                  Die Konfiguration des Captchas liegt unter:
                  ./config/modules/captcha/biz/actions/APF/DEFAULT_actionconfig.ini

                  Und der Inhalt ist:
                  Code:
                  [showCaptcha]
                  FC.ActionNamespace = "modules::captcha::biz::actions"
                  FC.ActionFile = "ShowCaptchaImageAction"
                  FC.ActionClass = "ShowCaptchaImageAction"
                  FC.InputFile = "ShowCaptchaImageInput"
                  FC.InputClass = "ShowCaptchaImageInput"
                  FC.InputParams = ""
                  Nun ist es so, dass innerhalb des Formulars der alternative Text angezeigt wird (also kein Bild angezeigt wird) nehme ich allerdings die Adresse, die im src steht und rufe sie auf, wird mir ein Captcha angezeigt.

                  Kommentar


                  • #54
                    Hallo KarlEgon,

                    dein Code sollte auf den ersten Blick stimmen. Kannst du mir noch den Link zur Verfügung stellen, der generiert wird, ich vermute nämlichg, dass da noch ein Fehler in der danamischen Link-Generierung steckt. Wie ist die lokale URL zur gezeigten indx.php?
                    Viele Grüße,
                    Dr.E.

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    1. Think about software design [B]before[/B] you start to write code!
                    2. Discuss and review it together with [B]experts[/B]!
                    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                    4. Write [I][B]clean and reusable[/B][/I] software only!
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    Kommentar


                    • #55
                      Folgende URL wird generiert
                      PHP-Code:
                      /?modules_captcha_biz-action:showCaptcha=name:a6c77c25f8d9a4b4f504c5d2d22eb9d9 
                      Ahh wenn ich die ActionBaseURL im catcha Tag setze funktioniert das ganze, aber es muss doch auch noch anders gehen oder?

                      Kommentar


                      • #56
                        Hallo KarlEgon,

                        ich hab mir den Code nochmal angesehen und der Fehler / das Problem ist, dass die URL nicht generisch genug generiert wird - sie ist direkt abhängig von der Basis-URL, die die Registry-Direktive "URLBasePath" zur Verfügung stellt.

                        Da die aktuelle Request-URL an mehreren Stellen benötigt wird (TagLibs, eigener Code), habe ich mich entschlossen den PageController so zu erweitern, dass die komplette aktuelle Request-URL in der Registry als schreibgeschützter Wert (Namespace: "apf::core", Direktive: "CurrentRequestURL") zur Verfügung wird. Mit Hilfe dieses Wertes wird nun in den Tags <*:mediastream /> und <form:captcha /> die Action-URL generiert. Das sollte - soweit meine bisherigen Tests - auch für deinen Anwendungsfall und für beide URL-Layouts funktionieren.

                        Damit du weiterarbeiten kannst, habe ich dir die aktuellen Änderungen (Rücknahme der TAB-Erweiterung, Änderung der Generierung der Action-URL, ...) in einem 1.8-BETA-Package unter http://media.adventure-php-framework...-2219-php5.zip zur Verfügung gestellt. Der Code befindet sich wie immer im trunk des SVN.

                        Die neue Dokumentation der <*:mediastream />-Tags findest du unter Spezielle TagLibs :: Adventure PHP Framework (APF), die Dokumentation des CAPTCHA-Tags unter Mitgelieferte Module :: Adventure PHP Framework (APF). Der neue Registry-Wert wird unter Klassen-Referenz - Registry :: Adventure PHP Framework (APF) vorgestellt.

                        Ich hoffe, das hilft dir weiter!

                        //EDIT: Hierzu habe ich unter http://forum.adventure-php-framework...c.php?f=8&t=63 einen BugReport eröffnet. Wenn du weitere Bugs finden solltest, bitte wenn möglich dort reporten.
                        Viele Grüße,
                        Dr.E.

                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        1. Think about software design [B]before[/B] you start to write code!
                        2. Discuss and review it together with [B]experts[/B]!
                        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                        4. Write [I][B]clean and reusable[/B][/I] software only!
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        Kommentar


                        • #57
                          Die Generierung der Seite geht nun schon um einiges schneller, bestimmt so 0.3 Sekunden(was so ca. 1/3 ausmacht) gespart, allerdings kann man es nicht wirklich vergleichen, an dem Computer an dem ich sitze ist alles langsam, da dauert der aufruf einer lokalen Seite auch schonmal 5 Sekunden, aber was solls.

                          Habe nun auch schon eine Verbindung zur Datenbank hergestellt und dort Informationen rausgesucht, klappt alles ohne Probleme. Denke werde mich heute mal mit dem Registrieren eines Users beschäftigen und diesen dann in die Datenbank eintragen.
                          Hat das Framework auch etwas eingebaut um Emails versenden zu können? *such such* Ahh das gute alte Kontaktformular, werde ich mir mal anschauen ^^

                          Kommentar


                          • #58
                            Hi,

                            Hat das Framework auch etwas eingebaut um Emails versenden zu können? *such such* Ahh das gute alte Kontaktformular, werde ich mir mal anschauen ^^
                            Ja, der mailSender unter tools::mail. Schau mal, ob dir das genügt. Ansonsten nehme ich gerne für das 1.8-er release Wünsche auf.

                            Habe nun auch schon eine Verbindung zur Datenbank hergestellt und dort Informationen rausgesucht, klappt alles ohne Probleme. Denke werde mich heute mal mit dem Registrieren eines Users beschäftigen und diesen dann in die Datenbank eintragen.
                            Vielleicht ist für dich hier auch der GenericORMapper interessant. Dieser spart dir einiges an Aufwand bei der Implementierung einer Datenschicht. Eine ausführliche Diskussion dazu findest du auch unter forum.adventure-php-framework.org [de] &bull; Thema anzeigen - GenericORMapper
                            Viele Grüße,
                            Dr.E.

                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                            1. Think about software design [B]before[/B] you start to write code!
                            2. Discuss and review it together with [B]experts[/B]!
                            3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                            4. Write [I][B]clean and reusable[/B][/I] software only!
                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                            Kommentar


                            • #59
                              Den GenericORMapper habe ich mir schon angeschaut und werde ihn wahrscheinlich auch einarbeiten. Mail Funktionen habe ich mir noch nicht angeschaut, werde ich aber noch machen, vielleicht habe ich ja noch ein paar Verbesserungsvorschläge, aber viel will ich damit eigentlich nicht machen, nur einen Aktivierungslink verschicken.

                              Werde mich am Wochenende auch hinsetzen und meine Webseite mal unterteilen, schauen welche Views ich für mein Projekt brauche usw. Bis jetzt war es ja nur Spielerei um das APF auszuprobieren in hinblick auf mein Projekt und was ich alles brauchen werde. Ich denke der BenchmarkTimer wird mir auch gute Dienste erweisen und mir zeigen, wo ich noch Sachen anpassen muss.

                              Kommentar


                              • #60
                                Hallo KarlEgon,

                                freut mich, dass du nun alles hast um loszulegen. Viel Spass am Wochenende!
                                Viele Grüße,
                                Dr.E.

                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                1. Think about software design [B]before[/B] you start to write code!
                                2. Discuss and review it together with [B]experts[/B]!
                                3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                                4. Write [I][B]clean and reusable[/B][/I] software only!
                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                                Kommentar

                                Lädt...
                                X