Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    PHP concettuale: sviluppo dei form html

    Ciao,
    stò cercando di modificare alcune cose in un mio script.
    In pratica cerco un modo migliore di programmare l sito e una maggiore separazione tra php ed html.

    Fino ad ora ho sempre fatto cosi:

    Pagina form.html:
    codice:
    				
    <form id="form" name="$nomeform" method="post" action="$pagina_go_form?option=$optionform&action=$actionform$form_id_to_update" enctype="multipart/form-data">
    	<label classe="classe">Label</label>
    	<input class="classe" name="titolo_pagina" id="titolo_pagina" value="$value_titolo_pagina" type="text" title="Titolo pagina" />
    
    
    	<label classe="classe">Corpo della pagina</label>
    	<textarea class="class" id="corpo_pagina" name="corpo_pagina" title="Corpo pagina">$value_corpo_pagina</textarea>
    
    ...
    Le variabili che vedete annidate nel codice html vengono convertite nel rispettivo valore per cui non preoccupatevi di quello.

    Questa pagina viene inclusa nel sito tramite la funzione get_template(f'orm.html'); nella pagina php.

    Adesso, vorrei evitare di rendere fisso il form nel template e ho creato delle funzioni che creano il form direttamente nella pagina php, cosa che ho visto fare a molti programmatori.

    funzioni.php
    Codice PHP:
    function setForm($array)
    {
        global 
    $config;
        
        
    $numargs func_num_args();
        
    $input '';
        
        while(list(
    $key,$value) = each($array))
        {
            
    $input .= "$key=\"$value\" ";
        }
        
        
    $input '<form ' $input '>';
        
    $arg func_get_args();
        for(
    $n 1$n $numargs$n++)
        {
            
    $input .= $arg[$n];    
        }
        
        
    $input .= '</form>';
        
        return 
    $input
    }

    function 
    setTextInput($array)
    {
        global 
    $config;
        
        
    $input '';
        while(list(
    $key,$value) = each($array))
        {
            
    $input .= "$key=\"$value\" ";
        }
        
        
    $input '<input ' $input '/>';
        return 
    $input;

    Queste funzioni vengono adoperate in questo modo

    form.php
    Codice PHP:
    echo setForm
    (
        array(
    'name'=>'nomeform','method'=>'post','action'=>'form.php'),
        
        
    # campo input con label
        
    setLabel
        
    (
            
    'valoreid','classlabel',
            
    setTextInput
            
    (
                array(
    'type'=>'text','class'=>'classe','name'=>'nome','value'=>'valore',
                    
    'title'=>'titolo','ddv-required'=>'true','id'=>'valoreid')
            )
            ,
    'valorelabel: '
        
    ),
        
        
    # campo input con label
        
    setLabel
        
    (
            
    'valorid','classlbel',
            
    setTextInput
            
    (
                array(
    'type'=>'text','class'=>'classe','name'=>'nome','value'=>'valore',
                    
    'title'=>'titolo','ddv-required'=>'true','id'=>'valorid')
            )
            ,
    'valorlabel: '
        
    ),
        
        
    # campo input con label
        
    setLabel
        
    (
            
    'valorid','classlbel',
            
    setTextInput
            
    (
                array(
    'type'=>'text','class'=>'classe','name'=>'nome','value'=>'valore',
                    
    'title'=>'titolo','ddv-required'=>'true','id'=>'valorid')
            )
            ,
    'valorlabel: '
        
    ),
        
        
    '<input type="submit" value="Invia"'
    ); 
    La mia domanda è:
    Secondo il parere di persone più esperte, questo modo di fare migliora o peggiora lo script?

    Considerando che il form non deve poter essere modificato dal template, ma deve essere uguale anche se si cambia template al sito è corretto usare questo tipo di funzioni o un semplice echo del form pronto sarebbe stato meglio?
    Inoltre dato che alcuni dati che adesso vedete serviti alle funzioni saranno dinamici e che con dei cicli si possono creare dei form più grandi e completi, ritenete questa soluzione valida?

    Grazie
    Ciao!

  2. #2
    a mio avviso è il metodo peggiore, piu che altro perchè un metodo del genere ha una mantenibilità bassissima.

    prova a vederti come Zend_Framework gestisce i form. Li hai un esempio ben strutturato e ben ingegnerizzato (a mio avviso) di quello che stai cercando di realizzare tu, e ti spiega anche i criteri di programmazione (design patterns) seguiti

    A mio avviso sono 3 i dettami principali da seguire:

    1) pattern MVC per separare logica di business, azioni, e rappresentazione dei dati

    2) nel tuo caso, seguire l'idea dello zend per la gestione e la creazione dei form

    3) al posto del punto 2 (ma qui bisogna vedere l'esigenze di progetto), lasciare in html la struttura del form e sostituire con chiamate a metodi di un oggetto la creazione degli elementi dinamici, ovvero nel tuo caso l'intestazione del form e i vari input. Facendo questo, l'oggetto view che gestisce il caricamento del template potrebbe inizializzare correttamente i dati da inserire dentro all'oggetto formHelper che creai i vari input, e usare l'oggetto in fase di rendering. La modifica dell'aspetto grafico del form, a meno di stravolgimenti, può essere gestita usando CSS diversi a seconda del template

    i punti 2/3 sono anche complementari (un esempio del punto 3 è l'uso degli helper in CakePhp ad esempio)

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Puntualizzazioni:

    1) rivedendo quello che hai scritto, forse stiamo dicendo la stessa cosa

    2) ti faccio presente due cose

    a)

    questo codice:

    Codice PHP:
     while(list($key,$value) = each($array)) 
        { 
            
    $input .= "$key=\"$value\" "
        } 
    lo devi mettere in un metodo privato in quanto altrimenti sei costretto a duplicarlo per ogni setQualcosa che aggiugni

    b)

    fare un setQualcosa per ogni qualcosa è abbastanza inutile. usando __call puoi fare un metodo generico che risponda in questo modo:

    Codice PHP:

    echo $formHelper->input( array('type'=>'text',...) );

    echo 
    $formHelper->label( array('class'=>'pippo') , testo1testo2testo3 ); //ritorna testo1.testo2.testo3 wrappati introno ad un tag label

    echo $htmlHelper->div( array(), testi_vari);

    echo 
    $htmlHelper->table
       
    $htmlHelper->tr$htmlHelper->td($formHlper->div('prova')))); 

    tutti questi metodi in realtà sono intercettati da __call che può passarli ad un'unico metodo create. In tal modo puoi anche scrivere tag non standard, come

    $htmlHelper->pipppo('ciao'); ritorna
    codice:
    <pippo>ciao</pippo>
    o anche

    Codice PHP:

    echo $html->script( array('type'=>'text/javascript'), " mioArray.each(function(el){ alert(el); }); ");

    //torna <script type="text/javascript">mioArray.each(function(el){ alert(el); });</script> 
    etc etc etc
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Grazie Santino,
    hai per caso qualche risorsa che mi puoi linkare? Una guida / manuale?

    In pratica tu scrivi delle classi che ricevono i metodi e ne espandono le proprietà.

    Io invece più semplicemente ho scritto delle funzioni a cui passo degli argomenti.

    Vediamo se ho capito, per scrivere un input con il mio metodo faccio:

    Codice PHP:
    echo setLabel
        
    (
            
    'user','',
            
    setTextInput
            
    (
                array
                (
                    
    'type'=>'text',
                    
    'class'=>'classe',
                    
    'name'=>'user',
                    
    'value'=>'',
                    
    'title'=>'Username',
                    
    'ddv-required'=>'true',
                    
    'id'=>'user'
                
    )
            ),
            
    'Username: '
        
    )

    # questo restituisce:
    <label for="user">Username:  <input type="text" class="classe" name="user" value="" title="Username" ddv-required="true" id="user" /></label
    Con il metodo postato da te dovrei fare:
    Codice PHP:
    echo $formHelper->input
    (
        array
        (
            
    'type'=>'text',
            
    'class'=>'classe',
            
    'name'=>'User',
            
    'value'=>'',
            
    'title'=>'Username',
            
    'ddv-required'=>'true',
            
    'id'=>'user'
        
    )
    );

    # questo dovrebbe restituire lo stesso input ma senza il label che lo contiene 
    Corretto?

    I due codici sono uno procedurale, il mio, ed uno ad oggetti, il tuo.
    Tra i due quale è da preferire? E perchè?
    Ciao!

  5. #5
    nessuno?
    Ciao!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.