php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.01.2009, 17:43  
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 316
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard Formulargenerierung | Composite Pattern

Hallo zusammen,

ich schreibe aus zur Übung einen Formulargenerator. Ziel soll es sein das mir das HTML für ein Formular bequem ausgegeben werden kann.
Zur Umsetzung habe ich das Composite Pattern gewählt weil mir die Darstellung als Baum mit einer Wurzel hier sinnvoll erscheint und ich noch keine Möglichkeit hatte dieses anzuwenden.
Was ich schon geschafft habt ist das erstellen von Select Boxen, mit der Möglichkeit CSS Id's und Classes einzutrage, Multible Auswahlen zu treffen, die Size zu Bestimmen und Optiongroups mit anzugeben. Leider weiss ich nicht wie ich das Löschen eines Blatts aus dem Baum bewerkstelligen könnte? Momentan bin ich bei dem Gedanken jedem Objekt eine eindeutige Identifikationsnummer mitzugeben, aber wie kann man diese dann sinnvoll verwalten?
Ist es in diesem Anwendungsfall überhaupt nötig ein Löschen überhaupt zu gestatten?

Aber damit Ihr seht worüber ich rede einmal mein Sourcecode:

PHP-Code:
<?php

interface FormAccess {
    public function 
getData();
    public function 
getHTML();
    public function 
getChildrenHTML();
    public function 
add(FormObject $obj);
    public function 
remove(FormObject $obj);
    
}

abstract class 
FormObject implements FormAccess  {

    
/**
     * Speichert die Kindelemente eines Objektes
     *
     * @var array
     */
    
protected $children = array(); 
    
    
/**
     * Speichert die Daten eines Formular elements
     *
     * @var unknown_type
     */
    
protected $data = array();

    
/**
     * Zum hinzufügen eines childs
     *
     * @param FormObject $obj
     */
    
public function add(FormObject $obj) {
        
$this->children[] = $obj;
    }
    
    
/**
     * Zum entfernen eines childs
     *
     * @param FormObject $obj
     */
    
public function remove(FormObject $obj) {}

    
/**
     * Gibt die Formulardaten des Objektes zurück
     *
     * @return array
     */
    
public function getData() {
        return 
$this->data;
    }
    
    
/**
     * Ruft für alle Kindelemente die Methode getHTML auf
     *
     * @return string
     */
    
public function getChildrenHTML() {
        
$childrenHTML '';
        foreach(
$this->children as $child) {
            
$childrenHTML .= $child->getHTML();
        }
        
        return 
$childrenHTML;
    }
    
    
/**
     * Rohling für die getHTML Funktionen
     *
     */
    
public function getHTML() {
        
    }
}

class 
FormSelect extends FormObject {

    public function 
__construct($name$size 1$id ''$class ''$multiple false) {
        
        
$this->data['name'] = $name;
        
$this->data['size'] = $size;
        
$this->data['multiple'] = $multiple;
        if(
$id !== '')
            
$this->data['id'] = $id;
        if(
$class !== '')
            
$this->data['class'] = $class;
    }
    
    public function 
getHTML() {
        
$beginn "\t".'<select name="'.$this->data['name'].'" size="'.$this->data['size'].'"';
        if(isset(
$this->data['id']))
            
$beginn .= ' id="'.$this->data['id'].'"';
        if(isset(
$this->data['class']))
            
$beginn .= ' class="'.$this->data['class'].'"';
        if(
$this->data['multiple'])
            
$beginn .= ' multiple';
        
$beginn .= '>'."\n";
        
        
$optionsData $this->getChildrenHTML();
        
        
$end "\t".'</select>'."\n";
        
        return 
$beginn.$optionsData.$end;
    }


}

class 
FormSelectOption extends FormObject {
    
    public function 
__construct ($value$text) {
        
$this->data['value'] = $value;
        
$this->data['text'] = $text;
    }
    
    public function 
getHTML() {
        return 
"\t\t".'<option value="'.$this->data['value'].'">'.$this->data['text'].'</option>'."\n";
    }
}

