Здравствуйте. Только начал работать с 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); } но это не работает и ни единой ошибки не выдает. Буду рад любой подсказке.
Для начала повставляйте в разные места своего кода PHP: $this->log->write() с разными метками, чтоб понять в каком месте обрывается обработка. А дальше уже можно будет разбираться. И научитесь пользоваться кнопкой вставки кода, код в виде обычного текста - не читабелен!
Извиняюсь, что не оформил. Пробовал вставить вывод ошибки в модели и контроллере, вообще ничего не происходит. Я вот думаю, может я из формы неправильно передаю данные или неправильно их принимаю?
Значит у вас действительно ничего не происходит. То есть, ваш код вообще не вызывается. Вы проверяли, у вас форма на сервер сабмитится и если да, то отправляется ли в ней файл? На счёт последнего у меня есть большие сомнения. Попробуйте засабмитить форму обычным способом, без js.
Разобрался. Проблема была в передаче данных. Вот код. вид 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; } Как правильно обработать ошибки, если, например, не введено значение в поле или не выбран файл?