[ banezemun83 @ 25.03.2013. 19:08 ] @
Pozdrav svima.

Potpuni sam pocetnik sto se ZF tice (a i OOP PHP-a, do sad sam radio samo u proceduralnom) i treba mi pomoc oko parsiranja CSV fajla i unosa podataka iz njega u tabelu u bazi. Naime, imam recimo neki .csv fajl u kojem prvi red predstavlja naziv kolona (separator je ","). Moj zadatak je da uploadujem taj .csv, da iscitam prvi red, pokupim nazive kolona, zatim mapiram te kolone sa kolonama u tabeli koja se nalazi u MySQL i da potom unesem podatke iz csv fajla u tu tabelu (naravno u odgovarajuce kolone jelte ;) ). Celu tu pricu sam uspeo da uradim preko sql upita LOAD DATA INFILE, medjutim klijent trazi da se to radi drugacije, i da se recimo prvo iscita jedna kolona iz .csv , pa da se mapira sa kolonom u tabeli. To sve treba da se ponavlja do poslednje kolone u csv i onda da se tako mapirani podaci unesu u tabelu.
Evo dela koda koji sam napisao i koji radi ali koristi LOAD DATA INFILE:

Prvo action koji dohvata csv fajl koji je unet preko input-a:

Code:

 public function unosAction()
    {
              
        $upload_form=new Application_Form_Upload();
        
        //U koliko je unet .csv fajl pronalazi se u tmp folderu, cita se prvi red s nazivom kolona i prosledjuju u view.
        
        $request=$this->getRequest();
        
        if($request->isPost()){            
            
            if($upload_form->isValid($this->_request->getPost())){
                
            $file=$_FILES['file']['tmp_name'];
            $file_name=$_FILES['file']['name'];
            $folder="C:/xampp/htdocs/Zend/CSV/files/";
                  
          
               //Citanje prvog reda iz .csv-a
                if (($handle = fopen($file, "r")) !== FALSE) {
                       
                       if(($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
                           
                           
                           $this->view->data=$data;
                           $this->view->file=$file_name;

                           //upload fajla
                           move_uploaded_file($file,$folder.$file_name);
                                      
                               
                           }
                      }
                }    


Zatim izgled view-a "unos":

Code:

<form name="mapiranje" action="count" method="post" >
    <table border="1">
      
<?php
if($this->data !=""){
    
    //Prikaz forme za mapiranje. S leve strane su nazivi kolona iz .csv fajla, s desne strane dropdown liste s nazivima kolona iz baze.
    
    echo"<tr><th>Kolone iz .CSV fajla</th><th>Kolone u tabeli u DB</th></tr>";
    
    foreach($this->data as $d){
        
        echo"
            
        <tr>
        <td>".$d."</td>
        <td>
            <select name='kolone[]'>
                    <option value='naziv_proizvoda'>Naziv proizvoda</option>
                    <option value='cena_proizvoda'>Cena proizvoda</option>
                    <option value='kolicina'>Kolicina</option>
                    <option value='kupac'>Kupac</option>
                    <option value='pdv'>PDV</option>
                    <option value='ukupna_cena'>Ukupna cena</option>
                    <option value='datum'>Datum</option>
                    <option value='@ignore'>Zanemari</option>
            </select>            
         </td>
         </tr>
        ";
        
    }
    echo"
     </table> 
     <br/>
        <input type='hidden' name='file' value='".$this->file."'>
     
        <input type='submit' name='submit' value='Mapiraj'>   
    ";
   
}
?>
    
</form>


I na kraju izgled action-a count koji prihvata podatke iz ove forme u view-u:

Code:

public function countAction()
    {
        $request=$this->getRequest();
        
        $post=$request->getPost();
        
        if(isset($post['submit'])){
            
               //dohvatanje svih vrednosti iz dropdown lista
               $op=$request->getParam('kolone');

               //dohvatanje naziva fajla iz hidden polja
               $file=$request->getParam('file');

               $folder="C:/xampp/htdocs/Zend/CSV/application/files/";
              
               //upisivanje vrednosti iz $op u promenljivu $kol uz odvajanje zarezom
               $kol=implode(',', $op);
               
                             
               $db = Zend_Db_Table_Abstract::getDefaultAdapter();
               
               //Upit kojim se unose podaci iz csv-a po tacno odredjenom redosledu koji je upisan u $kol              
               $sql="LOAD DATA INFILE '".$folder.$file."' INTO TABLE prodaja FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES (".$kol.")" ;
               
               $db->query($sql);

      }    



Kao sto rekoh, pocetnik sam u ZF, i verujem da mozda ova varijanta sa formom u view-u nije mozda bas najsrecnije resenje, tako da sam otvoren za bilo kakve sugestije. Takodje, ako ovako nesto moze da se uradi jednostavnije takodje cu biti zahvalan na eventualnom savetu. Pretpostavljam da bi ovaj drugi nacin unosa (koji se od mene trazi) trebalo da se ostvari preko nekog dvoidemzionog niza (jer ne znam kako bih drugacije parsirao odredjenu kolonu iz csv-a)... Takodje, znam da postoji Zend_Translate_Adapter_CSV ali nikako da na netu nadjem neki konkretan primer kako se on koristi... Ako neko ima neki koristan link bio bih zahvalan ako bi ga prosledio :)

Unapred hvala i izvinjavam se na kilometarskom postu :)
[ banezemun83 @ 25.03.2013. 19:16 ] @
Inace, evo kako bi trebalo da izgleda forma za mapiranje kolona:



Uploaded with ImageShack.us

Inace, ovo je moja tema, zaboravih da se ulogujem kod prvog posta :\

[Ovu poruku je menjao banezemun83 dana 25.03.2013. u 20:35 GMT+1]