Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725

    Tabella in un File di Classe

    Ciao a tutti. Qualche giorno fa avevo anticipato la mia intenzione a cimentarmi nella Programmazione ad Oggetti con PHP. Già tempo fa mi ero messo a lavorare con questa realizzando qualche classe piuttosto banale che serviva ai miei scopi, ora volevo approfondire l'argomento.

    Ho una pagina in php che chiamiamo Main.php, questa contiene una tabella con una decina di colonne. Per poter render il tutto più interessante ho realizzato il file Main.class.php ovvero un file di classe dove sarà possibile stabilire le colonne che faranno parte della tabella indicandone dei parametri.

    Per complicare il tutto ho realizzato la pagina Nascondi.php in questa pagina riporto la lista di colonne presenti in Main.php e permetto tramite una checkbox di selezionare le colonne che si vuole nascondere.

    Ora passiamo un po alla parte pratica.
    Posterò solo la parte relativa al file di Classe.

    Main.class.php
    Codice PHP:
    <?php
    class Tabella{
            
        private 
    $var "";
        private 
    $contenitore = Array();
        
        public function 
    __construct($par) {
            
    $this->var $par;
        }

        public function 
    displayVar() {
            echo 
    $this->var;
        }
        
        public function 
    aggiungi($key,$element){
            
    $this->contenitore[$key] = $element;
        }
        
        public function 
    getElement($key){
            return 
    $this->contenitore[$key];
        }  
        
        public function 
    getNome($key){
            
    $el = ($this->contenitore[$key]);
            return 
    $el->getNome();    
        }  
            
        public function 
    getDimensione($key){
            
    $el = ($this->contenitore[$key]);
            return 
    $el->getDimensione();    
        }  
            
        public function 
    getVisibile($key){
            
    $el = ($this->contenitore[$key]);
            return 
    $el->getVisibile();
        }  
            
    }

    class 
    Colonna{
            
        private 
    $titolo           "";
        private 
    $dimensione  "";
        private 
    $visibile     "";
        
        public function 
    __construct($titolo,$dimensione,$visibile) {
            
    $this->titolo $titolo;
            
    $this->dimensione $dimensione;
            
    $this->visibile $visibile;
        }
      
        public function 
    getNome(){
            return 
    $this->titolo;
        }
            
        public function 
    getDimensione(){
            return 
    $this->dimensione;
        }
            
        public function 
    getVisibile(){
            return 
    $this->visibile;
        }
                    
    }
        
    $Require_Tabella = new Tabella("PROV");

    # Definisco le Colonne
    $Require_Tabella->aggiungi("nome_campo",new Colonna("nome_campo""dimensioni","visibilita"));
        
    ?>
    Passiamo ora alla parte di commento.

    Come avrete notato alla fine del codice richiamo l'oggetto Tabella, poi tramite la funzione aggiungi vado ad inserire come indice dell'array contenitore il "nome_campo" ed associo i dati della colonna.

    Una volta inserite quindi le colonne, dal file Main.php tramite una semplice sintassi posso ottenere tutti i dati.

    Ad esempio con l'istruzione $dimensione = $Require_Tabella->getDimensione("nome_campo"); ottengo la dimensione e cosi via.
    Per quanto riguarda il pescaggio dei dati infatti non ho problemi.

    Il problema sorge quando voglio nascondere una colonna. Ho il file Nascondi.php come detto prima, quando Salvo la scelta delle checkbox controllo quelle che sono settate e vorrei aggiungerci una funzione, la funzione modVisibile() con questa funzione vorrei far si che se la checkbox è selezionata e la colonna è nascosta io possa modificare nel mio file di classe per quella colonna il valore di visibile e il valore della dimensione.

    Avevo provato questa strada
    Codice PHP:
    <?php
    # Nell'oggetto Tabella aggiungi
    public function modVisibile($key){
        
    $el = ($this->contenitore[$key]);
        return 
    $el->modVisibile();    
    }

    # Nell'oggetto Colonna aggiungi
    public function modVisibile(){
       
    $this->visibile 0;
       return 
    $this->visibile;
    }
    ?>
    Bene la sintassi pare corretta, ho provato a fare questo test.
    codice:
    In una pagina a parte ho fatto questo test:
    Stampa Visibile di "nome_campo" (ha stampato 1)
    Richiamo modVisibile (ha stampato 0)
    Stampa Visibile di "nome_campo" (ha stampato 0)
    Quindi come vedete il codice 'dovrebbe' funzionare.
    Dove sta l'inghippo?

    Il casino è questo. Con la pagina Nascondi.php io richiamo la funzione ed effettivamente per quella colonna il campo visibile passa a 0, tuttavia quando torno sulla mia Main.php e magari la ricarico, questa includendo il file di Classe molto probabilmente mi resetta l'array e quindi perde la mia modifica ed è qui che non so come andare avanti. Penso che il casino nasca da questo: private $contenitore = Array(); definito nell'oggetto Tabella, tuttavia se non lo indico non funziona nulla

    Quindi tutto sto casino per chiedervi, come posso fare per via che la modifica fatta nella pagina Nascondi.php sia effettiva anche per la Main.php

    In entrambe le pagine includo il file Main.class.php.

    Grazie infinite a tutti, sono nelle vostre mani !!!!!!!!
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  2. #2
    due cose:

    1) Puoi anche forzare il tipo del parametro nella dichiarazione della funzione, in maniera di essere sicuro di star lavorando con gli oggetti che ti aspetti..ad esempio:

    codice:
    public function aggiungi($key,Colonna $element)
    poi si può anche discutere se la key dev'essere indipendente o un attributo di Colonna

    2) ehm... uno script php nasce e muore con l'esecuzione della pagina...cioè, una volta che tu vedi la pagina nel browser lo script è già "morto" da un pò.... l'unico modo per far si che lo script si "ricordi" di stati precedenti è usare un database/cookie/session/file_di_testo/e_tutto_lo_scrivibile_su_filesystem_che_puoi_immag inare, quindi è normale che se refreshi la pagina ti ritorna allo stato di partenza la tabella

    cmq per nascondere/mostrare le colonne userei più banalmente Javascript.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Originariamente inviato da Santino83_02

    2) ehm... uno script php nasce e muore con l'esecuzione della pagina...cioè, una volta che tu vedi la pagina nel browser lo script è già "morto" da un pò.... l'unico modo per far si che lo script si "ricordi" di stati precedenti è usare un database/cookie/session/file_di_testo/e_tutto_lo_scrivibile_su_filesystem_che_puoi_immag inare, quindi è normale che se refreshi la pagina ti ritorna allo stato di partenza la tabella

    cmq per nascondere/mostrare le colonne userei più banalmente Javascript.
    Si ok per Js però dovrei usare la OOP perchè voglio apprenderla.
    Io volevo usare proprio il sistema delle Sessioni, avevo provato a settare dopo aver creato le colonne una variabile di Sessione e far si che se la variabile era presente mi caricasse l'oggetto dalla sessione, altrimenti me lo istanziasse di nuovo.

    Tuttavia non sono riuscito a far funzionare questo metodo come consigli di usarlo?
    Per essere precisi se la varibile la trovava non gli facevo reinserire le colonne e l'errore era proprio su queste infatti mi diceva che non le trovava (Undefined index for contenitore)
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  4. #4
    Per l'uso delle sessioni puoi guardare in giro, anche sul forum, che c'è tanto materiale

    per la tua classe, tu prima inserisci TUTTE le colonne, e poi nascondi quelle che non vuoi mostrare...del tipo:

    Codice PHP:


    //prima crei la tabella
    $Require_Tabella = new Tabella("PROV"); 

    //inserisci tutte le N colonne
    # Definisco le Colonne 
    $Require_Tabella->aggiungi("nome_campo",new Colonna("nome_campo""dimensioni","visibilita")); 


    //dove ti pare a te nascondi una delle colonne
    $Require_Tabella->hideColumn("nome_campo")
    ...
    ...


    $Require_Tabella->print(); //stampo la mia tabella che avrà "nome_campo" in hidden/non_stampato come ti pare a te 
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Si ho guardato un po di documentazione piu che altro mi da errori dicendo che non sono definiti gli oggetti.

    Se io volessi printare nella mia pagina principale la tabella e fare il require solamente della dimensione, visibilita e nome?

    Ad esempio nella mia pagina Main.php ho

    Codice PHP:
    <table>

    <tr>
       <td style="<? echo $Require->getVisibile("nome-campo");?>" width="<? echo $Require->getDimensione("nome-campo");?>">
    Quindi mi servirebbe che per il campo da me scelto, che sarà l'indice dell'array contenitore, possa modificare il valore dei suoi attributi, come indicato nel codice e salvarlo in maniera tale che quando riapro la nuova pagina si prenda quei valori e non mi riazzeri tutto il lavoro.

    Attualmente questa pagina la so fare funzionante con 2 sistemi tuttavia volevo adottare questo per impratichirmi, so che non sono molto bravo e mi spiace portarvi via tempo ma cerco di apprendere una volta per tutte quello che è il mio piu grande scoglio di php

    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  6. #6
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Un esempio funzionante che ho scritto or ora. Spero ti piaccia e ti sia utile. Una stupida classe Stack che può implementare n stack (basta che gli dai un nome) li salva nella sessione e da lì li recupera se esistono. Chiama il file test.php altrimenti devi cambiare il nome nei tre form.
    Codice PHP:
    <?php
    session_start
    ();

    class 
    Stack {
        private 
    $nome;
        private 
    $cont = array();

        private function 
    __construct($name) {
            
    $this->nome=$name;
        }

        public static function 
    GetStack($name) {
            if (isset(
    $_SESSION[$name])) {
                return 
    unserialize($_SESSION[$name]);
            }else
                return new 
    Stack ($name);
        }

        public function 
    Pop() {
            return 
    unserialize(array_pop($this->cont));
        }

        public function 
    Push($value) {
            
    array_push($this->contserialize($value));
        }

        public function 
    Delete() {
            
    $this->cont = array();
        }

        public function 
    Visualizza() {
            foreach (
    $this->cont as $value)
                echo 
    unserialize($value) . '; ';
        }

        public function 
    __destruct() {
            
    $_SESSION[$this->nome] = serialize($this);
        }

    }
    ?>
    <html>
        <head>
            <title>Stupidata</title>
        </head>
        <body>
            <?php       
            $stack 
    Stack::GetStack('pippo');

            if (isset(
    $_GET['op'])) {
                switch (
    $_GET['op']) {
                    case 
    'push':
                        
    $stack->Push($_POST['valore']);
                        break;
                    case 
    'pop':
                        echo 
    "Ho poppato '" $stack->Pop() . "'
    "
    ;
                        break;
                    case 
    'delete':
                        
    $stack->Delete();
                        break;
                }
            }

            
    $stack->Visualizza();
            
    ?>
            

            <form method="post" action="test.php?op=push">
                Inserisci un valore nello stack <input type="text" name="valore" />
                <input type="submit" value="Push" />
            </form>
            <form method="post" action="test.php?op=pop">
                <input type="submit" value="Pop" />
            </form>
            <form method="post" action="test.php?op=delete">
                <input type="submit" value="Delete" />
            </form>
        </body>
    </html>


    Dimenticavo.... puoi utilizzarla per memorizzare i tuoi oggetti tabella piuttosto che stupide stringhe come nell'esempio
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  7. #7
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Originariamente inviato da Grino
    Un esempio funzionante che ho scritto or ora. Spero ti piaccia e ti sia utile. Una stupida classe Stack che può implementare n stack (basta che gli dai un nome) li salva nella sessione e da lì li recupera se esistono. Chiama il file test.php altrimenti devi cambiare il nome nei tre form.
    ....
    ....
    Dimenticavo.... puoi utilizzarla per memorizzare i tuoi oggetti tabella piuttosto che stupide stringhe come nell'esempio
    Grazie ora mi studio per bene l'esempio, tuttavia penso non lo posso riutilizzare cosi perchè io non faccio definire ad un utente le colonne ma le definisco io di base. Esempio ho 20 colonne l'utente A ne vede 10, l'utente B 5 e cosi via.

    Ora stavo testando questo caso:
    Codice PHP:
    // Ho questa colonna:
    $Require_Tabella->aggiungi("nome",new Colonna("nome","<col style='width:90px'/>",1)); 
    Da questa colonna stampo la visibilita con getVisibile("nome") e mi stampa 1, poi richiamo modVisibile("nome") che mi modifica la visibilita e mi stampa 0.

    Ora devo far si che riaprendo la pagina mi stampi la visibilita a 0 anziche resettarmela come fa sempre perchè riaprendo la pagina inizializza tutto, in pratica presumo fare un controllo (a sto punto con le Sessioni) che non mi riazzeri tutto
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  8. #8
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    Quindi, come faccio nell'esempio dello stack, puoi affidare la metodo destruct il compito di salvare l'oggetto tabella in sessione.

    Come nell'esempio dello stack, quando devi creare un oggetto tabella non lo fai tramite la new, ma per mezzo di un metodo static che se trova l'oggetto in sessione lo ripristina da lì altrimenti ti restituisce un nuovo oggetto. Oppure utilizzi un'altra classe che ha il compito di costruire la classe tabella o recuperarla dallo stack.

    Gli oggetti si corrompono se li assegni direttamente ad una sessione
    Codice PHP:
    $_SESSION['oggetto']=$oggetto;//alla chiamata successiva questo non lo recuperi più 
    è sbagliato. devi utilizzare la funzione serialize per assegnarlo alla sessione e unserialize per ripristinarlo:
    Codice PHP:
    $_SESSION['oggetto']=serialize($oggetto);
    $oggetto=unserialize($_SESSION['oggetto']); 
    Inquesto modo è corretto.

    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

  9. #9
    Utente di HTML.it L'avatar di Aires
    Registrato dal
    Jan 2010
    Messaggi
    725
    Uh ora ho capito un due cosuccie grazie mille allora mi metto a provare !!!!

    Ma la __destruct() la metto nell'oggetto Tabella inviando il parametro $df giusto? Oppure devo farlo pure per l'oggetto Colonna
    Originariamente inviato da qazar
    Se finisci di leggere il thread mi sono corretto,è solo i kernel scritto in html.
    Originariamente inviato da rnlflame
    Comunque non dovevano crollare

  10. #10
    Utente di HTML.it L'avatar di Grino
    Registrato dal
    Oct 2004
    Messaggi
    739
    E' sufficiente in tabella. Anche se ti consiglio di affidare ad un altro oggetto la gestione della sessione cui la tabella delega le funzionalità per rendersi permanente in memoria. In questo modo potrai rendere permanenti anche altri oggetti delegando a questo contenitore di dati piuttosto che riscrivere sempre lo stesso codice.

    Resto in attes adi vedere il tuo esempio funzionante.
    Non so cosa sia $df!
    Ciao
    Siamo sempre troppo gelosi delle nostre grandi piccole opere! - Grino inedito.
    Lavori e Lavoretti

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.