[Помогите] Импорт из Excel в mysql

Тема в разделе "OpenCart", создана пользователем Zalom, 18 мар 2017.

  1. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Здравствуйте. Только начал работать с opencart. Появилась необходимость сделать простой импорт из таблицы Excell. Видел кучу модулей экспорта и импорта, но они очень громосткие и не делают что нужно. Задача стоит такая: во-первых, прочитать из файла 2 столбца - с ean и с количеством товара, во-вторых, нужно сравнить ean из БД и файла. Если ean из файла=ean из БД, то количество в БД заменяем количеством из файла, если ean из файла нет БД, то надо вывести сообщение "Введите новый товар", если ean из БД нет в файле, то количество товара обнуляем. Попытался сделать, таким образом.

    модель.
    PHP:
    public function importExcelData($arr,$man) {
            
    $ean_iz_db=array();
            
    $query $this->db->query("SELECT ean FROM " DB_PREFIX "product WHERE manufacturer_id=".$man."");
            foreach (
    $query->rows as $result) {
                   
    $ean_iz_db[]= $result['ean'];}
            if(
    in_array($data[0],$ean_iz_db)&&(isset($data[0]))){
               
    $query $this->db->query("UPDATE " DB_PREFIX "product SET quantity='".$data[1]."' WHERE ean='".$data[0]."' and manufacturer_id='".$man."'");}
            else { echo 
    "Товара с ean ".$data[0]." нет в БД. Необходимо внести новый товар с ean ".$data[0]."<br>";}
            
    $arr=array();
            
    $arr[]=$ean_i;
            foreach (
    $ean_iz_db as $ean_db){
               if(!
    in_array($ean_db,$arr)&&(isset($arr))){
                
    $query $this->db->query("UPDATE " DB_PREFIX "product SET `quantity`='0' WHERE `ean`='".$ean_db."' and `manufacturer_id`='".$man."'"); 
               }
            }
        }
    вид
    PHP:
    <div class="tab-pane" id="tab-import">
        <form action="<?php echo $action;?>" method="post" enctype="multipart/form-data" id="import" class="form-horizontal">
          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-import"><?php echo $entry_vibor_proiz?></label>
              <div class="col-sm-10">
                <?php foreach ($proizvoditeli as $proiz_p){?>
                <?php if(in_array($proiz_p['manufacturer_id'],$maspp)){?>
                <div class="checkbox">
                    <label><input type="radio" name="proiz_p[]" value="<?php echo $proiz_p['manufacturer_id']; ?>" /><?php echo $proiz_p['name']; ?></label>
                </div>
                <?php } }?>
            </div>
          </div>
           <div class="form-group">
        <label class="col-sm-2 control-label" for="input-upload"><?php echo $entry_upload?></label>
        <div class="col-sm-10">
         <input type="file" name="xls"/>
          </div>
          </div>
          <div class="form-group">         
            <label class="col-sm-2 control-label" for="input-ean"><?php echo $entry_ean?></label>
               <div class="col-sm-10">
                 <input type="text" name="ean_i" placeholder="<?php echo $help_ean?>" class="form-control" />
                 <?php echo $help_column?>
               </div>
          </div>
          <div class="form-group">         
            <label class="col-sm-2 control-label" for="input-kol"><?php echo $entry_kol?></label>
               <div class="col-sm-10">
                 <input type="text" name="kol_i" placeholder="<?php echo $help_kol?>" class="form-control" />
                 <?php echo $help_column?>
               </div>
          </div>
           <div class="form-group">
              <label class="col-sm-2 control-label" for="input-button-import"></label>
               <div class="col-sm-10">
                 <button type="submit" form="import" id="button-import" title="Импорт" class="btn btn-primary">Импорт</button>
               </div>
          </div>
        </form>
      
    </div>
      <script type="text/javascript"><!--
        <?php foreach ($languages as $language) { ?>
          <?php if ($ckeditor) { ?>
          ckeditorInit('input-description<?php echo $language['language_id']; ?>', '<?php echo $token?>');
          <?php } else { ?>
          $('#input-description<?php echo $language['language_id']; ?>').summernote({
            height: 300,
            lang:'<?php echo $lang?>'
          });
          <?php ?>
        <?php ?>
        //--></script>
      <script type="text/javascript"><!--
        $('#language a:first').tab('show');
        //--></script>
        <script type="text/javascript"><!--
    $('#button-import').on('click', function() {
        url = 'index.php?route=catalog/postavtchik&token=<?php echo $token?>';
      
        var man = $('input[name=\'proiz_p[]\']').val();
      
        if (man) {
            url += '&man=' + encodeURIComponent(man);
        }
      
        var xls = $('input[name=\'xls\']').val();
      
        if (xls) {
            url += '&xls=' + encodeURIComponent(xls);
        }
      
        var ean_i = $('input[name=\'ean_i\']').val();
      
        if (ean_i) {
            url += '&ean_i=' + encodeURIComponent(ean_i);
        }
      
        var kol_i = $('input[name=\'kol_i\']').val();
      
        if (kol_i) {
            url += '&kol_i=' + encodeURIComponent(kol_i);
        }

        location = url;
    });
    //--></script>
    контроллер
    PHP:
    public function export() {
            if(!empty(
    $_FILES['xls']['tmp_name'])) {
                
    $file $this->uploadFile($_FILES);
            }
          
            
    $this->xlsToMysql($file);
        }
      
        protected function 
    uploadFile($files) {
          
            
    $uploaddir PATH_SITE.'/file';
          
            
    $uploadfile $uploaddir .'/'.(int)microtime(true).'.xlsx';
          
            if (
    move_uploaded_file($files['xls']['tmp_name'], $uploadfile)) {
              return 
    $uploadfile;
            }
            return 
    FALSE;
        }
      
      
        public function 
    xlsToMysql($file) {
          
            if ((
    $this->request->server['REQUEST_METHOD'] == 'POST') && $this->validateForm()) {
                
    $this->model_catalog_postavtchik->importExcelData($this->request->get['postavtchik_id'], $this->request->post);
                
    $this->session->data['success'] = $this->language->get('text_success');
               
    $this->model $this->model('catalog/postavtchik');
               
    $this->xls $this->getPhpExcel($file);
               
    $this->xls->setActiveSheetIndex(0);
               
    $sheet $this->xls->getActiveSheet();
               
    $WorksheetIterator $sheet->getWorksheetIterator();
               
    $arr = array();
               if (isset(
    $this->request->get['ean_i'])) {
                  
    $ean_i $this->request->get['ean_i'];
                 }
               else {
                
    $ean_i '';
               }
              
               if (isset(
    $this->request->get['kol_i'])) {
                  
    $kol_i $this->request->get['kol_i'];
                 }
               else {
                
    $kol_i '';
               }
               foreach(
    $WorksheetIterator as $worksheet) {
                  
    $Title $worksheet->getTitle();
                   
    $lastRow$worksheet->getHighestRow();
                   
    $lastColumn $worksheet->getHighestColumn();
                   
    $lastColumnIndex PHPExcel_Cell::columnIndexFromString($lastColumn);
                   for (
    $row 12$row <= $lastRow; ++$row)
                       {
                           
    $val $worksheet->getCellByColumnAndRow($kol_i$row)->getValue();
                           
    $val1 $worksheet->getCellByColumnAndRow($ean_i$row)->getValue();
                           
    $arr[]=array('ean'=>$val1,'kol'=>$val);
                        };
        
                }
            }
          
         if(
    $this->model->importExcelData($arr)) {
            return 
    TRUE;
         }
        }
      
        public function 
    getPhpExcel($file) {
           require_once (
    "Classes/PHPExcel.php");
            return 
    PHPExcel_IOFactory::load($file);
        }
    но это не работает и ни единой ошибки не выдает. Буду рад любой подсказке.
     
    Lasted edited by : 18 мар 2017
  2. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Для начала повставляйте в разные места своего кода
    PHP:
    $this->log->write()
    с разными метками, чтоб понять в каком месте обрывается обработка. А дальше уже можно будет разбираться.

    И научитесь пользоваться кнопкой вставки кода, код в виде обычного текста - не читабелен!
     
  3. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Извиняюсь, что не оформил. Пробовал вставить вывод ошибки в модели и контроллере, вообще ничего не происходит. Я вот думаю, может я из формы неправильно передаю данные или неправильно их принимаю?
     
  4. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    Значит у вас действительно ничего не происходит. То есть, ваш код вообще не вызывается.

    Вы проверяли, у вас форма на сервер сабмитится и если да, то отправляется ли в ней файл? На счёт последнего у меня есть большие сомнения. Попробуйте засабмитить форму обычным способом, без js.
     
  5. Zalom

    Zalom

    Регистрация:
    18 мар 2017
    Сообщения:
    37
    Симпатии:
    1
    Разобрался. Проблема была в передаче данных. Вот код.
    вид
    PHP:
    <form method="post" enctype="multipart/form-data" id="form-postavtchik-import" class="form-horizontal">
            <div class="form-group">
            <label class="col-sm-2 control-label" for="input-proiz_p"><?php echo $entry_vibor_proiz?></label>
              <div class="col-sm-10">
                <?php foreach ($proizvoditeli as $proiz_p){?>
                <?php if($proiz_p['name']!='Он же производитель'){?>
                <div class="checkbox">
                    <label><input type="radio" name="proiz_p" value="<?php echo $proiz_p['manufacturer_id']; ?>" /><?php echo $proiz_p['name']; ?></label>
                </div>
                <?php } }?>
            </div>
          </div>
         
          <div class="form-group">
        <label class="col-sm-2 control-label" for="input-xls"><?php echo $entry_upload?></label>
        <div class="col-sm-10">
         <input type="file" name="xls"/>
          </div>
          </div>
         
          <div class="form-group">          
            <label class="col-sm-2 control-label" for="input-stroka"><?php echo $entry_stroka?></label>
               <div class="col-sm-10">
                 <input type="text" name="stroka" placeholder="<?php echo $help_stroka?>" class="form-control" />
                 <?php echo $help_row?>
               </div>
          </div>
         
          <div class="form-group">          
            <label class="col-sm-2 control-label" for="input-ean"><?php echo $entry_ean?></label>
               <div class="col-sm-10">
                 <input type="text" name="ean_i" placeholder="<?php echo $help_ean?>" class="form-control" />
                 <?php echo $help_column?>
               </div>
          </div>
         
          <div class="form-group">          
            <label class="col-sm-2 control-label" for="input-kol"><?php echo $entry_kol?></label>
               <div class="col-sm-10">
                 <input type="text" name="kol_i" placeholder="<?php echo $help_kol?>" class="form-control" />
                 <?php echo $help_column?>
               </div>
          </div>
         
          <div class="form-group">
              <label class="col-sm-2 control-label" for="input-button-import"></label>
               <div class="col-sm-10">
                 <button type="submit" form="form-postavtchik-import" id="button-import" title="Импорт" class="btn btn-primary">Импорт</button>
               </div>
          </div>
            </form>
    модель
    PHP:
    class ModelCatalogImportsklostatkov extends Model {

       
         public function 
    getProductEan($proiz_p) {
          
    $ean_db=array();
         
    $query $this->db->query("SELECT ean FROM " DB_PREFIX "product WHERE manufacturer_id=".$proiz_p."");
         foreach (
    $query->rows as $result) {
             if (!empty(
    $result['ean'])){
             
    $ean_db[] = $result['ean'];}
        }
        return 
    $ean_db;
        }
       
       
        public function 
    getUpdateQuantityYes($proiz_p,$data){
            
    $message = array();
           foreach(
    $data['print'] as $dt){
               if(
    in_array($dt['ean'],$data['ean_db'])){
                  
    $this->db->query("UPDATE " DB_PREFIX "product SET quantity='".$dt['kol']."' WHERE ean='".$dt['ean']."' and manufacturer_id='".$proiz_p."'");
                  
    $message[]= "товар с ean ".$dt['ean']." есть в БД, меняем  количество товара на ".$dt['kol'];
               } else {  
                
    $message[]="ввести новый товар с ean ".$dt['ean'];
               }
           }
         
          foreach(
    $data['ean_db'] as $de){
            if(!
    in_array($de,$data['print_ean'])){
                  
    $this->db->query("UPDATE " DB_PREFIX "product SET quantity='0' WHERE ean='".$de."' and manufacturer_id='".$proiz_p."'");
                  
    $message[]= "товара с ean ".$de." нет в файле, меняем  количество товара на 0";
               }  
          }
           return 
    $message
        }
       
    }
    контроллер
    PHP:
    protected function getForm() {
          
    $url '';

            
    $data['breadcrumbs'] = array();

            
    $data['breadcrumbs'][] = array(
                
    'text' => $this->language->get('text_home'),
                
    'href' => $this->url->link('common/dashboard''token=' $this->session->data['token'], 'SSL')
            );

            
    $data['breadcrumbs'][] = array(
                
    'text' => $this->language->get('heading_title'),
                
    'href' => $this->url->link('catalog/import_skl_ostatkov''token=' $this->session->data['token'] . $url'SSL')
            );


            
    $data['heading_title'] = $this->language->get('heading_title');
            
    $data['text_list'] = $this->language->get('text_list');
            
    $data['entry_vibor_proiz'] = $this->language->get('entry_vibor_proiz');
            
    $data['entry_upload'] = $this->language->get('entry_upload');
            
    $data['entry_ean'] = $this->language->get('entry_ean');
            
    $data['entry_kol'] = $this->language->get('entry_kol');
            
    $data['entry_stroka'] = $this->language->get('entry_stroka');
            
    $data['help_ean'] = $this->language->get('help_ean');
            
    $data['help_kol'] = $this->language->get('help_kol');
            
    $data['help_column'] = $this->language->get('help_column');
            
    $data['help_row'] = $this->language->get('help_row');
            
    $data['help_stroka'] = $this->language->get('help_stroka');
            
    $data['error_file'] = $this->language->get('error_file');
            
    $data['error_ean'] = $this->language->get('error_ean');
            
    $data['error_kol'] = $this->language->get('error_kol');
            
    $data['error_stroka'] = $this->language->get('error_stroka');

            
    $data['token'] = $this->session->data['token'];

            if (isset(
    $this->error['warning'])) {
                
    $data['error_warning'] = $this->error['warning'];
            } else {
                
    $data['error_warning'] = '';
            }

            if (isset(
    $this->session->data['success'])) {
                
    $data['success'] = $this->session->data['success'];

                unset(
    $this->session->data['success']);
            } else {
                
    $data['success'] = '';
            }

            
    $data['header'] = $this->load->controller('common/header');
            
    $data['column_left'] = $this->load->controller('common/column_left');
            
    $data['footer'] = $this->load->controller('common/footer');
            
    $data['error']=array();
           
           
    $this->load->model('catalog/postavtchik');
           
             
    $data['proizvoditeli'] = $this->model_catalog_postavtchik->getProizvoditeli(); 
             if (isset(
    $this->request->post['proizm']) ) {
                
    $data['proizm'] = $this->request->post['proizm'];
             } else {
                
    $data['proizm'] = array(0);
             }
             
             if (isset(
    $this->request->post['proiz_p']) ) {
                
    $data['proiz_p'] = $this->request->post['proiz_p'];
             } else {
                
    $data['proiz_p'] = 0;
             }
             
             if (isset(
    $this->request->files['xls']) ) {
                
    $data['xls'] = $this->request->files['xls'];
             } else {
                
    $data['xls'] = 0;
             }
             
                
    $newname '/var/www/domains/darbor.tanfan.ru/admin/file/'.$data['xls']['name'];
               if (!
    file_exists($newname)) {
               if ((
    move_uploaded_file($_FILES['xls']['tmp_name'],$newname))) {
               }}
               
               if (isset(
    $this->request->post['ean_i']) ) {
                
    $data['ean_i'] = $this->request->post['ean_i'];
             } else {
                
    //$data['error'][]=$data['error_ean']; 
                
    $data['ean_i'] = 0;
             }
             
             if (isset(
    $this->request->post['kol_i']) ) {
                
    $data['kol_i'] = $this->request->post['kol_i'];
             } else {
                 
    //$data['error'][]=$data['error_kol']; 
               
    $data['kol_i'] = 0;
             }
             
             if (isset(
    $this->request->post['stroka']) ) {
                
    $data['stroka'] = $this->request->post['stroka'];
             } else {
                 
    //$data['error'][]=$data['error_stroka'];
                 
    $data['stroka'] = 0;
             }
             
             
    $this->load->model('catalog/import_skl_ostatkov');
              if (isset(
    $this->request->post['proiz_p'])) {
                 
                 
    $data['ean_db'] = $this->model_catalog_import_skl_ostatkov->getProductEan($this->request->post['proiz_p']);
              } else {
                 
    $data['ean_db'] = array(0);
             }   
             
             
    $data['print']=$this->getRead($newname,$data['stroka'],$data['ean_i'],$data['kol_i']);
             
    $data['print_ean']=$this->getReadEan($newname,$data['stroka'],$data['ean_i']);
             
             if ((
    $this->request->server['REQUEST_METHOD'] == 'POST')&&(isset($this->request->post['proiz_p']))) {
                  
    $data['message'] = $this->model_catalog_import_skl_ostatkov->getUpdateQuantityYes($this->request->post['proiz_p'],$data);
              } else {
                 
    $data['message'] = array(0);
             
             }
             
             
    $put='/var/www/domains/darbor.tanfan.ru/admin/file/message.txt';
             
    $punctir='--------------------------------------------------------------------------------------------------------------------------------------------';
             
    $date=date('m.d.Y,H:i:s');
             if( !
    file_exists($put)) {
                 
    $fp fopen($put"w");
                 
    fwrite($fp"\r\n");
                 
    fwrite($fp$punctir."\r\n");
                 
    fwrite($fp$date."\r\n");
                 
    fwrite($fp"\r\n");
             foreach(
    $data['message'] as $dm){
             
    fwrite($fp$dm."\r\n");
             }
             
    fclose ($fp);
             }
             else
             {
               
    $fp fopen($put"a+");
               
    fwrite($fp"\r\n");
               
    fwrite($fp$punctir."\r\n");
                 
    fwrite($fp$date."\r\n");
                 
    fwrite($fp"\r\n");
             foreach(
    $data['message'] as $dm){
             
    fwrite($fp$dm."\r\n");
             }
             
    fclose ($fp);  
             }
               
           
            
    $this->response->setOutput($this->load->view('catalog/import_skl_ostatkov.tpl'$data));
        }
       
        public function 
    getRead($file,$str,$stolbec1,$stolbec2) {
            require_once (
    "../Classes/PHPExcel.php");
            
    $result = array();
           
            
    $file_type PHPExcel_IOFactory::identify$file );
             
    $objReader PHPExcel_IOFactory::createReader$file_type );
             
    $objPHPExcel $objReader->load$file );
             foreach (
    $objPHPExcel->getWorksheetIterator() as $worksheet)
                     {
                       
    $Title $worksheet->getTitle(); 
                       
    $lastRow $worksheet->getHighestRow();
                       
    $lastColumn $worksheet->getHighestColumn();
                       
    $lastColumnIndex PHPExcel_Cell::columnIndexFromString($lastColumn);
                       for (
    $row $str$row <= $lastRow; ++$row)
                           {
                            
    $val1 $worksheet->getCellByColumnAndRow($stolbec1$row)->getValue();
                            
    $val2 $worksheet->getCellByColumnAndRow($stolbec2$row)->getValue();
                                if (!empty(
    $val1)&&(!empty($val2))){
                                    
    $result[]=array('ean'=>$val1,'kol'=>$val2);
                                    }
                            }
                     }
        return 
    $result;
        }
       
        public function 
    getReadEan($file,$str,$stolbec1) {
            require_once (
    "../Classes/PHPExcel.php");
            
    $result = array();
           
            
    $file_type PHPExcel_IOFactory::identify$file );
             
    $objReader PHPExcel_IOFactory::createReader$file_type );
             
    $objPHPExcel $objReader->load$file );
             foreach (
    $objPHPExcel->getWorksheetIterator() as $worksheet)
                     {
                       
    $Title $worksheet->getTitle(); 
                       
    $lastRow $worksheet->getHighestRow();
                       
    $lastColumn $worksheet->getHighestColumn();
                       
    $lastColumnIndex PHPExcel_Cell::columnIndexFromString($lastColumn);
                       for (
    $row $str$row <= $lastRow; ++$row)
                           {
                            
    $val1 $worksheet->getCellByColumnAndRow($stolbec1$row)->getValue();
                                if (!empty(
    $val1)){
                                    
    $result[]=$val1;
                                    }
                            }
                     }
        return 
    $result;
        }

       
    Как правильно обработать ошибки, если, например, не введено значение в поле или не выбран файл?