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

    Class elements logica difficile?

    Salve a tutti,

    Ripropongo qui un quesito che avevo posto tempo fa in altra sezione dell forum senza riuscire a cavarne nulla per la mia insaziabile curiosità.

    Vorrei capire la logica e il modo di operare di molti cms robusti tipo: ezpublish, typo3.
    Sopratutto in merito alle questione delle Class elements.
    Cosa sono queste?

    Mettiamo caso che devo mettere su un sito con una sezione news che deve contenere i seguenti campi:

    Data
    Titolo
    Testo
    Immagine

    Con i famosi cms di cui parlo, prendiamo in esempio ezpublish, per fare questo creo lo scheletro della sezione "News" e popolo questa con le famose class elements.

    Aggiungo le class elements:
    Data = Date (class elements)
    Titolo = textbox (class elements)
    Testo = textarea (class elements)
    Immagine = file (class elements)

    Insomma creo lo scheletro della mia sezione ed in automatico ezpublish mi crea la pagina News con relative sezione ADD/EDIT/DELETE.
    Senza mettere mano al db ed al codice ezpublish fa tutto in automatico!
    Perchè tutto questo mi incuriosice tanto? credo di non doverlo nemmeno spiegare a chi lavora ogni giorno sul web!

    Pensate alla tipica situazione:
    Avete messo su il sito bello e funzionante, ma improvvisamente il simpatico cliente se ne esce che la sezione "News" oltre a contenere i campi di cui sopra necessita di un ulteriore campo "Luogo".
    Ecco con ezpublish diventa una stupidata incredibile, entri nella sezione "scheletro" della tabelle News ed aggiungi con un solo click un ulteriore classe elements:

    Luogo = textbox (class elements)

    Et voilà tutto pronto!

    Ma allora cosa cavolo voglio?
    Vorrei implementare nel mio Backend personale (quello che uso per i miei lavori) la stessa logica (dinamicità totale).
    Insomma secondo voi come diavolo fanno a fare una cosa del genere? qual'è la logica di questa cosa?
    ezpublish permette di costruire il sito da 0 totalmente online lato backend!
    Secondo voi è difficile costruirsi una funzionalità del genere? avete qualche esempio, qualche riferimento?
    Se si tratta di creare nuove tabelle nel database via backend posso pure arrivarci, ma non capisco come creare in automatico le pagine di editing (ADD/EDIT/DELETE) senza intervenire assolutamente sul codice!

    Scusatemi se questo post vi ha annoito, spero almeno di essere stato chiaro.
    Grazie.

  2. #2
    Non è una cosa impossibile: alla base ci sono le form dinamiche e un template engine. Comunque se la cosa ti incuriosisce perché non cominci a hackerare i sorgenti di typo3? Che io sappia è opensource.

    L'approccio che hai descritto comunque non mi piace molto. Personalmente preferisco usare i commenti dei campi (che tanto sono lì a far niente) per definire il "widget" da usare nella generazione della form. Potresti anche dare un occhiata a HTML_QuickForm per generare la form in dinamico:

    http://pear.php.net/package/HTML_QuickForm

  3. #3
    Inanzitutto grazie per la risposta.

    Mi hai incuriosito, potresti gentilmente spiegarmi meglio e più dettagliatamente il tuo metodo?

  4. #4
    Bè, ti do un principio su cui lavorare (il tutto non è complesso ma è piuttosto lunghetto). Invece di replicare la struttura con i class elements potresti leggerla direttamente dalle tabelle:

    Codice PHP:
    $result mysql_query('SHOW FULL COLUMNS FROM `$table`); 
    Dopodichè analizzi il risultato, generando il modulo dinamicamente:

    Codice PHP:
    while ($row mysql_fetch_assoc($result)) {
        
    $name $row['Field'];
        
    $type $row['Type'];
        
    $comment $row['Comment'];
        
    $automatic strpos($row['Extra'], 'auto_increment') !== false;

        if (
    $automatic) {
            continue;
        }

        
    // Genera il widget del modulo
        
    ....

    Già da $type potresti decidere il tipo di campo da generare. Per cose un pò particolari (un campo email, per esempio) potresti usare $comment per specificare in dettaglio che il campo di testo deve contenere un email (permettendo quindi validazioni più restrittive).

    Questo (molto all'acqua di rose) la procedura che uso.

  5. #5
    Ho capito, grazie.

    Sono riuscito a generare qualcosina con questo metodo.
    Naturalmente per qualsiasi operazione sulla tabella (tipo add/edit/delete) devo estrarre necessariamente la primary key quindi presumo di tirarla fuori a parte utilizzando "SHOW KEYS FROM mia_table" giusto?

    Forse ti chiedo troppo ma cmq ci provo, non potresti inviarmi anche in pvt una parte del codice da te utilizzato per generare una pagina di edit sul recordset utilizzando questo metodo?
    Almeno cosi riesco a capire più in fretta.

    Grazie.
    Non sono esperto, sono solo curioso.

  6. #6
    Originariamente inviato da jartiello
    Ho capito, grazie.

    Sono riuscito a generare qualcosina con questo metodo.
    Naturalmente per qualsiasi operazione sulla tabella (tipo add/edit/delete) devo estrarre necessariamente la primary key quindi presumo di tirarla fuori a parte utilizzando "SHOW KEYS FROM mia_table" giusto?
    No. Per l'operazione "add" SHOW FULL COLUMNS è più che sufficiente. Per "edit" e "delete" invece devi fare un normale SELECT * FROM mia_table WHERE id=... per leggere la riga che vuoi modificare/cancellare. In questo modo puoi riproporre i vecchi dati per la modifica o visualizzarli prima della cancellazione.

    Chiamando "widget" gli elementi html della form da generare, SHOW FULL COLUMNS... ti ritorna i seguenti dati utili:

    Field
    Da usare per identificare il widget (<input name="$Field" ... >)

    Type
    Fornisce una prima classificazione del tipo di widget e della lunghezza massima. Per esempio potresti utilizzare una textarea per i campi tipo "text". La lunghezza massima inoltre è comoda per impostare l'attributo maxlength. Per i campi flag ed enum specifica anche le alternative: analizzando il Type di un enum, per esempio, posso acquisire le alternative e decidere se presentare con una serie di <input type="radio"> se sono pochi o una <select> se sono tanti.

    Extra
    Comodo soprattutto per sapere se un campo è tipo "auto_increment" (ergo sicuramente chiave primaria).

    Comment
    Usando le informazioni sopraccitate puoi già generare una form base. Alcune informazioni però sono da impostare a mano, un esempio sopra tutti l'obbligo di compilazione di un campo. Per esempio, puoi decidere che i campi che contengono la stringa "required" in Comment siano obbligatori. Altro esempio: ho trovato il campo Comment estremamente utile per impostare dei limiti ai campi immagine o le opzioni di testi WIKI.

    Ora alcuni esempi pratici che utilizzano questo approccio. Questa pagina di registrazione

    http://www.entidi.it/neskens/user/add/

    è interamente generata in dinamico da questa tabella:

    codice:
    CREATE TABLE `utente` (
      `id` int(10) unsigned auto_increment,
      `user` char(20) COMMENT 'category=required|rules=unique(user)',
      `password` char(20) COMMENT 'widget=password|category=required|rules=minlength(4)',
      `publicname` char(20) COMMENT 'category=required|rules=unique(publicname)',
      `sex` enum('male','female') COMMENT 'category=suggested',
      `email` varchar(40) COMMENT 'category=suggested|rules=email',
      `url` varchar(100),
      `uri` varchar(100),
      PRIMARY KEY  (`id`)
    );
    mentre questa dalla tabella sottostante:

    http://www.entidi.it/test.php?action...e=test_content

    codice:
    CREATE TABLE `articolo` (
      `id` int(10) unsigned auto_increment,
      `group` int(11) COMMENT 'widget=hierarchy|category=required',
      `date` date COMMENT 'category=required',
      `subject` varchar(50) COMMENT 'category=required',
      `image` varchar(32) COMMENT 'widget=picture|rules=maxfilesize(80000),minpicturesize(10 10),maxpicturesize(200 200)',
      `remark` varchar(100),
      `content` text COMMENT 'category=required|wiki_rules=Heading,Toc,Horiz,Blockquote,List,Deflist,Table,Url,Strong,Emphasis',
      `contact` set('mail','email','mobile','phone'),
      `notify` enum('yes','no','later'),
      `_creation` datetime,
      `_comments` int(11),
      PRIMARY KEY  (`id`)
    );
    Originariamente inviato da jartiello
    Forse ti chiedo troppo ma cmq ci provo, non potresti inviarmi anche in pvt una parte del codice da te utilizzato per generare una pagina di edit sul recordset utilizzando questo metodo?
    Almeno cosi riesco a capire più in fretta.
    Non c'è problema: ho comunque intenzione di rilasciarlo come software libero una volta che le API sono stabili. L'inghippo è che fa parte di un framework più ampio: ti posso spedire la parte riguardante le form ma dopo dovrai adattarlo (parecchio). Lasciami il tuo indirizzo email in privato che te lo spedisco.

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.