Доброго времени суток!
Подскажите, как можно сделать экспорт свойств товаров? Существующий функционал позволяет выгружать товары без свойств.
Доброго времени суток!
Подскажите, как можно сделать экспорт свойств товаров? Существующий функционал позволяет выгружать товары без свойств.
Я набросал пример модуля экспорта товарных свойств в CSV-файл. Его можно взять за основу и модернизировать, если кому-либо потребуется иная структура колонок. В представленном ниже виде модуль не имеет интерфейсной части, где предполагались бы элементы по управлению его работой, и выводит в CSV табличку из таких колонок:
Пример работы модуля можно посмотреть на демо сайте: экспорт свойств (логин admin, пароль 123).
Код модуля показан ниже. Порядок ручной установки (по сути напоминает инструкции статьи Пишем простой админ модуль Hello World):
Исходный код модуля
<?php // макет справочника require_once(dirname(__FILE__) . '/../.ref-models/BasicModel.php'); // ======================================================================= /** * Админ модуль экспорта свойств товаров */ // ======================================================================= class ExportProperties extends BasicREFModel { // имя файла шаблона protected $template = 'export_properties/export_properties.htm'; // =================================================================== /** * Преобразование значения для безопасного сохранения в CSV * * @access public * @param string $value исходное значение * @return string преобразованное значение */ // =================================================================== public function valueToCSV ( $value ) { $value = trim($value); if (preg_match('/[";]/', $value)) { $value = str_replace('"', '""', $value); $value = '"' . $value . '"'; } return $value; } // =================================================================== /** * Визуализация данных (результирующего контента) * * @access public * @param object $parent объект владельца * @return boolean TRUE если разрешаем продолжать работу */ // =================================================================== public function fetch ( & $parent = null ) { // TODO: в будущем сделать интерфейсную часть if ($this->request->getRequest('act') != 'download') { $this->title = 'Экспорт свойств товаров'; $this->body = '<br /><br /><br /><br />' . '<div class="error">' . 'У этой модификации модуля пока нет интерфейсной части, ' . 'поэтому просто нажмите:<br /><br /> ' . '<a href="?section=ExportProperties&act=download"><b>эту ссылку</b></a> - для скачивания CSV-файла со свойствами всех товаров<br /><br />' . '<a href="?section=ExportProperties&act=download&charset=utf8"><b>эту ссылку</b></a> - то же самое в кодировке UTF-8<br /><br />' . '<a href="?section=ExportProperties&act=download&nolabel"><b>эту ссылку</b></a> - то же самое, но без мнемоник колонок<br /><br />' . '<a href="?section=ExportProperties&act=download&charset=utf8&nolabel"><b>эту ссылку</b></a> - то же самое в UTF-8, но без мнемоник колонок<br /><br />' . 'в ссылке также поддерживается параметр <b>cid=ИдКатегории</b> для вывода свойств товаров из интересующей категории, однако с этим параметром будет удобно работать только с появлением интерфейсной части' . '</div>' . '<br /><br /><br /><br />'; // иначе это скачивание файла } else { // кодировка $charset = $this->request->getRequest('charset', 'cp1251'); $charset = $this->text->lowerCase(trim($charset)); switch ($charset) { case 'utf8': case 'cp1251': $this->cms->db->set_charset($charset); break; default: $this->cms->db->set_charset('cp1251'); } // товары какой категории? $cid = $this->request->getRequest('cid'); $cid = @ intval($cid); // заголовки $file = 'properties-' . (!empty($cid) ? 'cat' . $cid . '-' : 'all-') . date('Ymd-His') . '.csv'; header('Content-Description: File Transfer'); header('Content-Type: text/csv'); header('Content-disposition: attachment; filename=' . $file); // читаем список свойств $result = $this->cms->db->query('SELECT `property_id`, ' . '`name` ' . 'FROM `properties` ' . 'WHERE `enabled` = 1 ' . 'ORDER BY `property_id` ASC;'); if ($result !== FALSE) { $ids = array(0); $properties = array(); while ($row = $this->cms->db->fetch_assoc($result)) { $id = @ intval($row['property_id']); if (!empty($id)) { $ids[$id] = $id; $properties[$id] = $row['name']; } } $this->cms->db->free_result($result); if (!empty($properties)) { $ids = implode(',', $ids); // читаем список значений свойств $result = $this->cms->db->query('SELECT `product_id`, ' . '`property_id`, ' . '`value`, ' . '`order_num` ' . 'FROM `properties_values` ' . 'WHERE `property_id` IN(' . $ids . ') ' . 'ORDER BY `product_id` ASC, ' . '`property_id` ASC, ' . '`order_num` ASC;'); if ($result !== FALSE) { $values = array(); while ($row = $this->cms->db->fetch_assoc($result)) { $id = @ intval($row['product_id']); if (!empty($id)) { if (!isset($values[$id])) $values[$id] = array(); $values[$id][] = $row; } } $this->cms->db->free_result($result); if (!empty($values)) { // определяем сколько колонок нужно под свойства $maxcol = 0; foreach ($values as $value) $maxcol = max($maxcol, count($value)); // выводим строку CSV (мнемоники колонок) $separator = ';'; if ($this->request->getRequest('nolabel') === FALSE) { echo 'productId' . $separator . 'model'; $count = 1; while ($count <= $maxcol) { echo $separator . 'property' . ($count == 1 ? '' : $count); $count++; } echo "\r\n"; } // читаем список товаров $result = $this->cms->db->query('SELECT `products`.`product_id`, ' . '`products`.`model` ' . 'FROM `products` ' . (empty($cid) ? '' : 'LEFT JOIN `products_categories` ON `products_categories`.`product_id` = `products`.`product_id` ' . 'WHERE `products`.`category_id` = ' . $cid . ' ' . 'OR `products_categories`.`category_id` = ' . $cid . ' ' . 'GROUP BY `products`.`product_id` ') . 'ORDER BY `products`.`product_id` ASC;'); if ($result !== FALSE) { while ($row = $this->cms->db->fetch_assoc($result)) { $id = @ intval($row['product_id']); if (!empty($id)) { // выводим строку CSV if (isset($values[$id])) { $line = $id . $separator . $this->valueToCSV($row['model']); $count = $maxcol; foreach ($values[$id] as $value) { $pid = @ intval($value['property_id']); if (!empty($pid)) { $value = trim($properties[$pid]) . ': ' . trim($value['value']); } else { $value = trim($value['value']); } $line .= $separator . $this->valueToCSV($value); $count--; } if ($count > 0) $line .= str_repeat($separator, $count); echo $line . "\r\n"; } } } } $this->cms->db->free_result($result); } } } } exit; } return TRUE; } } ?>