Сниппет конвертирования из modResource в MS Word

Сниппет способен формировать *.doc файлы на основе заголовка и текста указанной страницы.

Создаём сниппет под названием "modResource2Word":
<?php
// Сниппет формирования вордовского документа на основе ресурса MODX.... v0.02 Beta

$id = $_GET['rid'];
if($id=='') { return ''; }
$parents = $modx->getOption('parents', $scriptProperties, ''); // Список родителей.. разделитель запятая - ","
$folders = $modx->getOption('folders', $scriptProperties, 0); // Работать с контейнерами или нет (по умолчанию - нет)

// Получаем объект ресурса
$rObj = $modx->getObject('modResource', $id);

// Проверяем объект на существование
if(!is_object($rObj)) { return ''; }

$continue = true;

// Если указан список родителей, то проверяем является ли нас ресурс вложенным в них
if($parents!='') {
	$parents = explode(',', $parents);
	
	$continue = false;
	for($i=0; $i<count($parents); $i++)
	{
		$parentsArr = $modx->getParentIds($rObj->get('id'));
		if(in_array($parents[$i], $parentsArr)) {
			$continue = true;
		}
	}
}

// Пробиваем, не является ли наш ресурс контейнером
if(!$folders) {
	if($rObj->get('isfolder')) {
		$continue = false;
	}
}

if($continue) {

	$content = <<<HTML
	<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>
	<head>
		<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
		<title>Download Document</title>
		<!--[if gte mso 9]>
		<xml>
		<w:WordDocument>
		<w:View>Print</w:View>
		<w:Zoom>90</w:Zoom>
		<w:DoNotOptimizeForBrowser/>
		</w:WordDocument>
		</xml>
		<![endif]-->
		<style>
			<!-- /* Style Definitions */
			@page Section1 {size:8.5in 11.0in; margin:1.0in 1.25in 1.0in 1.25in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;}
			div.Section1 {page:Section1;} -->
		</style>
	</head>
	<body lang="RU-RU" style='tab-interval:.5in'>
HTML;
	$content .= '<h1>'.$rObj->get('pagetitle').'</h1><p> </p>';
	$content .= ''.$rObj->get('content').'';
	$content .= '</body></html>';
	
	header("Content-Type: application/msword");
	header("Content-disposition: attachment; filename=doc-".$id.".doc");
	
	echo $content;
}

В сниппете можно указать параметры:
&folders=`1` — это означает, что ресурсы с пометкой «контейнер» тоже обрабатывать (советую не ставить данный параметр, чтобы контейнеры не обрабатывал);
&parents=`24,29` — здесь можно указать id родителя, ресурсы которого будет обрабатывать, если указать id не из данного родителя, то сниппет не сформирует документ;

Создаём страницу с вызовом сниппета (шаблон ставим «пустой»), такого содержания:
[[!modResource2Word?]]

В нужном месте документа, который нужно скачать даём ссылку на нашу страницу с вызовом сниппета:
<a href="[[~idресурсасвызовомсниппета? &rid=`[[*id]]` ]]">Скачать</a>
Теперь при клике на ссылку «скачать» у нас должен сливаться файлик в формате *.doc с заголовком и текстом нашей страницы.

P.S.: Если есть какие-то глюки, прошу строго не судить… :)
Пашок
23 октября 2014, 10:52
modx.pro
1
2 193
+2

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

Володя
23 октября 2014, 15:08
0
И созданный таким образом файл корректно открывается для редактирования?
    Виталий Киреев
    23 октября 2014, 16:06
    0
    Не безопасно. Таким образом можно скачать любые страницы, а не только те, что укажете, просто заменив ?rid в адресе.
      Пашок
      Пашок
      23 октября 2014, 17:01
      0
      БлагоДарю! Добавил параметры «folders» и «parents»…
        Виталий Киреев
        23 октября 2014, 17:51
        0
        if($parents=='')

        вызовет замечание, что такой переменной не существует, если она не передана в сниппет. Правильнее писать:
        $parents = $modx->getOption('parents', $scriptProperties, '');
        $folders = $modx->getOption('folders', $scriptProperties, 0);
          Пашок
          Пашок
          23 октября 2014, 17:59
          0
          Понял, БлагоДарю!
      Николай
      23 октября 2014, 18:44
      -1
      Чего только не бывает. Из doc в pdf случаем не существует, а то вот понадобилось?
        Павел Левин
        31 октября 2014, 15:35
        0
        Другое, но подобное уже есть Save2Page. Правда у меня она работала криво и я не впечатлился, но факт наличия не скрыть =)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        7