How To: Экспорт прайс-листа в Excel
Для автоматической генерации прайс-листа в формате Excel необходимо загрузить PHPExcel и распаковать его в корневую директорию.
Обновите код настроек ТДС "Прайс" на следующий:
<?php $oShop = Core_Entity::factory('Shop', Core_Array::get(Core_Page::instance()->libParams, 'shopId')); $Shop_Controller_Show = new Shop_Controller_Show($oShop); $path = Core_Page::instance()->structure->getPath(); $Shop_Controller_Show //->pattern(rawurldecode($path) . '({path})(page-{page}/)') ->pattern(rawurldecode($path) . '({path})({xls})(page-{page}/)') ->patternExpressions(array( 'xls' => 'xls\/' )) ->addEntity( Core::factory('Core_Xml_Entity') ->name('path') ->value($path) ) ->limit(500) ->parseUrl(); // Генерация Excel прайса class HostCMS_Excel extends Core_Servant_Properties { /** * Allowed object properties * @var array */ protected $_allowedProperties = array( 'title', 'filename', ); /** * excelObject * @var object */ protected $_excelObject = NULL; /** * excelSheetObject * @var object */ protected $_excelSheetObject = NULL; /** * excelWriterObject * @var object */ protected $_excelWriterObject = NULL; /** * Shop_Model * @var object */ protected $_shop = NULL; protected $_cell = 2; /** * Constructor. */ public function __construct($objPHPExcel, Shop_Model $oShop) { parent::__construct(); $this->_excelObject = $objPHPExcel; $this->_shop = $oShop; $this->title = 'price'; $this->filename = 'file'; // set default font $this->_excelObject->getDefaultStyle()->getFont()->setName('Calibri'); // set default font size $this->_excelObject->getDefaultStyle()->getFont()->setSize(10); // writer already created the first sheet for us, let's get it $this->_excelSheetObject = $this->_excelObject->getActiveSheet(); // create the writer $this->_excelWriterObject = PHPExcel_IOFactory::createWriter($this->_excelObject, "Excel5"); // autosize the columns $this->_excelSheetObject->getColumnDimension('A')->setAutoSize(TRUE); $this->_excelSheetObject->getColumnDimension('B')->setAutoSize(TRUE); $this->_excelSheetObject->getColumnDimension('C')->setAutoSize(TRUE); } /** * File output. */ public function output() { // rename the sheet $this->_excelSheetObject->setTitle($this->title); // write header $this->header($this->_excelSheetObject); $aShop_Groups = $this->fillShopGroup($this->_shop->id, 0); foreach ($aShop_Groups as $iShopGroupId => $sShopGroupName) { $this->_excelSheetObject->getStyle('A' . $this->_cell)->getFont()->setBold(TRUE); $this->_excelSheetObject->getCell('A' . $this->_cell)->setValue($sShopGroupName); $this->_cell++; $this->items(intval($iShopGroupId)); } // Setting the header type header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="' . $this->filename . '.xls"'); header('Cache-Control: max-age=0'); $this->_excelWriterObject->save('php://output'); } /** * Create header row. */ public function header($oSheet) { // let's bold and size the header font and write the header // as you can see, we can specify a range of cells, like here: cells from A1 to A4 $oSheet->getStyle('A1:C1')->getFont()->setBold(TRUE)->setSize(12); $oSheet->getCell('A1')->setValue('Наименование'); $oSheet->getCell('B1')->setValue('Артикул'); $oSheet->getCell('C1')->setValue('Цена'); return $oSheet; } /** * Create items row. */ public function items($iShopGroupId) { $offset = 0; $limit = 100; $sCurrency = $this->_shop->Shop_Currency->name; $oShop_Group = $this->_shop->Shop_Groups->getById($iShopGroupId); $Shop_Item_Controller = new Shop_Item_Controller(); if (Core::moduleIsActive('siteuser')) { $oSiteuser = Core_Entity::factory('Siteuser')->getCurrent(); if ($oSiteuser) { $Shop_Item_Controller->siteuser($oSiteuser); } } if (!is_null($oShop_Group->id)) { do { $oShop_Items = $oShop_Group->Shop_Items; $oShop_Items->queryBuilder() ->where('shop_items.active', '=', 1) ->offset($offset) ->limit($limit); $aShop_Items = $oShop_Items->findAll(FALSE); foreach ($aShop_Items as $oShop_Item) { // Shortcut $iShortcut = $oShop_Item->shortcut_id; if ($iShortcut) { $oShop_Item = $oShop_Item->Shop_Item; } $aPrice = $Shop_Item_Controller->getPrices($oShop_Item); $price = Shop_Controller::instance()->getCurrencyCoefficientInShopCurrency( $oShop_Item->Shop_Currency, $oShop_Item->Shop->Shop_Currency) * $aPrice['price_discount']; $sPrice = $price . ' ' . $sCurrency; $this->_excelSheetObject->getCell('A' . $this->_cell)->setValue($oShop_Item->name); $this->_excelSheetObject->getCell('B' . $this->_cell)->setValue($oShop_Item->marking); $this->_excelSheetObject->getCell('C' . $this->_cell)->setValue($sPrice); $this->_cell++; } $offset += $limit; } while (count($aShop_Items)); } return $this; } /** * Shop groups tree * @var array */ protected $_aGroupTree = array(); /** * Build visual representation of group tree * @param int $iShopId shop ID * @param int $iShopGroupParentId parent ID * @param int $aExclude exclude group ID * @param int $iLevel current nesting level * @return array */ public function fillShopGroup($iShopId, $iShopGroupParentId = 0, $aExclude = array(), $iLevel = 0) { $iShopId = intval($iShopId); $iShopGroupParentId = intval($iShopGroupParentId); $iLevel = intval($iLevel); if ($iLevel == 0) { $aTmp = Core_QueryBuilder::select('id', 'parent_id', 'name') ->from('shop_groups') ->where('shop_id', '=', $iShopId) ->where('deleted', '=', 0) ->where('active', '=', 1) ->orderBy('sorting') ->orderBy('name') ->execute()->asAssoc()->result(); foreach ($aTmp as $aGroup) { $this->_aGroupTree[$aGroup['parent_id']][] = $aGroup; } } $aReturn = array(); if (isset($this->_aGroupTree[$iShopGroupParentId])) { $countExclude = count($aExclude); foreach ($this->_aGroupTree[$iShopGroupParentId] as $childrenGroup) { if ($countExclude == 0 || !in_array($childrenGroup['id'], $aExclude)) { $aReturn[$childrenGroup['id']] = $childrenGroup['name']; $aReturn += $this->fillShopGroup($iShopId, $childrenGroup['id'], $aExclude, $iLevel + 1); } } } $iLevel == 0 && $this->_aGroupTree = array(); return $aReturn; } } if (!empty($Shop_Controller_Show->patternParams['xls'])) { require_once(CMS_FOLDER . 'PHPExcel/PHPExcel.php'); // create new PHPExcel object $objPHPExcel = new PHPExcel(); $HostCMS_Excel = new HostCMS_Excel($objPHPExcel, $oShop); $HostCMS_Excel ->title('Прайс ' . $oShop->name) ->filename('price') ->output(); exit(); } // /Excel Core_Page::instance()->object = $Shop_Controller_Show;
Обновите код ТДС "Прайс" на следующий:
<?php $Shop_Controller_Show = Core_Page::instance()->object; $Shop_Controller_Show ->shopItems() ->queryBuilder() ->clearOrderBy() ->leftJoin('shop_groups', 'shop_groups.id', '=', 'shop_items.shop_group_id') ->where('shop_items.active', '=', 1) ->open() ->where('shop_groups.active', '=', 1) ->setOr() ->where('shop_groups.active', 'IS', NULL) ->where('shop_items.modification_id', '=', 0) ->close() ->clearOrderBy() ->orderBy('shop_items.shop_group_id') ->orderBy('shop_items.name'); $Shop_Controller_Show ->shopGroups() ->queryBuilder() ->where('shop_groups.active', '=', 1) ->clearOrderBy() ->orderBy('shop_groups.id'); $xslName = Core_Array::get(Core_Page::instance()->libParams, 'xsl'); $Shop_Controller_Show ->xsl( Core_Entity::factory('Xsl')->getByName($xslName) ) ->groupsMode('all') ->itemsProperties(TRUE) ->group(FALSE) ->show();
Прайс-лист будет доступен по адресу http://ваш_сайт/shop/price/xls/
Комментарии
-
Добавить остаток на складе
Подскажите, как в выгружаемый файл XLS добавить столбец с остатками товара на складе?
Без темы
В аналогичных строчках нужно добавить:
$this->_excelSheetObject->getColumnDimension('D')->setAutoSize(TRUE);
///////////
$oSheet->getCell('D1')->setValue('На складе');
///////
$this->_excelSheetObject->getCell('D' . $this->_cell)->setValue($oShop_Item->getRest());
-
Без темы
а группы от подгрупп мы как то можем отделить?
или узнать их уровень?
-
Без темы
Постраничная навигация на самой странице Прайс не работает - каждый раз скачивается прайс при этом
-
PHPExcel - DEAD
на странице скрипта рекомендовано перейти на
https://github.com/PHPOffice/PhpSpreadsheet
-
не работает
всё сделал по инструкции но отдаёт пустую страницу.
это для какой версии? может для старых версий?Без темы
Решение для актуальных версий. Вероятно у вас какая ошибка при интеграции.
ошибка в коде
вероятно какой-то рукожоп писал код настроек тдс прайса. там путь на сервере до PHPExcel.php на правильно прописан и поэтому некорректная работа.
Без темы
В категориях рукожопов не разбираемся, вам лучше знать, насколько вижу, путь подключения явно указан: require_once(CMS_FOLDER . 'PHPExcel/PHPExcel.php');
Без темы
А Вы уверены в этом пути? "...загрузить PHPExcel и распаковать его в корневую директорию..." посмотрите собственную инструкцию.... или инструкцию установки скрипта по вашей ссылке... Как-то я нигде ни увидел упоминания директории PHPExcel...
-
Без темы
А возможно сделать ссылки в прайсе на сайт с каждой позиции ? На 5-ой версии по умолчанию все было. Как в данном случае добавить ?
-
Ошибка
После перехода по ссылке на сайте http://...ru/shop/price/xls/ появляется ошибка:
Предупреждение: require_once(/home/i/info11/christmas-spb.ru/public_html/PHPExcel/PHPExcel.php): failed to open stream: No such file or directory в файле /home/i/info11/christmas-spb.ru/public_html/hostcmsfiles/lib/lib_54/lib_config_54.php (строка 269) Fatal error: require_once(): Failed opening required '/home/i/info11/christmas-spb.ru/public_html/PHPExcel/PHPExcel.php' (include_path='.:/usr/share/php') in /home/i/info11/christmas-spb.ru/public_html/hostcmsfiles/lib/lib_54/lib_config_54.php on line 269