Форум пользователей Impera CMS
Impera CMS - отличный движок для лёгкого создания интернет магазина.
Обладает невероятным количеством функций, необходимых в онлайн торговле.

Следить
Главная
20:21
21 сен
#
?
написал:

Доброго времени суток!

Подскажите, как можно сделать экспорт свойств товаров? Существующий функционал позволяет выгружать товары без свойств.

15:54
27 сен
#
написал:

Я набросал пример модуля экспорта товарных свойств в CSV-файл. Его можно взять за основу и модернизировать, если кому-либо потребуется иная структура колонок. В представленном ниже виде модуль не имеет интерфейсной части, где предполагались бы элементы по управлению его работой, и выводит в CSV табличку из таких колонок:

  • ид товара
  • название товара
  • свойство 1
  • свойство 2
  • ...
  • свойство N

Модуль экспорта свойств товаров


Пример работы модуля можно посмотреть на демо сайте: экспорт свойств (логин admin, пароль 123).

Код модуля показан ниже. Порядок ручной установки (по сути напоминает инструкции статьи Пишем простой админ модуль Hello World):

  • сохраните код модуля в файл ExportProperties.admin.php
  • создайте на сайте папку objects/exportproperties
  • поместите в эту папку сохраненный файл
  • откройте страницу http://ваш.сайт/admin?section=ExportProperties


Исходный код модуля

<?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;
        }
    }
?>

Написание ответа

Перед публикацией рекомендуется использовать Предпросмотр, чтобы увидеть конечный вид сообщения.


Обратите внимание! Для противодействия спаму новые посты форума проявляются с задержкой от нескольких минут, пока не пройдут модерацию.