1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
27:
28: 29: 30:
31: class PHPWord_Template
32: {
33:
34: 35: 36: 37: 38:
39: private $_objZip;
40:
41: 42: 43: 44: 45:
46: private $_tempFileName;
47:
48: 49: 50: 51: 52:
53: private $_documentXML;
54:
55:
56: 57: 58: 59: 60:
61: public function __construct($strFilename)
62: {
63: $this->_tempFileName = tempnam(sys_get_temp_dir(), '');
64: if ($this->_tempFileName !== false) {
65:
66: if (!copy($strFilename, $this->_tempFileName)) {
67: throw new PHPWord_Exception('Could not copy the template from ' . $strFilename . ' to ' . $this->_tempFileName . '.');
68: }
69:
70: $this->_objZip = new ZipArchive();
71: $this->_objZip->open($this->_tempFileName);
72:
73: $this->_documentXML = $this->_objZip->getFromName('word/document.xml');
74: } else {
75: throw new PHPWord_Exception('Could not create temporary file with unique name in the default temporary directory.');
76: }
77: }
78:
79: 80: 81: 82: 83: 84:
85: public function setValue($search, $replace)
86: {
87: $pattern = '|\$\{([^\}]+)\}|U';
88: preg_match_all($pattern, $this->_documentXML, $matches);
89: foreach ($matches[0] as $value) {
90: $valueCleaned = preg_replace('/<[^>]+>/', '', $value);
91: $valueCleaned = preg_replace('/<\/[^>]+>/', '', $valueCleaned);
92: $this->_documentXML = str_replace($value, $valueCleaned, $this->_documentXML);
93: }
94:
95: if (substr($search, 0, 2) !== '${' && substr($search, -1) !== '}') {
96: $search = '${' . $search . '}';
97: }
98:
99: if (!is_array($replace)) {
100: if (!PHPWord_Shared_String::IsUTF8($replace)) {
101: $replace = utf8_encode($replace);
102: }
103: }
104:
105: $this->_documentXML = str_replace($search, $replace, $this->_documentXML);
106: }
107:
108: 109: 110:
111: public function getVariables()
112: {
113: preg_match_all('/\$\{(.*?)}/i', $this->_documentXML, $matches);
114: return $matches[1];
115: }
116:
117: 118: 119: 120: 121:
122: public function save($strFilename)
123: {
124: if (file_exists($strFilename)) {
125: unlink($strFilename);
126: }
127:
128: $this->_objZip->addFromString('word/document.xml', $this->_documentXML);
129:
130:
131: if ($this->_objZip->close() === false) {
132: throw new Exception('Could not close zip file.');
133: }
134:
135: rename($this->_tempFileName, $strFilename);
136: }
137: }