Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208

    classe form da rendere dinamica.

    Rieccomi qua a chiedere dritte logiche.
    Ho appena creato una banale classe form che va a creare un form d'inserimento dati.
    Dal momento che l'intenzione di partenza sarebbe quella di utilizzare il form sia come base d'inserimento che come base di visualizzazione (cosa che consentirebbe all'utente anche l'edit diretto dei dati senza passare per un nuovo input edit), vorrei poter riutilizzare la stessa classe.

    Giusto per dare una struttura da esempio:

    Codice PHP:
    class form {
    [...]
    // lista infinita di variabili

            
    public function form() {
           echo 
    "<form name='addrecord' id='form' title='Inserisci un nuovo associato' action='formcheck.php' method='post' input type='submit' '>\n";        

           echo 
    "<label>ID MANUALE:  <input type=text name='old_id'></label><br>";
            echo 
    "<label>COGNOME:  <input type=text name='cognome'</label><br>";
            echo 
    "<label>SESSO: <input type=text name='sesso'</label><br>";
    //continua per svariate righe tutte simili 
    Cosa mi conviene fare? Trovare da subito una forma dinamica con qualche variabile cui eventualmente assegnare valore ' ' oppure....oppure boh ?

    grazie!

  2. #2
    la gestione di un form a classi è complessa

    solo vedendo gli echo all'interno di un metodo ti posso dire che il tuo approccio è sbagliato..
    Questa volta, più che un voto.. è favoreggiamento.

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Si beh, immaginavo di non aver centrato lo stato dell'arte purtroppo vengo da esperienza procedurale e su alcune cose ancora risento del background, mi soffermerei un secondo sulla logica allo stato brado per ora.

    Tralasciando un secondo la parte dei controlli sui campi totalmente da implementare, volevo capire se è logicamente giusto procedere così come ho pensato nel frattempo:

    - una classe (nel particolare quella che ho postato) con il codice generico del form e come value (su ciascun campo del form ) una variabile $nomedelcampo.

    - una sottoclasse extends (chiamiamola emptyForm) che sostanzialmente assegna alle variabili di cui sopra valore 'null' (o ' ' per capirci) e stampa il form vuoto e pronto all'inserimento.

    - una sottoclasse extends (chiamiamola filledForm) che invece assegna alle variabili il valore proveniente dal database riempiendomi il form con i dati richiesti.

    i controlli andrebbero implementati a parte, dato che i due casi sono assolutamente indipendenti l'uno dall'altro.
    E' sbagliato il tipo di approccio?

  4. #4
    Quote Originariamente inviata da Korenaar Visualizza il messaggio
    - una classe (nel particolare quella che ho postato) con il codice generico del form e come value (su ciascun campo del form ) una variabile $nomedelcampo.

    - una sottoclasse extends (chiamiamola emptyForm) che sostanzialmente assegna alle variabili di cui sopra valore 'null' (o ' ' per capirci) e stampa il form vuoto e pronto all'inserimento.

    - una sottoclasse extends (chiamiamola filledForm) che invece assegna alle variabili il valore proveniente dal database riempiendomi il form con i dati richiesti.

    i controlli andrebbero implementati a parte, dato che i due casi sono assolutamente indipendenti l'uno dall'altro.
    E' sbagliato il tipo di approccio?
    Mmmh

    la questione devi prenderla da molto più lontano.. un form è un tag html un po' particolare ma comunque rimane un tag html ed è riempito di altri tags html di vario tipo.. prima di gestire un form devi gestire i tags, poi avere un form generator per la parte html poi penserai agli stati del form ect ect
    Questa volta, più che un voto.. è favoreggiamento.

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Ok, forse stiamo ragionando su due livelli diversi. Tu forse parli di concatenare stringhe, io non arrivo al momento a quella pretesa sarebbe come imparare a tirare punizioni all'incrocio dei pali sapendo a malapena tenere un pallone tra i piedi

    Mi interessava intanto capire se di base il ragionamento è giusto e se può funzionare, chiaramente se passa da qui un purista del php avrà voglia di picchiarmi, ma per gradi ed in futuro spero di non dargliene più adito

  6. #6
    Quote Originariamente inviata da Korenaar Visualizza il messaggio
    Mi interessava intanto capire se di base il ragionamento è giusto e se può funzionare, chiaramente se passa da qui un purista del php avrà voglia di picchiarmi, ma per gradi ed in futuro spero di non dargliene più adito
    ed è per questo che ti sto dicendo che cosi non vai da nessuna parte.. il ragionamento non può essere giusto se parti già con la base sbagliata
    Questa volta, più che un voto.. è favoreggiamento.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Ok, allora giusto per chiudere l'argomento, mi hai instillato sincera curiosità ma in giro di esempi in tal senso non ne ho trovati.
    Secondo il tuo metodo bisognerebbe inserire stringhe di html in un array da concatenare secondo necessità?
    Grazie per il tuo contributo comunque

  8. #8
    diciamo che non hai molte alternative.. un tag html è una stringa e per forza di cose se vuoi ricreare un form html con php, devi ricostruire la stringa per il tag che ti serve

    un approccio potrebbe essere:
    una classe abstract padre per le funzionalità comuni dei tags
    una classe per ogni tag che estende tags
    una interfaccia che collega i tags (es. render() )
    una classe form che estende tags
    un factory method che sfrutta l'interfaccia nella classe form per la costruzione del body


    un altro approccio meno dispendioso ma su sistemi che usano pattern MVC:
    crei una vista html con il form che ti interessa


    se vuoi ho una classe vecchia come spunto ma è vecchia, dimmi te
    Ultima modifica di Al_katraz984; 24-02-2014 a 15:52
    Questa volta, più che un voto.. è favoreggiamento.

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    208
    Guarda, intanto ti ringrazio davvero tanto perchè lo spunto che dai è già davvero importante.
    Francamente ho sottovalutato la sfida del passaggio da procedurale ad oggetti, se veramente hai questa vecchia classe da prendere come spunto sarebbe un aiuto gigantesco. Non sto cercando codice già fatto da riutilizzare, anche perchè se non capisco quello che scrivo è un pò difficile che possa successivamente rimetterci le mani, però un esempio in codice mi farebbe sicuramente comodo per tradurre in concreto il concetto e consentirmi di agganciarlo per replicarlo a modo mio.

    Se non ti tolgo troppo tempo e se non hai (giustissime) gelosie sul codice, te ne sarei grato. Anche in privato se non vuoi diffonderlo.

    E grazie ancora!

  10. #10
    te le riporto cosi come le ho trovate, alcuni passaggi ora si possono fare molto più semplici

    l'interfaccia per i widget
    Codice PHP:
    inteface returnHtml {
      public function 
    toHtml();

    tag.php
    Codice PHP:
    abstract class tag {

        public 
    $content;
        public 
    $output;

        public function 
    __construct$attributes ) {
            if ( 
    count$attributes ) < ) {
                throw new 
    Exception'Invalid number of attributes! for "' get_class$this ) . '::construct()' );
            }
            
    $this->attributes $attributes;
        }

        abstract protected function 
    setContent$content );

    un esempio di widget html
    p.php
    Codice PHP:
    class extends tag implements returnHTML {

        public 
    $content;
        public 
    $output '<p ';

        public function 
    setContent$content ) {
            
    $this->content = ($content instanceof returnHtml) ? $content->toHtml() : $content;
            return 
    $this;
        }

        public function 
    toHtml() {
            foreach ( 
    $attributes AS $attribute=>$value ) {
                
    $this->output .= $attribute '="' $value '" ';
            }
            
    $this->output substr_replace$this->output'>', -);
            
    $this->output .= $this->content;
            
    $this->output .= '</p>';
            return 
    $this->output;
        }

    la classe form (la gestione dell'interfaccia ora si può fare in modo più elegante)
    form.php
    Codice PHP:
    class form {

        private static 
    $instance NULL;
        private 
    $action;
        private 
    $autocomplete;
        private 
    $enctype;
        private 
    $method 'POST';
        private 
    $name;
        private 
    $novalidate;
        private 
    $target;
        private 
    $attributes = array();
        private 
    $content = array();
        private 
    $nl "\n";
        private 
    $html;

        public function 
    __construct$attributes$content ) {
            
    $this->attributes $attributes;
            
    $this->content[] = $content;
        }

        protected function 
    parseAttributes() {
            
    $permittedAttributes = array( 'accesskey''class''contenteditable''contextmenu''dir''draggable',
                                        
    'dropzone''hidden''id''lang''spellcheck''style''tabindex''title',
                                        
    'accept-charset''action''autocomplete''enctype''method''name''novalidate',
                                        
    'target'
                                    
    );

            foreach( 
    $this->attributes AS $attribute=>$value ) {
                if ( !
    in_array$attribute$permittedAttributes ) ) {
                    throw new 
    Exception__CLASS__ .  "L'attributo " $attribute ' non è supportato.');
                }
                
    $this->$attribute $value;
            }
        }

        public function 
    setId$id ) {
            
    $this->action $id;
        }

        public function 
    setAction$action ) {
            
    $this->action $action;
        }

        public function 
    setAutocomplete$autocomplete ) {
            
    $permittedValue = array( 'on''off' );
            if ( 
    in_array$autocomplete$permittedValue ) ) {
                
    $this->autocomplete $autocomplete;
                } else {
                throw new 
    Exception__CLASS__ .  '"' $autocomplete '" non è un valore valido per l\'attributo "autocomplete". Usa "on" o "off".');
            }
        }

        public function 
    setEnctype$enctype ) {
            
    $this->enctype $enctype;
        }

        public function 
    setMethod$method ) {
            
    $permittedValue = array( 'GET''POST' );
            if ( 
    in_array$method$permittedValue ) ) {
                
    $this->method $method;
                } else {
                throw new 
    Exception__CLASS__ .  '"' $method '" non è un valore valido per l\'attributo "method". Usa "GET" o "POST".');
            }
        }

        public function 
    setName$name ) {
            
    $this->name $name;
        }

        public function 
    setNovalidate$novalidate ) {
            
    $this->novalidate $novalidate;
        }

        public function 
    setTarget$target ) {
            
    $this->target $target;
        }

        private function 
    getContent() {
            return 
    $this->elementToHtml$this->content );
        }

        private function 
    elementToHtml$element ) {
            
    // initialize the variable that will collect our generated HTML
            
    $html '';

            
    // Attempt to generate HTML code for what is passed
            
    if ( is_object$element ) ) {
                
    // If this is an object, attempt to generate the appropriate HTML
                // code.
                
    if ( is_subclass_of$element'tag' ) ) {

                    
    // Attempt to generate code using first toHtml and then toString
                    // methods. The result is not parsed with _elementToHtml because
                    // it would improperly add one tab indentation to the initial line
                    // of each object's output.
                    
    if ( method_exists$element'toHtml' ) ) {
                        
    $html .= $element->toHtml();
                    }
                }
            } elseif ( 
    is_array$element ) ) {
                foreach ( 
    $element AS $item ) {
                    
    // Parse each element individually
                    
    $html .= $this->elementToHtml$item );
                }
                } else {
                
    // If we don't have an object or array, we can simply output
                // the element after indenting it and properly ending the line.
                
    $html .= $element;
            }
            return 
    $html;
        }

        private function 
    buildForm() {
            
    $this->html '<form ';
            if ( isset( 
    $this->action ) ) {
                
    $this->html .= ' action="' $this->action '"';
                } else {
                throw new 
    Exception__CLASS__ .  'Per creare un form devi inserire un valore per l\'attributo "action".');
            }
            if ( isset( 
    $this->autocomplete ) ) {
                
    $this->html .= ' autocomplete="' $this->autocomplete '"';
            }
            if ( isset( 
    $this->enctype ) ) {
                
    $this->html .= ' enctype="' $this->enctype '"';
            }
            if ( isset( 
    $this->method ) ) {
                
    $this->html .= ' method="' $this->method '"';
            }
            if ( isset( 
    $this->name ) ) {
                
    $this->html .= ' name="' $this->name '"';
            }
            if ( isset( 
    $this->id ) ) {
                
    $this->html .= ' id="' $this->id '"';
            }
            if ( isset( 
    $this->novalidate ) ) {
                
    $this->html .= ' novalidate="' $this->novalidate '"';
            }
            if ( isset( 
    $this->target ) ) {
                
    $this->html .= ' target="' $this->target '"';
            }
            
    $this->html .= '>' $this->nl;
            
    $this->html .= $this->getContent();
            
    $this->html .= '</form>' $this->nl;
        }

        public function 
    getHtml() {
            
    $this->buildForm();
            return 
    $this->html;
        }

    uso
    Codice PHP:
    $p = new p( array( 'class'=>'blue' ) )->setContent'Questo è un paragrafo' );

    $form = new form( array( 'name'=>'user-insert-form''method'=>'POST' ), $p );
    $form->setAction$_SERVER['PHP_SELF'] );
    echo 
    $form->getHtml(); 

    ecco

    il metodo più importante è elementToHtml
    Ultima modifica di Al_katraz984; 25-02-2014 a 15:51
    Questa volta, più che un voto.. è favoreggiamento.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.