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


Публикации Zver

6 публикаций создано Zver (учитываются публикации только с 30-Март 23)


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

Отправлено от Zver в 27 Ноябрь 2017 - 09:11 in Разработчикам

Может кому пригодится...
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. не говорю что это конечный вариант... данная функция ещё будет мной дорабатываться, но это уже рабочий вариант. Боюсь что потом могу забыть поделиться, поэтому делюсь сейчас.



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

Отправлено от Zver в 22 Ноябрь 2017 - 08:23 in Разработчикам

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



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

Отправлено от Zver в 21 Ноябрь 2017 - 10:59 in Разработчикам

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



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

Отправлено от Zver в 15 Ноябрь 2017 - 09:36 in Разработчикам

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



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

Отправлено от Zver в 14 Ноябрь 2017 - 10:11 in Разработчикам

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



#32643 Встроенное API

Отправлено от Zver в 18 Февраль 2017 - 11:57 in Разработчикам

1. У меня не получается получить информацию о таблице при запросе
send_command_server($base_url . 'api/data/read', array(
   'access_id' => $access_id,
   'table_id' => 123,
   'cals' => false,
   'fields' => array(),
   'filter' => array('row' => array(
    'id' => array('term' => '=', 'value' => 0))
   ),
   'sort' => array(),
   'start' => 0,
   'limit' => 10
));
получаю ответ: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fields.id' in 'field list'. Причем текст ответа не меняется при изменении ID-таблицы. Данные из этой таблицы получить удаётся.
2. В ответ на запрос приходят все существующие поля, хотя в правах выставлен доступ только к некоторым. Возможна эта ошибка как то связана с первой.
3. Хочется чтобы появилась возможность создание пользовательского API?
4. Я так понял в фильтре еще не реализована ситуация когда term = in. Не хватает. :-(
send_command_server($base_url . 'api/data/read', array(
   'access_id' => $access_id,
   'table_id' => 123,
   'cals' => false,
   'fields' => array(),
   'filter' => array('row' => array(
   'status' => array('term' => '=', 'value' => 0, 'union' => 'and'),
    'id' => array('term' => 'in', 'value' => join(',', array(20, 21, 22, 216, 217, 218, 277, 278, 940))))
   ),
   'sort' => array(),
   'start' => 0,
   'limit' => 10
));