[ExportPage] - Экспорт ресурсов в файлы.

[ExportPage] — Компонент реализует возможность экспорта ресурсов, создание и вывода файлов экспорта по запросу.


пролог
На момент создания пакет работает только с файлами pdf. (mpdf)

Общие настройки
— основные

Основные настройки файлов экспорта.
  • page_orientation — ориентация страницы
  • page_format — формат страницы
  • page_margins — отступы страницы
  • creator — создатель документа
  • author — автор документа
  • font — шрифт документа
  • font_size — размер шрифта документа
  • prepare_css — подготовить css
  • prepare_img — подготовить изображения
  • show_log — показать лог
  • source_default — источник файлов
  • date_format — формат даты
— админка

  • Настройки по легкой кастомизации панели файлов экспорта.
  • disable_for_resources — Отключить в ресурсах
  • disable_for_templates — Отключить у шаблонов
  • disable_combo_resources — Отключить выбор ресурса
  • disable_combo_users — Отключить выбор пользователя
  • disable_field_search — Отключить поле поиска
  • disable_combo_source — Отключить выбор источника файлов
  • disable_combo_type — Отключить выбор типа файла

— права доступа

Настройка прав доступа к файлам экспорта.
  • permit_snippet — Специальный сниппет для проверки прав доступа к файлу
  • permit_download — Разрешает режим загрузки файла
  • permit_direct — Разрешает режим прямой ссылки на файл
  • permit_hidden — Разрешает режим скрытой ссылки на файл
  • permit_auto_creation_templates — Список id шаблонов через запятую, для которых разрешено автосоздание документов экспорта
  • permit_auto_remove — Разрешает удаление файлов при удалении ресурсов родителей. Файлы на блокировке не удаляются
Панель уравления
— Файлы экспорта. Панель управления файлами экспорта. Можно просмотреть, создать, удалить, обновить файлы экспорта. Доступна сортировка, поиск и управление свойствами файлов экспорта.

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


Сниппеты ExportPage
— exp.File.List Сниппет для вывода списка файлов экспорта.
Параметры сниппета:
  • tplRow — Имя чанка для оформления
  • tplOuter — Обёртка для вывода результатов работы сниппета
  • returnIds — Возвращать строку с id файлов, вместо оформленных чанков
  • resource — Идентификатор ресурса
  • users — Список id пользователей, через запятую
  • where — Массив дополнительных параметров выборки, закодированный в JSON
  • showInactive — Показывать неактивные файлы
  • sortby — Любое поле для сортировки
  • sortdir — Направление сортировки: по убыванию или возрастанию
  • limit — Ограничение количества результатов выборки
  • showLog — Показывать дополнительную информацию о работе сниппета
На фронте получим вывод списка файлов по указанным параметрам

Помимо плейсходеров таблицы файлов, доступны еще специальные плейсходеры-ссылки:
  • uri_download — ссылка на загрузку файла
  • uri_direct — прямая ссылка на файл в источнике файлов
  • uri_hidden — скрытая ссылка на файл
— exp.File.Request Сниппет для отдачи файла экспорта по запросу.
Если в предыдущем сниппете мы выводили список существующих файлов и ссылки на их просмотр/загрузку, то с помощью этого сниппета мы можем сформировать ссылку на файл, но как такового файла может еще и не быть.
Параметры сниппета:
  • tpl — Имя чанка для оформления
  • resource — Идентификатор ресурса
  • set — Идентификатор набора
  • mode — Режим отдачи файла
  • type — Тип файла
  • action — Строка запроса
Итого есть следующие режимы (mode) отдачи файла:
  • download — сразу загрузка файла
  • direct — открыть файл по прямой ссылке
  • hidden — открыть файл по скрытой ссылке
  • url — получить ссылку на файл
  • json — получить файл в json
Совсем не обязательно создавать файлы в админке, достаточно просто создать набор файла экспорта, указать требуемый набор в вызове сниппета и все.
Пользователь перейдя по ссылке запустит процес создания файла и получит файл как если бы он уже существовал на момент запроса.

Файлы экспорта каталогов товара
Все бы ничего, но генерация файла занимает какое то время и в случае если ресурс для генерации представляет собой каталог товара, процесс создания может затянуться. Для этих целей я написал простенький скрипт для запуска из под cron.

<?php

define('MODX_API_MODE', true);
//require_once dirname(dirname(__FILE__)) . '/core/config/config.inc.php';
require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config/config.inc.php';
require_once MODX_BASE_PATH . 'index.php';
// error
$modx->getService('error', 'error.modError');
$modx->getRequest();
$modx->setLogLevel(modX::LOG_LEVEL_ERROR);
$modx->setLogTarget('FILE');
$modx->error->message = null;
/** @var array $scriptProperties */
$scriptProperties = array();
$scriptProperties['returnIds'] = 1;
$scriptProperties['showLog'] = 1;
$scriptProperties['fastMode'] = 1;
$scriptProperties['limit'] = 10;
$scriptProperties['depth'] = 10;
$scriptProperties['parents'] = 0;
$scriptProperties['where'] = '{"class_key:IN":["msProduct","msCategory"]}';
// @var array $params */
$params = array();
$params['mode'] = 'url';
$params['sets'] = 1;
/** @var exportpage $exportpage */
if (!$exportpage = $modx->getService('exportpage', 'exportpage', $modx->getOption('exportpage_core_path', null, $modx->getOption('core_path') . 'components/exportpage/') . 'model/exportpage/', $scriptProperties)) {
	return 'Could not load exportpage class!';
}
$exportpage->initialize($modx->context->key, $scriptProperties);
/** @var modSnippet $snippet */
if ($snippet = $modx->getObject('modSnippet', array('name' => 'pdoResources'))) {
	$snippet->_cacheable = false;
	$snippet->_processed = false;
	$ids = $snippet->process($scriptProperties);
}
if (!empty($ids)) {
	$ids = explode(',', $ids);
	foreach($ids as $id) {
		$params['id'] = $id;
		if (!$response = $modx->runProcessor('web/files/request',
			$params,
			array(
				'processors_path' => $exportpage->config['processorsPath'],
			))
		) {
			$exportpage->printLog('[ExportPage] Could not create file:');
			$exportpage->printLog($params);
		}
		$modx->error->reset();
		$exportpage->printLog('[ExportPage] Generate for id='.$params['id']);
	}
}
Выборка ресурсов идет через pdoResources — доступны все знакомые вам параметры, и я думаю вам не составит труда добавить необходимые условия в пример скрипта.

