docxGenerator.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. <?php
  2. //Класс, генерирующий docx-файлы на базе шаблонов
  3. class docxGenerator {
  4. private $_zipObject; //Для открытия zip-архива
  5. private $_tmpFilename; //Имя временного файла, создаваемого при работе класса
  6. private $_docxContent; //Хранит содержимое ./word/document.xml
  7. public function __construct($filename){
  8. //Конструтор класса, берет шаблон $filename
  9. //1) Создаем копию шаблона для безопасной работы
  10. $this->_tmpFilename = dirname($filename).time().'.docx'; // Функция dirname извлекает путь к каталогу с файлом filename
  11. copy($filename, $this->_tmpFilename); // Копируем содержимое шаблона во временный файл
  12. //2) С помощью встроенного в PHP класса вытаскиваем содержимое
  13. $this->_zipObject = new ZipArchive(); //Создали экземпляр класса для работы с Zip-архивом
  14. $this->_zipObject->open($this->_tmpFilename); //Открыли временный файл архиватором, т.к. docx - это и есть архив
  15. $this->_docxContent = $this->_zipObject->getFromName('word/document.xml'); //Вытащили текст документа с разметкой из файла ./word/document.xml внутри архива
  16. }//__construct
  17. public function val($search, $replace) {
  18. //Функция замены меток с названием $search на значение $replace
  19. $search = '&amp;'.$search.';'; //Прибавляем амперсанд в виде специального символа и точку с запятой
  20. $this->_docxContent = str_ireplace($search, $replace, $this->_docxContent); //Собственно процесс замены это обычная замена подстрок в текстовом документе
  21. }//val
  22. public function save($filename){
  23. //Сохраняет полученный из шаблона файл с именем $filename. Существующие файлы перезаписываются.
  24. //1) Если файл $filename уже существует, то нужно его удалить
  25. if(file_exists($filename)){
  26. unlink($filename);
  27. }//if file_exists
  28. //2) Дописываем измененное xml-содержимое в документ
  29. $this->_zipObject->addFromString('word/document.xml', $this->_docxContent);
  30. //3) Пытаемся сохранить изменения
  31. if($this->_zipObject->close() === false){
  32. throw new Exception('Не удалось сохранить изменения в документе.');
  33. }//if close
  34. rename($this->_tmpFilename, $filename);
  35. }//save
  36. }
  37. ?>