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 $_cfgClient;
36:
37: 38: 39: 40:
41: protected $_lang;
42:
43: 44: 45: 46:
47: protected $_client;
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:
124: private function _renameFileAndDir($dir, $dirNameOld, $dirNameNew, $client) {
125: if (rename($dir . $dirNameOld, $dir . $dirNameNew) == false) {
126: return false;
127: }
128:
129: $this->_renameFiles($dir, $dirNameOld, $dirNameNew);
130:
131: return true;
132: }
133:
134: 135: 136: 137: 138: 139: 140:
141: private function _isExistInTable($alias, $idclient) {
142:
143: $oLayColl = new cApiLayoutCollection();
144: $ids = $oLayColl->getIdsByWhereClause("alias='" . $oLayColl->escape($alias) . "' AND idclient=" . (int) $idclient);
145: return (count($ids) > 0) ? true : false;
146: }
147:
148: 149: 150: 151: 152: 153: 154:
155: private function _renameFiles($dir, $oldLayoutName, $newLayoutName) {
156: if (cFileHandler::exists($dir . $newLayoutName . '/' . $oldLayoutName . '.html') == true) {
157: rename($dir . $newLayoutName . '/' . $oldLayoutName . '.html', $dir . $newLayoutName . '/' . $newLayoutName . '.html');
158: }
159: }
160:
161: 162: 163: 164: 165: 166:
167: public function setLastModified($timestamp, $idlay) {
168: $oLay = new cApiLayout((int) $idlay);
169: if ($oLay->isLoaded()) {
170: $oLay->set('lastmodified', date('Y-m-d H:i:s', $timestamp));
171: $oLay->store();
172: }
173: }
174:
175: 176: 177: 178:
179: private function _compareFileAndLayoutTimestamp() {
180:
181: $sql = sprintf("SELECT UNIX_TIMESTAMP(lastmodified) AS lastmodified, alias, name, description, idlay FROM %s WHERE idclient=%s", $this->_cfg['tab']['lay'], $this->_client);
182: $notification = new cGuiNotification();
183: $dir = $this->_cfgClient[$this->_client]['layout']['path'];
184:
185: $db = cRegistry::getDb();
186: $db->query($sql);
187: $retIdMod = 0;
188: while ($db->nextRecord()) {
189: $lastmodified = $db->f('lastmodified');
190:
191:
192: if (is_dir($dir . $db->f('alias') . '/')) {
193: if (cFileHandler::exists($dir . $db->f('alias') . '/' . $db->f('alias') . '.html')) {
194: $lastmodifiedLayout = filemtime($dir . $db->f('alias') . '/' . $db->f('alias') . '.html');
195:
196:
197: if ($lastmodified < $lastmodifiedLayout) {
198:
199: $this->setLastModified($lastmodifiedLayout, $db->f('idlay'));
200: $layout = new cLayoutHandler($db->f('idlay'), ' ', $this->_cfg, $this->_lang);
201:
202: conGenerateCodeForAllartsUsingLayout($db->f('idlay'));
203: $this->_outputMessage['info'][] = i18n("Synchronization successfully layout name: ") . $db->f('name');
204: }
205: }
206: } else {
207: $oLayout = new cApiLayout($db->f('idlay'));
208:
209: $layout = new cLayoutHandler($db->f('idlay'), '', $this->_cfg, $this->_lang);
210:
211: if ($oLayout->isInUse()) {
212:
213: $layout->saveLayout('');
214: $this->_outputMessage['info'][] = i18n("Synchronization successfully layout name made: ") . $db->f('name');
215: } else {
216:
217: if ($layout->eraseLayout()) {
218: layDeleteLayout($db->f('idlay'));
219: $this->_outputMessage['info'][] = i18n("Synchronization successfully layout deleted: ") . $db->f('name');
220: } else {
221: $this->_outputMessage['error'][] = i18n("Synchronization faild cold not delate layout: ") . $db->f('name');
222: }
223: }
224: }
225: }
226: }
227:
228: 229:
230: private function _showOutputMessage() {
231: $emptyMessage = true;
232: $notification = new cGuiNotification();
233: foreach ($this->_outputMessage as $typ) {
234: foreach ($typ as $message) {
235: $emptyMessage = false;
236:
237: $notification->displayNotification($typ, $message);
238: }
239: }
240: if ($emptyMessage) {
241: $notification->displayNotification('info', i18n("Synchronization successfully!"));
242: }
243: }
244:
245: 246: 247: 248: 249: 250:
251: private function _isValidFirstChar($file) {
252: return (!(substr($file, 0, 1) == '.'));
253: }
254:
255: 256: 257: 258: 259: 260:
261: public function synchronize() {
262:
263: $this->_compareFileAndLayoutTimestamp();
264:
265:
266: $dir = $this->_cfgClient[$this->_client]['layout']['path'];
267:
268:
269: if (!is_dir($dir)) {
270: return false;
271: }
272:
273: if (false !== $dh = opendir($dir)) {
274: while (false !== $file = readdir($dh)) {
275:
276:
277:
278: if (!$this->_isValidFirstChar($file)) {
279: continue;
280: }
281:
282:
283: if (false === is_dir($dir . $file . "/")) {
284: continue;
285: }
286:
287: $newFile = strtolower(cApiStrCleanURLCharacters($file));
288:
289: if ($newFile == $file) {
290:
291: $this->_addOrUpdateLayout($dir, $file, $newFile, $this->_client);
292: } else {
293:
294: if (is_dir($dir . $newFile) && strtolower($file) != $newFile) {
295:
296:
297: $newDirName = $newFile . substr(md5(time() . rand(0, time())), 0, 4);
298:
299: if ($this->_renameFileAndDir($dir, $file, $newDirName, $this->_client) != false) {
300: $this->_addOrUpdateLayout($dir, $file, $newDirName, $this->_client);
301: }
302: } else {
303:
304:
305: if ($this->_renameFileAndDir($dir, $file, $newFile, $this->_client) != false) {
306: $this->_addOrUpdateLayout($dir, $file, $newFile, $this->_client);
307: }
308: }
309: }
310: }
311:
312:
313: closedir($dh);
314: }
315:
316: $this->_showOutputMessage();
317: }
318: }
319:
320: ?>