class 
FormSelectOptionGroup extends FormObject {
    public function 
__construct($label) {
        
$this->data['label'] = $label;
    }
    
    public function 
getHTML() {
        
$beginn '<optgroup label="'.$this->data['label'].'">';
        
        
$childHTML $this->getChildrenHTML();
        
        
$end '</optgroup>';
        
        return 
$beginn.$childHTML.$end;
    }
}



class 
FormComposite extends FormObject {

    public function 
__construct($name$action='#'$method 'post'$id=''$class='') {
        
$this->data['name'] = $name;
        
$this->data['action'] = $action;
        
$this->data['method'] = $method;
        if(
$id !== ''$this->data['id'] = $id;
        if(
$class !== ''$this->data['class'] = $class;
    }
    
    public function 
getHTML() {
        
$beginn '<form name="'.$this->data['name'].'"';
        
$beginn .= ' action="'.$this->data['action'].'"';
        
$beginn .= ' method="'.$this->data['method'].'"';
        if(isset(
$this->data['id']))
            
$beginn .= ' id="'.$this->data['id'].'"';
        if(isset(
$this->data['class']))
            
$beginn .= ' class="'.$this->data['class'].'"';
        
$beginn .= '>'."\n";
        
        
$childrenData $this->getChildrenHTML();
        
        
$end '</form>'."\n";
        
        return 
$beginn.$childrenData.$end;
        
            
    }
    public function 
getData() {}


}

$form = new FormComposite'test' );
$select = new FormSelect'FooSelect' );
$optGrp = new FormSelectOptionGroup('Werte');
$optGrp->add(new FormSelectOption('value1''text1'));
$optGrp2 = new FormSelectOptionGroup('Mehr Werte');
$optGrp2->add(new FormSelectOption('value2''text2'));

$select->add($optGrp);
$select->add($optGrp2);
$form->add($select);

echo 
$form->getHTML();

#var_dump($form);

?>
Schon einmal vielen Dank für eure Antworten. Auch Kritik an der Implementierung ist gestattet und sogar erwünscht

Edit: an der Einrückung des erstellten Sourcecode muss ich natürlich noch arbeiten.
__________________
twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

$live->free() OR die();
moveax1 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.01.2009, 17:49  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

numerischer Index reicht doch, oder? Macht DOM doch auch nicht anders...
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 24.01.2009, 18:00  
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 316
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

Dann wäre mein Vorgehen nun der Klasse FormObject eine Eigenschaft ID zuzuweisen.

Damit ich die zuletzt vergebene ID immer vorliegen habe gestalte ich die Eigenschaft statisch. Danke für den Tipp.

Über die nummerische ID kann ich dann auch das Löschen von Objekten vornehmen Problem gelöst
__________________
twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

$live->free() OR die();
moveax1 ist offline   Mit Zitat antworten
Alt 24.01.2009, 18:01  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Ich hatte eher an den Index von $children gedacht.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 24.01.2009, 18:13  
Erfahrener Benutzer
 
Registriert seit: 27.09.2008
Beiträge: 316
PHP-Kenntnisse:
Fortgeschritten
moveax1 befindet sich auf einem aufstrebenden Ast
Standard

hm, ich habe mir das so überlegt, jedes children bekommt einen Index der im __construct zugewiesen wird. Damit das ganze aber auch eindeutig bleibt, speichere ich den zuletzt verwendeten in der statischen Eigenschaft.
__________________
twitter.com/moveax1 || http://modxcms.com/ || http://ubuntuusers.de/

$live->free() OR die();
moveax1 ist offline   Mit Zitat antworten
Alt 24.01.2009, 18:53  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Das ist aber genau genommen wieder eine ID. Beim automatischen Index im Array
- verhinderst Du Doppelbelegungen
- hast einen einfachen Zugrif (einfach über Array-Schlüssel statt über dioe Abfrage der Objekte)
- hast Du einen konsistenten num. Index (kannst bspw. 3 mal den Index 0 löschen und die anderen werden stets neu indiziert)
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 24.01.2009, 19:43  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

anstatt getHtml und getChildrenHtml würde ich __toString() empfehlen, dann sparst du dir hilfsfunktionen....
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 24.01.2009, 22:07  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Zitat:
PHP-Code:
$form = new FormComposite'test' );
$select = new FormSelect'FooSelect' );
$optGrp = new FormSelectOptionGroup('Werte');
$optGrp->add(new FormSelectOption('value1''text1'));
$optGrp2 = new FormSelectOptionGroup('Mehr Werte');
$optGrp2->add(new FormSelectOption('value2''text2'));

