1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
15: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
16:
17: 18: 19: 20: 21: 22:
23: class cLayoutSynchronizer {
24:
25: 26: 27: 28:
29: protected $_cfg;
30:
31: 32: 33: 34:
35: protected $_lang;
36:
37: 38: 39: 40:
41: protected $_client;
42:
43: 44: 45: 46:
47: protected $_cfgClient;
48:
49: 50: 51: 52:
53: private $_outputMessage = array();
54:
55: 56: 57: 58: 59: 60: 61:
62: public function __construct($cfg, $cfgClient, $lang, $client) {
63: $this->_cfg = $cfg;
64: $this->_cfgClient = $cfgClient;
65: $this->_lang = $lang;
66: $this->_client = $client;
67: }
68:
69: 70: 71: 72: 73: 74: 75: 76:
77: private function _addOrUpdateLayout($dir, $oldLayoutName, $newLayoutName, $idclient) {
78:
79: if ($this->_isExistInTable($oldLayoutName, $idclient) == false) {
80:
81: $layoutCollection = new cApiLayoutCollection();
82: $layoutCollection->create($newLayoutName, $idclient, $newLayoutName);
83:
84:
85: if (!cFileHandler::exists($dir . $newLayoutName . '/' . $newLayoutName . '.html')) {
86: cFileHandler::write($dir . $newLayoutName . '/' . $newLayoutName . '.html', '');
87: }
88:
89:
90: $this->_outputMessage['info'][] = sprintf(i18n("Synchronization successfully layout name: %s"), $newLayoutName);
91: } else {
92:
93: if ($oldLayoutName != $newLayoutName) {
94: $this->_updateModulnameInDb($oldLayoutName, $newLayoutName, $idclient);
95: }
96: }
97: }
98:
99: 100: 101: 102: 103: 104: 105:
106: private function _updateModulnameInDb($oldName, $newName, $idclient) {
107: $oLayColl = new cApiLayoutCollection();
108: $oLayColl->select("alias='" . $oLayColl->escape($oldName) . "' AND idclient=" . (int) $idclient);
109: if (false !== $oLay = $oLayColl->next()) {
110: $oLay->set('alias', $newName);
111: $oLay->store();
112: }
113: }
114:
115: 116: 117: 118: 119: 120: 121: 122:
123: private function _renameFileAndDir($dir, $dirNameOld, $dirNameNew, $client) {
124: if (rename($dir . $dirNameOld, $dir . $dirNameNew) == false) {
125: return false;
126: }
127:
128: $this->_renameFiles($dir, $dirNameOld, $dirNameNew);
129:
130: return true;
131: }
132:
133: 134: 135: 136: 137: 138:
139: private function _isExistInTable($alias, $idclient) {
140:
141: $oLayColl = new cApiLayoutCollection();
142: $ids = $oLayColl->getIdsByWhereClause("alias='" . $oLayColl->escape($alias) . "' AND idclient=" . (int) $idclient);
143: return (count($ids) > 0)? true : false;
144: }
145:
146: 147: 148: 149: 150: 151: 152:
153: private function _renameFiles($dir, $oldLayoutName, $newLayoutName) {
154: if (cFileHandler::exists($dir . $newLayoutName . '/' . $oldLayoutName . '.html') == true) {
155: rename($dir . $newLayoutName . '/' . $oldLayoutName . '.html', $dir . $newLayoutName . '/' . $newLayoutName . '.html');
156: }
157: }
158:
159: 160: 161: 162: 163: 164:
165: public function setLastModified($timestamp, $idlay) {
166: $oLay = new cApiLayout((int) $idlay);
167: if ($oLay->isLoaded()) {
168: $oLay->set('lastmodified', date('Y-m-d H:i:s', $timestamp));
169: $oLay->store();
170: }
171: }
172:
173: 174: 175: 176:
177: private function _compareFileAndLayoutTimestamp() {
178:
179: $sql = sprintf("SELECT UNIX_TIMESTAMP(lastmodified) AS lastmodified, alias, name, description, idlay FROM %s WHERE idclient=%s", $this->_cfg['tab']['lay'], $this->_client);
180: $notification = new cGuiNotification();
181: $dir = $this->_cfgClient[$this->_client]['layout']['path'];
182:
183: $db = cRegistry::getDb();
184: $db->query($sql);
185: $retIdMod = 0;
186: while ($db->nextRecord()) {
187: $lastmodified = $db->f('lastmodified');
188:
189:
190: if (is_dir($dir . $db->f('alias') . '/')) {
191: if (cFileHandler::exists($dir . $db->f('alias') . '/' . $db->f('alias') . '.html')) {
192: $lastmodifiedLayout = filemtime($dir . $db->f('alias') . '/' . $db->f('alias') . '.html');
193:
194:
195: if ($lastmodified < $lastmodifiedLayout) {
196:
197: $this->setLastModified($lastmodifiedLayout, $db->f('idlay'));
198: $layout = new cLayoutHandler($db->f('idlay'), ' ', $this->_cfg, $this->_lang);
199:
200: conGenerateCodeForAllartsUsingLayout($db->f('idlay'));
201: $this->_outputMessage['info'][] = i18n("Synchronization successfully layout name: ") . $db->f('name');
202: }
203: }
204: } else {
205: $oLayout = new cApiLayout($db->f('idlay'));
206:
207: $layout = new cLayoutHandler($db->f('idlay'), '', $this->_cfg, $this->_lang);
208:
209: if ($oLayout->isInUse()) {
210:
211: $layout->saveLayout('');
212: $this->_outputMessage['info'][] = i18n("Synchronization successfully layout name made: ") . $db->f('name');
213: } else {
214:
215: if ($layout->eraseLayout()) {
216: layDeleteLayout($db->f('idlay'));
217: $this->_outputMessage['info'][] = i18n("Synchronization successfully layout deleted: ") . $db->f('name');
218: } else {
219: $this->_outputMessage['error'][] = i18n("Synchronization faild cold not delate layout: ") . $db->f('name');
220: }
221: }
222: }
223: }
224: }
225:
226: private function _showOutputMessage() {
227: $emptyMessage = true;
228: $notification = new cGuiNotification();
229: foreach ($this->_outputMessage as $typ) {
230: foreach ($typ as $message) {
231: $emptyMessage = false;
232:
233: $notification->displayNotification($typ, $message);
234: }
235: }
236: if ($emptyMessage) {
237: $notification->displayNotification('info', i18n("Synchronization successfully!"));
238: }
239: }
240:
241: 242: 243: 244: 245: 246:
247: private function _isValidFirstChar($file) {
248: return (!(substr($file, 0, 1) == '.'));
249: }
250:
251: 252: 253: 254:
255: public function synchronize() {
256:
257: $this->_compareFileAndLayoutTimestamp();
258:
259:
260: $dir = $this->_cfgClient[$this->_client]['layout']['path'];
261:
262:
263: if (!is_dir($dir)) {
264: return false;
265: }
266:
267: if (false !== $dh = opendir($dir)) {
268: while (false !== $file = readdir($dh)) {
269:
270:
271:
272: if (!$this->_isValidFirstChar($file)) {
273: continue;
274: }
275:
276:
277: if (false === is_dir($dir . $file . "/")) {
278: continue;
279: }
280:
281: $newFile = strtolower(cApiStrCleanURLCharacters($file));
282:
283: if ($newFile == $file) {
284:
285: $this->_addOrUpdateLayout($dir, $file, $newFile, $this->_client);
286: } else {
287:
288: if (is_dir($dir . $newFile) && strtolower($file) != $newFile) {
289:
290:
291: $newDirName = $newFile . substr(md5(time() . rand(0, time())), 0, 4);
292:
293: if ($this->_renameFileAndDir($dir, $file, $newDirName, $this->_client) != false) {
294: $this->_addOrUpdateLayout($dir, $file, $newDirName, $this->_client);
295: }
296: } else {
297:
298:
299: if ($this->_renameFileAndDir($dir, $file, $newFile, $this->_client) != false) {
300: $this->_addOrUpdateLayout($dir, $file, $newFile, $this->_client);
301: }
302: }
303: }
304: }
305:
306:
307: closedir($dh);
308: }
309:
310: $this->_showOutputMessage();
311: }
312:
313: }
314:
315: ?>