шрифт
шрифт меняется в настройке ExportPage exportpage_font
доступные шрифты прописаны в файле config_fonts.php
$this->fontdata = array(
    "dejavusanscondensed"  => array(
        'R'          => "DejaVuSansCondensed.ttf",
        'B'          => "DejaVuSansCondensed-Bold.ttf",
        'I'          => "DejaVuSansCondensed-Oblique.ttf",
        'BI'         => "DejaVuSansCondensed-BoldOblique.ttf",
        'useOTL'     => 0xFF,
        'useKashida' => 75,
    ),
    "dejavusans"           => array(
        'R'          => "DejaVuSans.ttf",
        'B'          => "DejaVuSans-Bold.ttf",
        'I'          => "DejaVuSans-Oblique.ttf",
        'BI'         => "DejaVuSans-BoldOblique.ttf",
        'useOTL'     => 0xFF,
        'useKashida' => 75,
    ),
....
Вы можете добавить свой шрифт самостоятельно, для этого вам нужно положить файлы шрифта в папочку ttfonts библиотеки mpdf и прописать свой шрифт в массив gist.github.com/vgrish/335464df16ccc3db5ccec5459f40e255#file-config_fonts-php-L85

ps. На сегодня пока все, в дальнейшем распишу более подробно.
Пакет [ExportPage] будет доступен в магазине modstore.pro/ на платной основе. Save2page — будет снят с продаж.
Володя
22 июня 2015, 10:10
modx.pro
5
7 372
+2
Поблагодарить автора Отправить деньги

Комментарии: 37

Виталий
22 июня 2015, 21:24
+1
    yani
    23 июня 2015, 12:32
    0
    поддержка Save2page не планируется?
    и приобрести Save2page теперь будет нельзя?
      Володя
      23 июня 2015, 14:23
      0
      нет, нет…
        Кирилл
        27 июля 2015, 23:59
        0
        хм, а как теперь быть тем, кто уже купил save2page (в бета версии 0.0.4), покупать «улучшенную» версию еще раз за ту же сумму или есть\будут какие-либо скидки на обновление? :)
      Серега Дождь
      23 июня 2015, 15:58
      0
      Василий хотел бы иметь возможность потестить это дополнение на тестовом сайте modhost.pro
        Наумов Алексей
        06 июля 2015, 10:49
        0
        Простой вопрос, вывести ссылку «Скачать страницу в PDF» я могу с помощью этого дополнения? Мне не нужен cron, списки файлов и т.д.
          Володя
          06 июля 2015, 10:55
          0
          Естественно…
            Наумов Алексей
            06 июля 2015, 11:40
            0
            exp.File.Request?

            Как обстоят у него дела с css стилями? Могу ли я при экспорте задать другой шаблон (ну типа версия для печати). Точнее нужно каким то образом указать разные шаблоны «для печати» для разных шаблонов =)
              Володя
              06 июля 2015, 12:16
              0
              да exp.File.Request
              set — Идентификатор набора. Можно задать тип, формат, ориентацию, оформление файла и тд.
                Володя
                06 июля 2015, 12:18
                0
                создаете необходимые наборы, в них нужные чанки оформления и все.
            Олег
            28 октября 2016, 01:21
            0
            Можно ли с помощью данного дополнения организовать вывод содержимого корзины (не заказа) в pdf?
              Володя
              28 октября 2016, 07:53
              +1
              да, по идее можно. надо только добавить параметр принудительного обновления pdf для его формирования в момент запроса. Иначе он сформируется только один раз.
                Володя
                28 октября 2016, 07:54
                +1
                достаточно вызвать сниппет exp.File.Request
                например
                [[!exp.File.Request?
                &tpl=`@INLINE <a href="[[+uri_request]]" >download the export file</a>`
                &resource=`16`
                &set=`1`
                &mode=`direct`
                &type=`pdf`
                &action=`files/request`
                ]]
                где resource — ресурс с корзиной
                  Олег
                  28 октября 2016, 09:12
                  +1
                  Ок, спасибо! Надо брать
                    Володя
                    28 октября 2016, 09:28
                    0
                    пожалуйста…
                    Ок, спасибо! Надо брать
                    Надо тогда добавить параметр обновления)
                      Володя
                      28 октября 2016, 12:15
                      0
                      добавить параметр
                      &real=`1`
                      , файл будет обновляться при каждом запросе. Также к имени файла будет добавлен идентификатор сессии.

                      [[!exp.File.Request?
                      &tpl=`@INLINE <a href="[[+uri_request]]" >download the export file</a>`
                      &resource=`16`
                      &set=`1`
                      &mode=`direct`
                      &type=`pdf`
                      &action=`files/request`
                      &real=`1`
                      ]]
                  Игорь
                  27 апреля 2017, 06:53
                  0
                  можно ли использовать компонент для генерации двух pdf по двум разным шаблоном для двух языковых версий мультиязычного сайта?
                    Володя
                    27 апреля 2017, 09:07
                    0
                    незнаю. Создайте тестовый сайт и там попробуйте…
                      Николай
                      02 июня 2017, 15:57
                      0
                      Что-то не ставится на тестовом… Вопрос: оно будет на php 7.1 работать? Save2page материться на
                      Fatal error: Switch statements may only contain one default: clause in lib/mpdf/mpdf.php on line 1432
                      библиотека похоже та же стоит.
                        Николай
                        02 июня 2017, 17:27
                        0
                        Как временное решение: находим и открываем файл mpdf.php, ищем в районе ошибки строку
                        case 'A4': default: {$format = array(595.28,841.89); break;}
                        case 'A4': {$format = array(595.28,841.89); break;}
                        на php 7.1 ошибки в журнал сыплет, но функцию свою выполняет…
                    varanika
                    10 октября 2017, 10:46
                    0
                    Здравствуйте, можно ли использовать это приложение на frontend-e? Например для решение задачи по клику в карточке товара пользователем (не авторизированным в админке и желательно с капчей, чтобы не положили сервер или еще чего) формировать на лету пдф с описанием данного товара и текущей ценой?
                      Илья
                      19 января 2018, 11:56
                      0
                      Здравствуйте, на frontend-e для авторизованных пользователей есть статистика, собираемая сниппетом, и пишущая данные с свою таблицу в БД. Вашим компонентом можно сформировать PDF из этой статистики по определённым параметрам?(например по дате, по пользователю и т.д.)
                        Володя
                        19 января 2018, 12:06
                        0
                        Компонент работает с любыми сниппетами и чанками.
                        Можно взять pdoResources и сделать нужную выборку.
                          Илья
                          19 января 2018, 12:08
                          0
                          Спасибо! А экспорт в эксель не планируется?
                            Володя
                            19 января 2018, 12:09
                            0
                            нет, пока не планируется.
                        Игорь Гришанов
                        07 мая 2018, 16:08
                        0
                        а можно как то скрыть вкладки Файлы экспорта которые образуются при установке компонента?
                        ну то есть эта вкладка нужна только на некоторых документах ( или шаблонах)
                          Андрей
                          07 мая 2018, 22:35
                          0
                          В системных настройках ExportPage есть параметр — Отключить у шаблонов.
                          Виталий Барышников
                          28 мая 2018, 17:09
                          0
                          Привет. Можно ли сохранить в PDF корзину? Т.е. то что выводит в Minishop'е сниппет msCart? Дать юзеру возможность сохранить свой корзинный список (а не заказ). Ну или хотел бы сотрудничества в этом направлении…
                            Володя
                            28 мая 2018, 18:16
                            0
                            Привет.
                            Можно, пример корзины с ссылкой
                            [[!exp.File.Request?
                            &tpl=`@INLINE <a href="[[+uri_request]]" >download the cart file</a>`
                            &resource=`16`
                            &set=`1`
                            &mode=`direct`
                            &type=`pdf`
                            &action=`files/request`
                            &real=`1`
                            ]]
                            
                            [[!msCart]]
                            [[!msOrder]]
                            [[!msGetOrder]]
                            где 16 идентификатор страницы с корзиной
                            Виталий Барышников
                            28 мая 2018, 17:44
                            0
                            Есть ещё pdfResource. В чём ключевые отличия?
                              Володя
                              28 мая 2018, 18:17
                              0
                              незнаю, не пользовался данным дополнением. Можно поставить на демо сайте и пощупать. Если бесплатное дополнение удовлетворяет вашим требованиям то зачем ставить платное?
                            perfkirill
                            25 сентября 2018, 11:15
                            0
                            Добрый день,

                            Подскажите по поводу крона.
                            Использую cronmanager, раньше делали просто из админки, но каталог слишком большой. И так раньше был чанк tpl.exp.create.row

                            в нем код
                            <h3>[[+pagetitle]]</h3>
                            
                            [[+content]]
                            
                            
                              [[!pdoPage?
                              &parents=`[[+id]]`
                            &element=`msProducts`
                            &limit=`800`
                              &tpl=`catalog_item_pdf`
                            &includeTVs=`fasovka`
                            &sortby=`menuindex`
                            &sortdir=`ASC`
                                ]]


                            Как мне сделать такое же вывод только из под крона?

                            Я сделал сниппет в нем написал
                            <?php
                            
                            define('MODX_API_MODE', true);
                            //require_once dirname(dirname(__FILE__)) . '/core/config/config.inc.php';
                            require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/config/config.inc.php';
                            require_once MODX_BASE_PATH . 'index.php';
                            // error
                            $modx->getService('error', 'error.modError');
                            $modx->getRequest();
                            $modx->setLogLevel(modX::LOG_LEVEL_ERROR);
                            $modx->setLogTarget('FILE');
                            $modx->error->message = null;
                            /** @var array $scriptProperties */
                            $scriptProperties = array();
                            $scriptProperties['returnIds'] = 1;
                            $scriptProperties['showLog'] = 1;
                            $scriptProperties['fastMode'] = 1;
                            $scriptProperties['limit'] = 10;
                            $scriptProperties['depth'] = 10;
                            $scriptProperties['parents'] = 0;
                            $scriptProperties['where'] = '{"class_key:IN":["msProduct","msCategory"]}';
                            // @var array $params */
                            $params = array();
                            $params['mode'] = 'url';
                            $params['sets'] = 1;
                            /** @var exportpage $exportpage */
                            if (!$exportpage = $modx->getService('exportpage', 'exportpage', $modx->getOption('exportpage_core_path', null, $modx->getOption('core_path') . 'components/exportpage/') . 'model/exportpage/', $scriptProperties)) {
                            	return 'Could not load exportpage class!';
                            }
                            $exportpage->initialize($modx->context->key, $scriptProperties);
                            /** @var modSnippet $snippet */
                            if ($snippet = $modx->getObject('modSnippet', array('name' => 'pdoResources'))) {
                            	$snippet->_cacheable = false;
                            	$snippet->_processed = false;
                            	$ids = $snippet->process($scriptProperties);
                            }
                            if (!empty($ids)) {
                            	$ids = explode(',', $ids);
                            	foreach($ids as $id) {
                            		$params['id'] = $id;
                            		if (!$response = $modx->runProcessor('web/files/request',
                            			$params,
                            			array(
                            				'processors_path' => $exportpage->config['processorsPath'],
                            			))
                            		) {
                            			$exportpage->printLog('[ExportPage] Could not create file:');
                            			$exportpage->printLog($params);
                            		}
                            		$modx->error->reset();
                            		$exportpage->printLog('[ExportPage] Generate for id='.$params['id']);
                            	}
                            }

                            Я так понимаю, что нужно 100% менять $scriptProperties['parents'] = 0; на свой id
                            Но вот вопрос:
                            1. это все, что нужно менять
                            2. куда будет генерироваться pdf (где ее искать)?
                              Володя
                              25 сентября 2018, 11:30
                              0
                              Добрый день.
                              Если вам нужно выполнить создание pdf файла для какого то конкретного ресурса то это примерно так
                              /** @var exportpage $exportpage */
                              if (!$exportpage = $modx->getService('exportpage', 'exportpage', $modx->getOption('exportpage_core_path', null, $modx->getOption('core_path') . 'components/exportpage/') . 'model/exportpage/', [])) {
                                  return 'Could not load exportpage class!';
                              }
                              
                              $params = [
                                  'mode' => 'url',
                                  'sets' => '1', //  id набора экспорта
                                  'id'   => '1', // id нужного ресурса
                              ];
                              
                              $modx->runProcessor('web/files/request', $params, ['processors_path' => $exportpage->config['processorsPath']]);
                              куда будет генерироваться pdf (где ее искать)?
                              pdf будет создан у того ресурса который вы и указали и появится в панельке — файлы экспорта
                              atrox
                              27 августа 2019, 12:02
                              0
                              Можете подсказать, я создал тестовый сайт на модхосте и установил ваш плагин
                              хотел сделать экспорт корзины
                              [[!exp.File.Request?
                              &tpl=`@INLINE <a href="[[+uri_request]]" >download the export file</a>`
                              &resource=`2`
                              &set=`1`
                              &mode=`direct`
                              &type=`pdf`
                              &action=`files/request`
                              &real=`1`
                              ]]
                              код взял выше тут же, но при клике в корзине, он делает редирект и пишет «Не разрешенный к экспорту шаблон документа» как исправить? спасибо заранее
                                atrox
                                27 августа 2019, 13:13
                                0
                                разобрался, не указал шаблон в системных настройках
                                Саша
                                28 января 2021, 22:44
                                0
                                Здравствуйте.
                                Возникла ошибка которую никак не могу решить.
                                Не генерирует pdf у товаров где в название слеш, например 4sto.by/katalog/legkovyie/podemniki/2-x-stoechnyie/avtopodemnik-dvuxstoechnyij-rossvik-v2-5.5l-g/p-5.5t,-380v/
                                Что это может быть?
                                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                  37