Импорт прайс-листа из Excel файла
Использование:
$PriceImporter = new PriceImporter(); $PriceImporter->import('path/file.xls');
- PriceImporter.php
class PriceImporter { public function __construct() { require_once('phpexcel/PHPExcel/IOFactory.php'); } public function import($file) { $this->loadXLS($file); $isValid = $this->isValidFormat(); if(!$isValid) return false; return $this->processWorkbook(); } private $objReader, $objPHPExcel; private function loadXLS($fileName) { $inputFileType = PHPExcel_IOFactory::identify($fileName); $this->objReader = PHPExcel_IOFactory::createReader($inputFileType); $this->objReader->setReadDataOnly(true); $this->objPHPExcel = $this->objReader->load($fileName); $this->objPHPExcel->setActiveSheetIndex(0); $this->aSheet = $this->objPHPExcel->getActiveSheet(); } // проверка на соответствие формату private function isValidFormat() { return $this->getCell('A4') == 'Номенклатура, Ед. изм.'; } // парсинг страницы товаров private function processWorkbook() { $lineNumber = 8; // начальный номер строки, от которой идет парсинг $linesProcessed = 0; while ($data = $this->getData($lineNumber)) { if ($data['isCorrect']) { $ShopItem = new ShopItem($data); // ShopItem - по типу Active Record $linesProcessed += $ShopItem->store(); } $lineNumber++; } return $linesProcessed; } // получение данных о товаре из одной строки private function getData($lineNumber) { if ($lineNumber > $this->aSheet->getHighestRow()) return false; $name = $this->getCell('A'.$lineNumber); $sku = $this->getCell('E'.$lineNumber); $option = $this->getCell('F'.$lineNumber); $price = $this->getCell('G'.$lineNumber); $bar = $this->getCell('H'.$lineNumber); $balance = $this->getCell('I'.$lineNumber); return array( 'isCorrect' => $name && $sku && $price, 'name' => $name, 'sku' => $sku, 'option' => $option, 'price' => $price 'bar' => $bar , 'balance' => $balance ); } // получаем значение или вычисленное значение private function getCell($cell) { $_cell = $this->aSheet->getCell($cell); $text = $_cell->getValue(); if((substr($text,0,1) === '=' ) && (strlen($text) > 1)) { $text = $_cell->getOldCalculatedValue(); } return trim($text); } }
ShopItem
- Active Record.
- ShopItem.php
class ShopItem { private $data, $isNew = false; public function __construct(array $data, $db) { $this->db = $db; $this->data = $data; $this->getId($this->data['sku']); } public function store() { // не добавляем новые товары, только обновляем старые // если требуется добавление - доработать if ($this->isNew) return 0; $query = "UPDATE `shop_items` SET " // .($this->isNew ? "`name` = '".addslashes($this->data['name'])."', " : null) ."`price` = '".addslashes($this->data['price'])."', " ."`balance` = '".addslashes($this->data['balance'])."' " ."WHERE `id` = ".$this->id; $this->db->Query($query); return $this->db->SelectAffectedRows(); } public function getId($sku) { $this->id = $this->db->SelectValue("SELECT `id` FROM `shop_items` WHERE `sku` = '".addslashes($sku)."'"); if ($this->id == 0) { $this->isNew = true; return; // если требуется добавление - расскоментировать $query = "INSERT INTO `shop_items` (`sku`) VALUES ('".addslashes($sku)."')"; $this->db->Query($query); $this->id = $this->db->SelectLastInsertId(); } } }