$select->add($optGrp);
$select->add($optGrp2);
$form->add($select);

echo 
$form->getHTML(); 
Diese Vorgehensweise hat zwei entscheidende Nachteile: keine Formatierung möglich, zu viel PHP-Code für ein Formular!

Zitat:
Leider weiss ich nicht wie ich das Löschen eines Blatts aus dem Baum bewerkstelligen könnte? Momentan bin ich bei dem Gedanken jedem Objekt eine eindeutige Identifikationsnummer mitzugeben, aber wie kann man diese dann sinnvoll verwalten?
Ich würde mit einer Objekt-ID arbeiten, bzw. die Adressierung über den Namen oder die ID des Feldes abbilden. Das ist nahe am HTML und damit an der Realität der Formular-Definition. Bei einem Composite-Baum sollte es keine Schwierigkeit sein per getFormElementBy[Name|ID]() eine Referenz auf ein Formular-Element zu bekommen um diese antsprechend bearbeiten zu können (Hierarchie bei einem Formular ist auf 2 begrenzt!).
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Alt 25.01.2009, 20:15  
Neuer Benutzer
 
Registriert seit: 27.12.2008
Beiträge: 23
Bleda befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von dr.e. Beitrag anzeigen
Diese Vorgehensweise hat zwei entscheidende Nachteile: keine Formatierung möglich, zu viel PHP-Code für ein Formular!
Da würde mich interessieren weshalb... Wegen der Performance oder weil es einfach nicht so schön ist, das ganze Formular mit "new"s zu definieren?
Bleda ist offline   Mit Zitat antworten
Alt 25.01.2009, 22:34  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Die Begründung steht doch bereits im Zitat. In der oben beschriebenen Klasse ist es nicht möglich, das Formular sauber zu designen ohne Handstände machen zu müssen. Einfaches Beispiel: zusätzliche Formatierungen wie <div />, <span /> oder <p /> um die Elemente legen oder einzelne Beschriftungen mehrsprachig gestalten.

Die weitaus bessere Möglichkeit ist es Aussehen und Funktion zu trennen. Anregungen finden sich hier.
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
preg_replace: Gleiche Platzhalter im Pattern Lavalampe PHP Tipps 2009 5 16.01.2009 21:42
Singleton Pattern Verstaendisproblem Luka PHP Tipps 2008 13 19.12.2008 19:00
PHP Command Pattern = Module? meGa Software-Design 4 14.12.2008 12:35
[Erledigt] Formularvalidierung, preg_match pattern Problem moveax1 PHP Tipps 2008 4 12.12.2008 16:48
Design Pattern Harry B. Software-Design 7 02.09.2008 20:49
Bild vor Link pattern TimmaY PHP Tipps 2007 5 21.03.2007 18:06
Hilfe bei Pattern Syntax Charly Shop Sui PHP Tipps 2006 4 13.05.2006 20:10
Decorator pattern: 'protected' und parallele vererbung axo PHP-Fortgeschrittene 5 20.10.2005 15:53
[Erledigt] Design Pattern - MySQL Sitzung in allen Objekten nutzen PHP-Fortgeschrittene 21 28.04.2005 22:18
Folgendes Pattern PHP Tipps 2005 5 01.03.2005 12:41
Probleme mit Pattern bei Templateersetzung RudiS PHP-Fortgeschrittene 2 19.02.2005 22:09
Pattern Syntax Problem mit MulitLine PHP Tipps 2004-2 2 21.12.2004 15:53
preg_match --> pattern PHP Tipps 2004 4 27.08.2004 18:12

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
composite pattern php, php composite pattern, composite pattern, formular pattern, composite formular, composition pattern, design muster für erfassungsformulare, php composite pattern return values, pattern . form html, composite pattern html dom, composite pattern html, patter funktion html form, pattern by formular, pattern form html, php formulargenerierung klasse, php framework composite pattern, ->getdata ->getchildrenhtml, composite pattern übung, automatische formulargenerierung, composite pattern anwendung

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:39 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum