Перейти к содержимому


Чем Вы выполняете компилирование шаблона Word

template word

Сообщений в теме: 8

#1 Zver

    Активный участник

  • Пользователи
  • PipPipPip
  • 80 сообщений

Отправлено 14 Ноябрь 2017 - 10:11

Появилась задача скомпилировать шаблон в документ Word.
Воспользоваться функцией send_template не получится. По этому решено написать самому. Существует много библиотек для решения этой задачи, но в КБ какая-то уже есть. К сожалению, реализация функция send_template находится в одном из зашифрованных файлов. Прошу Вас сказать какая библиотека используется в КБ для создания Word-документов, чтобы не добавлять лишних библиотек.

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 519 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 14 Ноябрь 2017 - 12:31

https://clientbase.r...indpost&p=32667 функция form_template

#3 Zver

    Активный участник

  • Пользователи
  • PipPipPip
  • 80 сообщений

Отправлено 15 Ноябрь 2017 - 09:36

Инструкция по функциям шикарная!
Но меня интересует какую библиотеку для формировании документа вы используете в этой функции? Или Вы сами реализовали формирование документа? Есть несколько ограничений которые не дают реализовать через стандартные шаблоны.

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 519 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 15 Ноябрь 2017 - 10:29

Конкретно для Word реализация самописная, сторонняя библиотека не используется, в отличие например от Excel шаблонов. Реализовывал не я, если что.

#5 Zver

    Активный участник

  • Пользователи
  • PipPipPip
  • 80 сообщений

Отправлено 21 Ноябрь 2017 - 10:59

Пытаюсь сам реализовать такой функционал... Столкнулся с такой проблемой. Разархивировал документ и заархивировал, после этого MS Word ругается, что документ повреждён. Для работы с архивом использую класс ZipArchive. Подскажите, как Вы работаете с вордовскими документами.

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 519 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Ноябрь 2017 - 14:12

Насколько вижу по коду, конкретно для архивации используется не ZipArchive, а отдельная библиотека, из-за некоторых особенностей файла, вот кусок кода:

// Добавляем файл/директрию в архив
// Если файл mimetype, то его нельзя сжимать - уровень компрессии 0
require_once $config['site_path'] . "/include/zlib/zip.lib.php";
$zip = new zipfile();
$zip->addFile($data, $filename, time(), $filename == 'mimetype' ? 0 : -1);

ZipArchive не поддерживает выбор компрессии, видимо из-за этого у вас проблема.

#7 Zver

    Активный участник

  • Пользователи
  • PipPipPip
  • 80 сообщений

Отправлено 22 Ноябрь 2017 - 08:23

Не понял какой файл нельзя сжимать. Файла с именем mimetype нет внутри архива.

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 519 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Ноябрь 2017 - 09:13

К сожалению подробностей сам не знаю, т.к. делал не я, а спросить не у кого (автор кода давно у нас не работает).

#9 Zver

    Активный участник

  • Пользователи
  • PipPipPip
  • 80 сообщений

Отправлено 27 Ноябрь 2017 - 09:11

Может кому пригодится...
function compile_template($template_file, $output_file, $data) {
  $tmp_file_name = tempnam(sys_get_temp_dir(), 'tmp_php_');
  copy($template_file, $tmp_file_name);
  $zip = new ZipArchive();
  if ($zip->open($tmp_file_name)) {
   $settings_content = $zip->getFromName('word/settings.xml');
   $settings = new SimpleXMLElement($settings_content);
   $doc_vars = $settings->{'w:docVars'};
   if (!$doc_vars) {
    $doc_vars = $settings->addChild('w:docVars');
   }
   foreach ($data as $key => $value) {
    $child = $doc_vars->addChild('w:docVar');
    $child->addAttribute('w:name', $key, 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
    $child->addAttribute('w:val', $value, 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
   }
   $update_fields = $settings->{'w:updateFields'};
   if (!$update_fields) {
    $update_fields = $settings->addChild('w:updateFields');
   }
   $update_fields->addAttribute('w:val', 'true', 'http://schemas.openxmlformats.org/wordprocessingml/2006/main');
   $zip->deleteName('word/settings.xml');
   $zip->addFromString('word/settings.xml', $settings->asXML());
  }
  $zip->close();
  if ($output_file == 'php://output') {
   header('Cache-Control: max-age=0');
   header('Content-Description: File Transfer');
   header('Content-Transfer-Encoding: binary');
   header('Content-Length: ' . filesize($tmp_file_name));
   readfile($tmp_file_name);
  }
  else {
   file_put_contents($output_file, file_get_contents($tmp_file_name));
  }
  unlink($tmp_file_name);
}
использование
// Для того чтобы скачать скомпилированный шаблон
header('Content-Disposition: attachment; filename="Договор.docx"');
compile_template('document.docx', 'php://output', array('ID' => '123'));
// или если необходимо сохранить на сервере
compile_template('document.docx', 'compiled_document.docx', array('ID' => '123'));

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





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных