We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 33203
    • 13 Posts
    Ciao ragazzi, spero che qualcuno di voi possa darmi una mano, sono già due giorni che sto impazzendo dietro a questo arcano ed ho anche postato nel general support in inglese senza risposta.
    In poche parole ho problemi a "importare" il contenuto di un semplice file csv che ho in /assets/files/prodotti/
    nome del file prodotti.csv in una widget datagrid.
    Praticamente riesco a fare tutto tranne che a visualizzare sotto forma di tabella i dati contenuti nel mio csv.
    Ecco il contenuto del file prodotti.csv:

    PRODOTTI,DESCRIZIONE,PREZZO
    prodotto1,desc1,prezzo1
    prodotto2,desc2,prezzo2

    attualmente se imposto come column names e field names:

    PRODOTTI,DESCRIZIONE,PREZZO

    e nel default value della widget ci metto (come da manuale...) @FILE assets/files/prodotti/prodotti.csv

    ottengo una cosa del tipo:

    PRODOTTI | DESCRIZIONE | PREZZO
    P
    R
    O
    D
    O
    T
    T
    I
    ,
    D
    E
    S
    C
    R
    I
    Z
    I
    O
    N
    E
    ,
    P
    R
    E
    Z
    Z
    O

    Ovviamente appena ho visto il risultato ho pensato che qualcosa non andasse perche attualmente sembra che mi spari fuori la prima "riga" del cvs come una "colonna" huh

    Dopo avere letto questo thread http://modxcms.com/forums/index.php/topic,1666.0.html mi sono allora detto che forse avrei dovuto usare la sintassi @EVAL e caricare del codice php per "parsare" il cvs come da esempio:

    riporto qui anche i comment di rthrash che dice testuali parole:

    And finally got it to work thanks to Greg who used the über-hand PHP command fgetcsv:

    @EVAL 
    $handle = fopen("/server/path/to/file/htdocs/assets/files/board.csv", "r");
    $row = 0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
       if($row) {
       	$results[] = $data;
       }
       $row++;
    }
    fclose($handle);
    return $results;


    e alla fien dice pure:


    Works like a charm!

    Beh, per me it doesn’t e attualmente dopo avere speso due giorni con un gran mal di testa ho deciso di vedere se qualcuno di voi piu esperto mi sa dire dove o cosa sbaglio.

    Grazie anticipatamente del vostro contributo, e del semplice fatto di avere dedicato il vostro prezioso tempo a leggere il mio post.




      • 15896
      • 80 Posts
      sembrerebbe tutto corretto.
      La tua versione di codice che passi ad @EVAL la puoi riportare?!

      Forse le tue linee sono superiori a 1000 caratteri di lunghezza?

      Fai un piccolo debug portando a video il risultato di var_dump($results) per vedere l’effettivo risultato del parsing di fgetcsv(), prima di passarlo a @EVAL cosi sei sicuro che la lettura del file è andata a buon fine.

      Ciao
        • 17673
        • 194 Posts
        ...oppure controlla che la codifica dei \t \r \n non fluttui tra il file csv, il server web, i settaggi di php, e quelli di MODx
          ----------------------------------------------------------
          http://www.linkedin.com/in/lucapost/
          http://www.twitter.com/lukwe/
          ----------------------------------------------------------
          • 33203
          • 13 Posts
          mmmmmmmm oddio ragazzi, siete dei draghi, mi date risposte secche e precise, inutili per un lamer niubbio come me sig :’(

          Mi dite di debuggare e da quel poco che capisco il problema qui sembrerebbe imputabile ai settaggi di php sul server e l’arcano starebbe:

          1) o nel fatto che le linee sono superiori a 1000 caratteri (cosa che non penso, anche se non ne ho la certezza matematica...) secondo Kimu, oppure

          2) che la codifica dei \t\r\n "fluttua" secondo lukwe.

          Quindi a quanto pare la sintassi usata da me per parsare è corretta e tutti i problemi starebbero a "monte"...sempre che abbia capito bene.

          Dunque qui io sono proprio un caso disperato e sinceramente mi piacerebbe potervi aiutare e dirvi se ad esempio la codifica \t\r\n fluttua o no, ma non sono in grado di capire da solo come fare per dire se ciò succede o meno.

          Tanto più mi sfugge come debuggare la mia var dump($results) per capire il risultato del parsing (questo con modx sempre).

          Oggi, dopo interminabili ore di sclero, mi sono deciso a creare semplicemente nuove tabelle nel db che per questioni di sicurezza sono anche meglio, dato che cosi tutti i dati non sono piu li da soli soletti nella loro cartellina /assets/files/Prodotti/ e se da default value nella mia datagrid view ci sbatto dentro una semplice query del tipo

          @SELECT MODELLO,DESCRIZIONE,EURO,TOTALE FROM Prodotti site_content

          tutto funzia alla perfezione.

          Ora, davvero mi rincresce per il mio infimo livello di preparazione, pensavo che l’utilizzo della TV e della widget fossero piu intuitivi, e forse davvero lo sono, ma a questo punto, pur avendo in parte risolto mi piacerebbe, magari anche grazie al vostro aiuto e supporto capire, dato che nella vita non si finisce mai di imparare e nel mio caso, da imparare ce n’è davvero tanto:) eh eh eh... come risolvere il problema di cui sopra.

          Per l’aiuto posso dirvi che il server è su register.it e non so se qualcuno di voi sappia a priori dirmi se i settaggi di default di php fanno in modo che la mia codifica dei dei \t \r \n fluttui tra il file csv, il server web, i settaggi di php, e quelli di MODx.

          Ringrazio anticipatamente tutti quelli che vorranno contribuire ulteriormente a questo post, o semplicemente mandarmi al diavolo smiley



            • 33203
            • 13 Posts
            In aggiunta, dato che ho la testa dura, e pensando che magari qualcuno possa fare tesoro dei miei errori, riporto di seguito il codice per @EVAL che uso per parsare il mio .csv.

            A ogni "chiamata" il risultato è sempre quello di una tabella con i valori delle colonne impostati su MODELLO,DESCRIZIONE,PREZZO e per valore dei "fields" il default "No records found".

            Essendo il mio file Prodotti.csv che cerco di parsare nella dir /assets/files/Prodotti

            ed essendo cosi strutturato

            PRODOTTI,DESCRIZIONE,PREZZO
            prodotto1,desc1,prezzo1
            prodotto2,desc2,prezzo2

            @EVAL 
            $handle = fopen("/assets/files/Prodotti/Prodotti.csv", "r");
            $row = 0;
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
               if($row) {
               	$results[] = $data;
               }
               $row++;
            }
            fclose($handle);
            return $results;


            $row = 1;
            $handle = fopen("/assets/files/Prodotti/Prodotti.csv", "r");
            while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
               $num = count($data);
               echo "<p> $num fields in line $row: <br /></p>\n";
               $row++;
               for ($c=0; $c < $num; $c++) {
                   echo $data[$c] . "<br />\n";
               }
            }
            fclose($handle);
            


            @EVAL
            
            $CSVf = "/assets/files/Prodotti/Prodotti.csv";
            
            if (file_exists($modx->config['base_path'].$CSVf)) { 
               $csvlines = file($modx->config['base_path'].$CSVf); 
            } else 
               return "Please wait while we update the load board file $modx->config['base_path'].$CSVf"; 
             
            $lineNo= 1; 
            foreach ($csvlines as $line) { 
               if ($lineNo==1) $csvKeys= explode(',', $line); 
               else $csv = explode(',', $line); 
               $lineNo++; 
            } 
            
            $csvResult = array(); 
            foreach($csvKeys as $indexnum => $key)
               $csvResult[$key] = $csv[$indexnum];
            
            return $csvResult;



            per ogni @EVAL ottengo sempre una tabella con i valori delle colonne impostati su MODELLO,DESCRIZIONE,PREZZO e per valore dei "fields" il default "No records found"
              • 15896
              • 80 Posts
              Non ho tempo di stare ad analizzare tutto il tuo codice, visto che inoltre hai trovato già una soluzione.

              Ma giusto per aumentare il tuo bagaglio culturale var_dump() è una funzione di php che restituisce le informazioni riguardo ad una variabile.
              Funziona anche con gli array e con gli oggetti.

              Si usa molto in fase di debugging semplicemente facendo var_dump($variabile) o return var_dump($variabile) in base al contesto dove si sta operando. Questo permette di vedere il contenuto di una variabile per capire in cosa eventualemente si crea un errore.

              $row = 1;
              $handle = fopen("/assets/files/Prodotti/Prodotti.csv", "r");
              while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                 $num = count($data);
                 echo "<p> $num fields in line $row: <br /></p>\n";
                 $row++;
                 for ($c=0; $c < $num; $c++) {
                     echo $data[$c] . "<br />\n";
                 }
              }
              fclose($handle);


              Questo era sostituibile da

              @EVAL 
              $handle = fopen("/assets/files/Prodotti/Prodotti.csv", "r");
              $row = 0;
              while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                 if($row) {
                 	$results[] = $data;
                 }
                 $row++;
              }
              fclose($handle);
              return var_dump($results);


              Ti venive stampata l’intera array e potevi controllarne il contenuto.

              Per quanto riguarda la lunghezza delle stringhe 1000 (o quello che sono) deve essere inferiore della più lunga delle righe contenute nel file. Ne basta una superiore a 1000 per mandare tutto a monte.

              Fanne tesoro per una prossima volta

              Ciao
                • 33203
                • 13 Posts
                Kimu grazie per la pronta risposta; dunque dopo avere provato a fare:

                @EVAL 
                $handle = fopen("/assets/files/Prodotti/Products.csv", "r");
                $row = 0;
                while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                   if($row) {
                   	$results[] = $data;
                   }
                   $row++;
                }
                fclose($handle);
                return var_dump($results);


                Il risultato è sempre lo stesso ovvero una tabella del tipo come nel file in allegato.

                Insomma, non mi vuole popolare i records, anche facendo il debug come da tuo consiglio mi dice sempre "No records found".

                La cosa mi sta facendo venire un notevole mal di stomaco, e per di più la soluzione che avevo adottato, ovvero quella di generare nuove tabelle per i prodotti nel db è sì una soluzione, ma non la migliore, dato che se riuscissi a fare popolare questa benedetta datagrid coi mie record potrei fare in modo di "dump":) scusa la citazione tratta dall’inglese, ma mai fù più appropriata smileyeh eh eh tutti i miei file .csv nella cartella /assets/files/Prodotti/ e semplicemente fare il bind delle mie variabili ai corrispettivi file .csv.

                Tanto più che questa procedura a livello di aggiornamento sarebbe facilmente eseguibile da chiunque, trattandosi di un puro upload sul server.

                Grazie comunque per tutto il tuo supporto, ho riprovato a controllare e ricontrollare la codifica dei caratteri e la lunghezza delle stringhe, ma il risultato è sempre lo stesso, sembra proprio che per me sia impossibile "dump":) ....e ci risiamo:) un lamerissimo .csv con modx
                  • 33203
                  • 13 Posts
                  Ok,grazie ai consigli del prezioso Kimu, stamattina ho creato una nuova snippet [[dumpdb]] con questo codice:

                  <?php
                  $handle = fopen("/assets/files/Prodotti/Products.csv", "r");
                  $row = 0;
                  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                     if($row) {
                     	$results[] = $data;
                     }
                     $row++;
                  }
                  fclose($handle);
                  return var_dump($results);
                  ?>



                  essendo Products.csv cosi strutturato e situato in /assets/files/Prodotti/

                  Products.csv

                  PRODOTTI,DESCRIZIONE,PREZZO
                  prodotto1,desc1,prezzo1
                  prodotto2,desc2,prezzo2

                  sulla mia pagina "Prodotti", dove vorrei avere la datagrid, che attualmente pero visualizzo sempre come "No records found" ho anche deciso di "chiamare" la mia snippet, per debuggare in conseguenza di quello detto da Kimu.

                  Sotto è riportato il risultato del debug per la variabile $results:

                  array(2) { [0]=> array(3) { [0]=> string(9) "prodotto1" [1]=> string(5) "desc1" [2]=> string(7) "prezzo1" } [1]=> array(3) { [0]=> string(9) "prodotto2" [1]=> string(5) "desc2" [2]=> string(7) "prezzo2" } }

                  Non so se questo possa essere utile a capuire perche costantemente non riesco a popolare la mia datagrid????
                    • 15896
                    • 80 Posts
                    Sono contento che ci sei arrivato da solo, perchè effettivamente per usare efficacemente var_dump() dovevi togliere @EVAL mentre nel codice che ho portato ad esempio l’avevo lasciato (anche perchè pensavo che non facesse il parsing ma fermasse le’esecuzione una volta incontrato il var_dump, o almeno stampasse a video la struttura della variabile.
                    Cosa che invece hai ottenuto appunto incorporando il codice in uno snippet.
                    Da quello che mi sembra di vedere l’array è popolato correttamente. Quindi il problema sta nell’utilizzo di @EVAL.
                    Sinceramente, non ho mai usato ne @EVAL ne la datagrid, quindi non posso esserti molto d’aiuto nello specifico.

                    La seconda mossa dire che potrebbe essere di vedere cosa @EVAL $results (dove ovviamente invece di $results c’è tutto il codice che porta a return $results) da a video, senza passarlo al datagrid.

                    Vedi cosa restituisce, cioè cosa succede a $results una volta passato da @EVAL, ma in plain text.

                    Ciao