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

    [PHP] Stampare caratteristiche in base al prodotto

    Ciao a tutti,
    ho un sito che gestisce un database di prodotti, suddivisi in 2300 categorie TOTALI (3 livelli di profondità).

    Vorrei poter creare con php un unica funzione o ancora meglio un unica classe che quando necessario mi stampi le caratteristiche del prodotto in base alla categoria a cui appartiene.

    Per spiegarmi meglio faccio un esempio:

    Ho due prodotti:
    - Il primo appartiene alla sottocagoria: Audio&Video->Stereo Hi-Fi
    - Il secondo appartiene alla sottocategoria: Informatica->Componenti Hardware-> Schede Video

    Ora come potete immaginare i due prodotti avranno caratteristiche abbastanza differenti e al momento della consultazione avrò bisogno di una funzione di stampa differente per entrambi.

    E' dunque facile capire come diventi un lavorone fare una funzione di stampa per ogni categoria quando ce ne sono oltre 2000.

    Mi chiedo quindi se ci sia un modo relativamente veloce, magari una classe o una tecnica, per poter fare una sola classe che stampi le caratteristiche del prodotto in base alla sua categoria di appartenza.

  2. #2
    se ogni categoria ha un suo layout specifico, ti devi fare un oggetto per ogni categoria. L'unica è rendere parametrico il layout e "auto adattante" rispetto ai parametri

    cmq, che intendi per stampa? html o stampante? Poi detta così mi suona strana la cosa... cioè tu hai un prodotto tipo "Stereo HIFI" che, oltre alle caratteristiche tipiche di uno stereo, ha anche le caratteristiche, che so, di una Patata e che quindi non vanno stampate?

    Boh vedi te
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    io direi che in linea di principio "basterebbero" 3 select cos' chiamati: cat1, cat2, cat3. I primi tre contengono categorie e relative sottocategorie e "prodotto" i prodotti della sottoclasse scelta. cat2 conterrà le sottocategorie di una option di cat1 ad esempio e cat3 conterrà i prodotti di quella sottocategoria:

    Codice PHP:
    <select id="cat1" size="1"><option value="1">Audio&Video</option><option value="2">Informatica</option></select>
    <
    select id="cat2" size="1"><option value="1">Stereo Hi-Fi</option><option value="2">TV Flat</option></select>
    <
    select id="cat3" size="1"><option value="1">Altoparlanti</option><option value="2">Mixer</option></select
    in tal modo ho scelto la categoria Audio&Video-> Stereo Hi-Fi->Altoparlanti e come prodotto Bose XM1 .
    a questo punto passo i valori dei 4 select ad una function (meglio se di classe) che restituisce tramite query SQL un array con i prodotti voluti, ad esempio

    [PHP]
    $sql = "SELECT * FROM prodotti WHERE cat1=" . $cat1 . " AND cat2=" . $cat2 . " AND cat3=" . $cat3 . " ORDER BY NomeProdotto";
    public function array($sql) {
    //usa le funzioni di mysqli e restituisci un array dei record voluti da formattare in tabella ad esmepio
    }

  4. #4
    Originariamente inviato da Emulman
    io direi che in linea di principio "basterebbero" 3 select cos' chiamati: cat1, cat2, cat3. I primi tre contengono categorie e relative sottocategorie e "prodotto" i prodotti della sottoclasse scelta. cat2 conterrà le sottocategorie di una option di cat1 ad esempio e cat3 conterrà i prodotti di quella sottocategoria:

    Codice PHP:
    <select id="cat1" size="1"><option value="1">Audio&Video</option><option value="2">Informatica</option></select>
    <
    select id="cat2" size="1"><option value="1">Stereo Hi-Fi</option><option value="2">TV Flat</option></select>
    <
    select id="cat3" size="1"><option value="1">Altoparlanti</option><option value="2">Mixer</option></select
    in tal modo ho scelto la categoria Audio&Video-> Stereo Hi-Fi->Altoparlanti e come prodotto Bose XM1 .
    a questo punto passo i valori dei 4 select ad una function (meglio se di classe) che restituisce tramite query SQL un array con i prodotti voluti, ad esempio

    [PHP]
    $sql = "SELECT * FROM prodotti WHERE cat1=" . $cat1 . " AND cat2=" . $cat2 . " AND cat3=" . $cat3 . " ORDER BY NomeProdotto";
    public function array($sql) {
    //usa le funzioni di mysqli e restituisci un array dei record voluti da formattare in tabella ad esmepio
    }
    credo che il problema suo sia che tra una categoria e l'altra ci sia un differente layout di "stampa" del prodotto, e si chiedeva come rendere "automatico" questo fatto senza dover fare 2k layout differenti. Poi boh ci dirà meglio lui
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  5. #5
    Grazie delle risposte.

    Mi sono spiegato male, quello che mi serve è come dice Santino83.
    Il problema deriva dalla struttura del database

    http://i.imgur.com/H0UPN.png

    La tabella category è gestita da una classe che tramite la colonna "position" può creare categorie a livelli di profondità infiniti, il nome e la descrizione di ogni categoria sono inseriti invece nella tabella "category_x" dove x è il tag della lingua correntemente selezionata dal navigatore.

    Ora dovete immaginare che nella tabella products oltre alle colonne che ci sono adesso, ci saranno le caratteristiche per ogni prodotto di ogni categoria. Quindi ad un certo punto avrò per esempio il prodotto "modellino carro armato" con una colonna caratteristica del tipo "taglia" , che sarà vuota, ma in ogni caso al momento della stampa a video non dovrei farla vedere.

    Una cosa che mi viene in mente è di fare un file con una query diversa per ogni categoria e poi stampare quella che serve, è meno lungo e più pratico che creare un layout per ogni categoria, ma è lo stesso un gran lavoro..

  6. #6
    non mi è ben chiaro la cosa... ora tu devi aggiungere alla tabella prodotti N campi, di cui ogni categoria deve utilizzare solo M = N-1 campi. Mettiti nella tabella categorie o una relazione 1..* tra categoria e M, oppure una 1..1 (tipo aggiungendo un altro campo a categoria) dove salvare gli M campi separati da ","

    però, sinceramente, mi sembra strano il ragionamento che hai fatto... nel senso che glio stessi M campi immagino andranno bene per una serie molto ampia di categorie, mentre esisteranno poche tipologie di prodotti. Quindi tipizza i prodotti per macro tipi aventi tutti le stesse M proprietà, e in base a quello stampi...sicuramente saranno molte di meno che pensando alle categorie e soprattutto sono "immutabili", cosa non vera per le categorie

    mi spiego:

    se il tuo sito gestisce bottiglie di vino e slip, a parte le proprietà comuni tra le due (prezzo,etc...) a seconda della tipologia ci saranno delle proprietà piuttosto che altre. Quindi tipizzi prodotto e in base a quel tipo ne stampi la scheda. Poi puoi catalogare i tuoi prodotti di vino per 6milioni di categorie diverse, idem per gli slip, ma quando stampi il prodotto ci sarà sempre e cmq un solo modo di stamparlo
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Non riesco a venire a capo di questo problema, non so come gestire le categorie.

    Anche dividendole in macrotipi sarebbero comunque un sacco.

    Se può essere utile, ecco le categorie:

    CategorieIT file excel

    Ovviamente alcune sottocategorie di livello 4 (tipo alcune marche) non servono e le cancellerò.

    Sto anche pensando che aggiungere N campi alla tabella prodotti quante sarebbero le caratteristiche di tutti i tipi di prodotti forse non è la soluzione migliore, come alternativa mi viene in mente di creare una tabella "caratteristiche" con un id univoco per ogni caratteristica e poi in una tabella "prodTofeature" collego i prodotti alle proprie caratteristiche.

    Es tabella prodTofeature

    ID_PRODFEATURE - IDPROD - FKFEATURE1 - FEATURE2VALUE- ... - FKFEATURE N - FEATURENVALUE

    Le due tabelle le creerei dinamicamente al momento dell'inserimento dei prodotti con i dovuti controlli in caso di esistenza.

    Comunque, una domanda semplice: come fanno gli e-shop a gestire questo problema?

  8. #8
    Originariamente inviato da Alberto.b
    Non riesco a venire a capo di questo problema, non so come gestire le categorie.

    Anche dividendole in macrotipi sarebbero comunque un sacco.

    Se può essere utile, ecco le categorie:

    CategorieIT file excel

    Ovviamente alcune sottocategorie di livello 4 (tipo alcune marche) non servono e le cancellerò.

    Sto anche pensando che aggiungere N campi alla tabella prodotti quante sarebbero le caratteristiche di tutti i tipi di prodotti forse non è la soluzione migliore, come alternativa mi viene in mente di creare una tabella "caratteristiche" con un id univoco per ogni caratteristica e poi in una tabella "prodTofeature" collego i prodotti alle proprie caratteristiche.

    Es tabella prodTofeature

    ID_PRODFEATURE - IDPROD - FKFEATURE1 - FEATURE2VALUE- ... - FKFEATURE N - FEATURENVALUE

    Le due tabelle le creerei dinamicamente al momento dell'inserimento dei prodotti con i dovuti controlli in caso di esistenza.

    Comunque, una domanda semplice: come fanno gli e-shop a gestire questo problema?
    dipende, tendenzialmente usano un solo tipo di prodotto con proprietà "standard" e magari giusto due tre customizzazioni per aggiungere qualcosa di specifico. Oppure tu hai un'area amministrativa dove crei l'oggetto prodotto associando ad un prodotto base delle proprietà e salvandotelo come modello ( che ne so, dici che il prodotto "abbigliamento" ha la proprietà "taglia" di tipo "String")

    quindi alla fine avresti una tabella prodotto, una tabella prodotto_features composta da id, feature_name, feature_value, feature_type, id_prodotto e in base a quello stampi. es:

    codice:
    'oggetto Macchina
    prodotto:
    id: 1
    prezzo: 100000
    type: Automobilismo
    
    prodotto_features:
    id_prodotto: 1
    feature_name: Cilindrata
    feature_value: 3000
    feature_type: Numeric
    id: 1
    
    id_prodotto: 1
    feature_name: Colore
    feature_value: Rosso,Blue,Giallo
    feature_type: String[]
    id: 2
    ---
    
    
    'oggetto Vestito
    prodotto:
    id: 2
    prezzo: 50
    type: Abbigliamento
    
    prodotto_features
    id_prodotto: 2
    feature_name: Taglia
    feature_value: S,M
    feature_type: String[]
    id: 3
    ....
    ....
    Quindi in fase di settaggio dell'applicazione ti crei N modelli di prodotto con quelle che saranno le features_name ( non parlo quindi di prodotto e prodotto_features, ma tabella per i modelli, che so prodotto_models e prodottto_models_features), poi quando inserisci un nuovo prodotto, selezioni il tipo di prodotto (abbigliamento, alimentari, etc...) e la form di inserimento si modificherà per farti inserire le prodotto_features necessarie. In fase di visualizzazione, o usi una view uguale per ogni prodotto, considerando che le features per ogni prodotto sono in una tabella a parte facilmente reperibili, oppure se vuoi dare più libertà di personalizzazione, crei una view diversa per ogni tipologia di prodotto che hai inserito. Tutto questo puoi farlo hardcoded oppure creare un pannello di controllo per la gestione dei modelli e dei template di view, ma si va off topic poi.

    Vedi un pò te...

    altrimenti ti prendi un eshop già pronto come Magento e Prestashop e vedi come fanno loro e copi...anche se non è detto che loro facciano le cose fatte bene o che come le fanno loro sia come le vuoi te.

    Se poi il lavoro è tanto.... beh, mica te l'ha ordinato il medico di fare Ebay 2 la vendetta
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  9. #9
    Di eBay ho preso solo alcune categorie, il progetto è tutt'altro

    Comunque in definitiva io fare così:

    Struttura Database:

    Struttura database (ho omesso le tabelle non interessate)

    Gestito da questa classe:

    Codice PHP:
    <?php

        
    class features extends DB{
            
                public 
    $features = array();
                
                public function 
    newFeature($name,$id_lang){
                    
    $mysqli $this->openDB();
                    
    $query "INSERT INTO ".$this->features_t." ('id_feature') VALUES (NULL)";
                    
    $result $mysqli->query($query);
                    if(
    $result){
                        
    $id $mysqli->insert_id;
                        
    $query "INSERT INTO ".$this->features_lang_t." ('id_feature_lang','fk_feature','fk_lang','name')
                                    VALUES (NULL,"
    .$id.",".$id_lang.",'".$name."')";
                        
    $result $mysqli->query($query);
                        if(
    $result) return $id;
                        else return 
    false;
                    }return 
    false;
                    
    $this->closeDB($mysqli);
                }
                
                public function 
    updateFeatureName($id_feat,$name,$id_lang){
                    
    $mysqli $this->openDB();
                    
    $query "SELECT * FROM ".$this->features_t.",".$this->features_lang_t." WHERE ".$this->features_t."id_feature = ".$this->features_lang_t.".fk_feature";
                    
    $result $mysqli->query($query);
                    if(
    $result){
                        
    $found false;
                        while(
    $data=$result->fetch_array()){
                            if(
    $data['fk_lang'] == $id_lang){
                                
    $found true;
                                
    $id $data['id_feature_lang'];
                            }
                        }
                        if(
    $found){
                            
    $query "UPDATE ".$this->feature_lang_t." SET name = '".$name."' WHERE id_feature_lang = ".$id;
                            
    $result $mysqli->query($query);
                            if(
    $result) return true;
                            else return 
    false;
                        }
                    }else return 
    false;
                    
    $this->closeDB($mysqli);
                }
                
                public function 
    getProductFeatures($id_prod,$id_lang){
                    
    $mysqli $this->openDB();
                    
    $query "SELECT ".$this->product_features_t.".fk_product AS id_prod,".$this->product_features_t.".fk_feature AS id_feature,
                                        "
    .$this->product_features_t.".feature_value AS feat_value,".$this->features_lang.".name AS feat_name,".$this->features_lang.".fk_lang AS feat_lang
                                FROM "
    .$this->product_features_t.",".$this->features_lang.
                                WHERE id_prod = "
    .$id_prod." AND id_feature = ".$this->features_lang.".fk_feature AND feat_lang = ".$id_lang."";
                                
                    
    $result $mysqli->query($query);
                    if(
    $result)return $result;
                    else return 
    false;
                    
    $this->closeDB($mysqli);
                }
                
                public function 
    insertFeature($value,$id_prod,$id_lang,$id_feat=NULL,$name=NULL){
                    
    $mysqli $this->openDB();
                    if(isset(
    $id_feat)){
                        
    $result $this->getProductFeatures($id_prod,$id_lang);
                        
    $found false;
                        while(
    $data $result->fetch_array()){
                            if(
    $data['id_feature'] == $id_feat){
                                
    $found true;
                            }
                        }
                        if(!
    $found){
                            
    $query "INSERT INTO ".$this->product_feat_t." ('id_product_feature','fk_product','fk_feature','feature_value') 
                                        VALUES (NULL,"
    .$id_prod.",".$id_feat.",'".$value."');";
                        }else return 
    false;
                    }else if(
    $isset($name)){
                        
    $id_insert $this->newFeature($name,$id_lang);
                        
    $query "INSERT INTO ".$this->product_feat_t." ('id_product_feature','fk_product','fk_feature','feature_value') 
                                        VALUES (NULL,"
    .$id_prod.",".$id_insert.",'".$value."');";
                    }else return 
    false;
                    
                    
    $result $mysqli->query($query);
                    if(
    $result) return true;
                    return 
    false;
                    
    $this->closeDB($mysqli);    
                }    
        }
    ?>
    La classe non è del tutto completa ma è il succo di sè, l'ho creata in 1 ora e mezza quindi ci saranno sicuramente degli errori e controlli omessi ed è il massimo che sono riuscito a fare.

    Con questo metodo se ipotizzo di arrivare ad inserire 100 prodotti per ogni categoria, arrotondando a 2000 categorie, stimando 20 caratteristiche in media per ogni prodotto inserito, avrei la tabella "product_features" con 4.000.000 di record...non ho esperienza con numeri così grandi, ma spero non sia un problema, dato anche il fatto che i dati contenuti sono per lo più indici.

  10. #10
    non capisco perchè colleghi i brand alle categorie e non soltanto i prodotti, vabbeh.

    se pensi di fare query su "feature_value" allora devi indicizzare anche la colonna, altrimenti il resto mi sembrano tutti indici

    cmq il problema esposto nel primo post non mi sembra affrontato dalla tua soluzione, o forse avevo capito male io il problema? cmq buon per te
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

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.