1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
16:
17: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
18:
19: 20: 21: 22: 23: 24: 25: 26: 27:
28: class cModuleHandler {
29:
30: 31: 32: 33: 34:
35: private $_modulePath;
36:
37: 38: 39: 40: 41:
42: private $_path;
43:
44: 45: 46: 47: 48:
49: protected $_idmod = NULL;
50:
51: 52: 53: 54: 55:
56: private $_moduleName = NULL;
57:
58: 59: 60: 61: 62:
63: protected $_description;
64:
65: 66: 67: 68: 69:
70: protected $_type;
71:
72: 73: 74: 75: 76:
77: protected $_moduleAlias;
78:
79: 80: 81: 82: 83:
84: protected $_directories = array(
85: 'css' => 'css/',
86: 'js' => 'js/',
87: 'template' => 'template/',
88: 'image' => 'image/',
89: 'lang' => 'lang/',
90: 'php' => 'php/'
91: );
92:
93: 94: 95: 96: 97:
98: protected $_cfg = NULL;
99:
100: 101: 102: 103: 104:
105: protected $_cfgClient = NULL;
106:
107: 108: 109: 110: 111:
112: protected $_client = '0';
113:
114: 115: 116: 117: 118:
119: protected $_input = '';
120:
121: 122: 123: 124: 125:
126: protected $_output = '';
127:
128: 129: 130: 131: 132:
133: protected $_encoding = '';
134:
135: 136: 137: 138: 139: 140:
141: protected $_fileEncoding = '';
142:
143: 144: 145: 146: 147:
148: protected $_idlang = -1;
149:
150: 151: 152: 153:
154: private $_db = NULL;
155:
156: 157: 158: 159:
160: protected static $_encodingStore = array();
161:
162:
163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174:
175: public function __construct($idmod = NULL) {
176: global $cfg, $cfgClient, $lang, $client;
177: $this->_cfg = $cfg;
178: $this->_client = $client;
179: $this->_cfgClient = $cfgClient;
180: $this->_idlang = $lang;
181: $this->_encoding = self::getEncoding();
182: $this->_fileEncoding = getEffectiveSetting('encoding', 'file_encoding', 'UTF-8');
183:
184: $this->_db = cRegistry::getDb();
185:
186: $this->_idmod = $idmod;
187:
188: $this->_initByModule($idmod);
189:
190: if ($this->_makeModuleDirectory() == false) {
191: throw new cException('Can not create main module directory.');
192: }
193: }
194:
195: public static function getEncoding($overrideLanguageId = 0) {
196: $lang = cRegistry::getLanguageId();
197:
198: if ((int) $overrideLanguageId != 0) {
199: $lang = $overrideLanguageId;
200: }
201:
202: if ((int) $lang == 0) {
203: $clientId = cRegistry::getClientId();
204:
205: $clientsLangColl = new cApiClientLanguageCollection();
206: $clientLanguages = $clientsLangColl->getLanguagesByClient($clientId);
207: sort($clientLanguages);
208:
209: if (isset($clientLanguages[0]) && (int) $clientLanguages[0] != 0) {
210: $lang = $clientLanguages[0];
211: }
212: }
213:
214: if (!isset(self::$_encodingStore[$lang])) {
215: $cApiLanguage = new cApiLanguage($lang);
216: self::$_encodingStore[$lang] = $cApiLanguage->get('encoding');
217: }
218:
219: return self::$_encodingStore[$lang];
220: }
221:
222: 223: 224: 225: 226: 227:
228: public function modulePathExistsInDirectory($name) {
229: return is_dir($this->_cfgClient[$this->_client]['module']['path'] . $name . '/');
230: }
231:
232: 233: 234: 235: 236: 237: 238: 239: 240:
241: public function saveContentToFile($templateName, $fileType, $fileContent, $saveDirectory = 'cache') {
242: $sSaveDirectory = $this->_cfgClient[$this->_client]['path']['frontend'] . $saveDirectory . '/';
243: if (!is_dir($sSaveDirectory)) {
244: return false;
245: }
246:
247: $templateName = str_replace(' ', '_', $templateName);
248: $templateName = strtolower($templateName);
249: $fileOperation = cFileHandler::write($sSaveDirectory . $templateName . '.' . $fileType, $fileContent);
250: if ($fileOperation === false) {
251: return false;
252: }
253: $url = $this->_cfgClient[$this->_client]['path']['htmlpath'] . $saveDirectory . '/' . $templateName . '.' . $fileType;
254:
255:
256: $url = str_replace('http://', '//', $url);
257:
258: return $url;
259: }
260:
261: 262: 263: 264: 265: 266:
267: public static function getCleanName($name, $defaultChar = '_') {
268:
269: $name = cApiStrCleanURLCharacters($name);
270:
271: $firstChar = substr($name, 0, 1);
272: if (!preg_match('/^[a-zA-Z0-9]|_|-$/', $firstChar)) {
273:
274: $name = $defaultChar . substr($name, 1);
275: }
276:
277: return $name;
278: }
279:
280: 281: 282: 283: 284: 285:
286: public function initWithDatabaseRow($db) {
287: if (is_object($db)) {
288: $this->_initByModule($db->f('idmod'));
289: }
290: }
291:
292: 293: 294: 295: 296:
297: protected function _initByModule($idmod = NULL) {
298: if ((int) $idmod == 0) {
299: return;
300: }
301:
302: $cApiModule = new cApiModule($idmod);
303:
304: if ($cApiModule->virgin == false) {
305: $this->_idmod = $idmod;
306: $this->_client = $cApiModule->get('idclient');
307: $this->_description = $cApiModule->get('description');
308: $this->_type = $cApiModule->get('type');
309: $this->_input = '';
310: $this->_output = '';
311:
312: $this->_moduleAlias = $cApiModule->get('alias');
313: $this->_moduleName = $cApiModule->get('name');
314: $this->_path = $this->_cfgClient[$this->_client]['module']['path'];
315: $this->_modulePath = $this->_path . $this->_moduleAlias . '/';
316: }
317: }
318:
319: 320: 321: 322: 323:
324: public function getModulePath() {
325: return $this->_modulePath;
326: }
327:
328: 329: 330: 331: 332: 333: 334: 335:
336: public function getTemplatePath($file = '') {
337: return $this->_modulePath . $this->_directories['template'] . $file;
338: }
339:
340: 341: 342: 343: 344:
345: public function getCssPath() {
346: return $this->_modulePath . $this->_directories['css'];
347: }
348:
349: 350: 351: 352: 353:
354: public function getPhpPath() {
355: return $this->_modulePath . $this->_directories['php'];
356: }
357:
358: 359: 360: 361: 362:
363: public function getJsPath() {
364: return $this->_modulePath . $this->_directories['js'];
365: }
366:
367: 368: 369: 370: 371:
372: public function getCssFileName() {
373: return $this->_moduleAlias . '.css';
374: }
375:
376: 377: 378: 379: 380: 381:
382: protected function getRandomCharacters($count) {
383: $micro1 = microtime();
384: $rand1 = rand(0, time());
385: $rand2 = rand(0, time());
386: return substr(md5($micro1 . $rand1 . $rand2), 0, $count);
387: }
388:
389: 390: 391: 392: 393: 394:
395: public function existFile($type, $fileName) {
396: return cFileHandler::exists($this->_modulePath . $this->_directories[$type] . $fileName);
397: }
398:
399: 400: 401: 402: 403: 404:
405: public function deleteFile($type, $fileName) {
406: if ($this->existFile($type, $fileName)) {
407: return unlink($this->_modulePath . $this->_directories[$type] . $fileName);
408: } else {
409: return false;
410: }
411: }
412:
413: 414: 415: 416: 417: 418: 419:
420: public function createModuleFile($type, $fileName = NULL, $content = '') {
421:
422: if (!$this->createModuleDirectory($type)) {
423: return false;
424: }
425:
426:
427: if ($fileName == NULL || $fileName == '') {
428: $fileName = $this->_moduleAlias;
429:
430: if ($type == 'template') {
431: $fileName = $fileName . '.html';
432: } else {
433: $fileName = $fileName . '.' . $type;
434: }
435: }
436:
437:
438: if ($type == 'css' || $type == 'js' || $type == 'template') {
439: if (!$this->existFile($type, $fileName)) {
440: $content = iconv($this->_encoding, $this->_fileEncoding, $content);
441: if (!$this->isWritable($this->_modulePath . $this->_directories[$type] . $fileName, $this->_modulePath . $this->_directories[$type])) {
442: return false;
443: }
444:
445: if (cFileHandler::write($this->_modulePath . $this->_directories[$type] . $fileName, $content) === false) {
446: $notification = new cGuiNotification();
447: $notification->displayNotification('error', i18n("Can't make file: ") . $fileName);
448: return false;
449: }
450: } elseif ($content != '') {
451: $content = iconv($this->_encoding, $this->_fileEncoding, $content);
452: if (!$this->isWritable($this->_modulePath . $this->_directories[$type] . $fileName, $this->_modulePath . $this->_directories[$type])) {
453: return false;
454: }
455: if (cFileHandler::write($this->_modulePath . $this->_directories[$type] . $fileName, $content) === false) {
456: $notification = new cGuiNotification();
457: $notification->displayNotification('error', i18n("Can't make file: ") . $fileName);
458: return false;
459: }
460: }
461: } else {
462: return false;
463: }
464:
465: return true;
466: }
467:
468: 469: 470: 471: 472: 473: 474: 475:
476: public function renameModuleFile($type, $oldFileName, $newFileName) {
477: if ($this->existFile($type, $newFileName)) {
478: return false;
479: }
480:
481: if (!$this->existFile($type, $oldFileName)) {
482: return false;
483: }
484:
485: return rename($this->_modulePath . $this->_directories[$type] . $oldFileName, $this->_modulePath . $this->_directories[$type] . $newFileName);
486: }
487:
488: 489: 490: 491: 492:
493: public function getJsFileName() {
494: return $this->_moduleAlias . '.js';
495: }
496:
497: 498: 499: 500: 501: 502:
503: public function getFilesContent($directory, $fileTyp, $fileName = NULL) {
504: if ($fileName == NULL) {
505: $fileName = $this->_moduleAlias . '.' . $fileTyp;
506: }
507:
508: if ($this->existFile($directory, $fileName)) {
509: $content = cFileHandler::read($this->_modulePath . $this->_directories[$directory] . $fileName);
510: $content = iconv($this->_fileEncoding, $this->_encoding . '//IGNORE', $content);
511: return $content;
512: }
513:
514: return false;
515: }
516:
517: 518: 519: 520: 521:
522: protected function _makeModuleDirectory() {
523:
524: if ((int) $this->_client == 0) {
525: return true;
526: }
527:
528: $sMainModuleDirectory = $this->_cfgClient[$this->_client]['module']['path'];
529:
530:
531: if (!is_dir($sMainModuleDirectory) && $sMainModuleDirectory != NULL) {
532: if (mkdir($sMainModuleDirectory, 0777, true) == false) {
533: return false;
534: } else {
535: cFileHandler::setDefaultDirPerms($sMainModuleDirectory);
536: }
537: }
538:
539: return true;
540: }
541:
542: 543: 544: 545: 546: 547:
548: public function getAllFilesFromDirectory($moduleDirectory) {
549: $retArray = array();
550: $dir = $this->_modulePath . $this->_directories[$moduleDirectory];
551:
552: if (is_dir($dir)) {
553: if ($dh = opendir($dir)) {
554: while (($file = readdir($dh)) !== false) {
555:
556: if ($file != '..' && $file != '.' && !is_dir($dir . $file . '/')) {
557: $retArray[] = $file;
558: }
559: }
560: }
561: }
562: return $retArray;
563: }
564:
565: 566: 567: 568: 569:
570: public function changeModuleName($name) {
571: $this->_moduleAlias = $name;
572: $this->_modulePath = $this->_path . $this->_moduleAlias . '/';
573: }
574:
575: 576: 577: 578: 579: 580:
581: public function eraseModule() {
582: global $area, $frame;
583: $cfg = cRegistry::getConfig();
584: $cfgClient = cRegistry::getClientConfig();
585: $db = cRegistry::getDb();
586: $client = cRegistry::getClientId();
587:
588: $moduleVersion = new cVersionModule($this->_idmod, $cfg, $cfgClient, $db, $client, $area, $frame);
589: $success = true;
590: if (count($moduleVersion->getRevisionFiles()) > 0 && !$moduleVersion->deleteFile()) {
591: $success = false;
592: }
593:
594: return $success && cFileHandler::recursiveRmdir($this->_modulePath);
595: }
596:
597: 598: 599: 600: 601:
602: public function readInput($issource = false) {
603: if (cFileHandler::exists($this->_modulePath . $this->_directories['php'] . $this->_moduleAlias . '_input.php') == false) {
604: return false;
605: }
606:
607: $content = cFileHandler::read($this->_modulePath . $this->_directories['php'] . $this->_moduleAlias . '_input.php');
608:
609: if ($issource == true) {
610: $content = conHtmlentities($content);
611: }
612:
613: return iconv($this->_fileEncoding, $this->_encoding . '//IGNORE', $content);
614: }
615:
616: 617: 618: 619: 620:
621: public function readOutput($issource = false) {
622: if (cFileHandler::exists($this->_modulePath . $this->_directories['php'] . $this->_moduleAlias . '_output.php') == false) {
623: return false;
624: }
625:
626: $content = cFileHandler::read($this->_modulePath . $this->_directories['php'] . $this->_moduleAlias . '_output.php');
627:
628: if ($issource == true) {
629: $content = conHtmlentities($content);
630: }
631:
632: return iconv($this->_fileEncoding, $this->_encoding . '//IGNORE', $content);
633: }
634:
635: 636: 637: 638: 639:
640: protected function createModuleDirectory($type) {
641: if (array_key_exists($type, $this->_directories)) {
642: if (!is_dir($this->_modulePath . $this->_directories[$type])) {
643: if (@mkdir($this->_modulePath . $this->_directories[$type]) == false) {
644: return false;
645: }
646: else
647: cFileHandler::setDefaultDirPerms($this->_modulePath . $this->_directories[$type]);
648: } else {
649: return true;
650: }
651: }
652:
653: return true;
654: }
655:
656: 657: 658: 659: 660: 661: 662:
663: public function isWritable($fileName, $directory) {
664: if (cFileHandler::exists($fileName)) {
665: if (!is_writable($fileName)) {
666: return false;
667: }
668: } else {
669: if (!is_writable($directory)) {
670: return false;
671: }
672: }
673: return true;
674: }
675:
676: 677: 678: 679: 680: 681:
682: public function moduleWriteable($type) {
683: if (!cFileHandler::writeable($this->_modulePath . $this->_directories[$type])) {
684: return false;
685: } else {
686: return true;
687: }
688: }
689:
690: 691: 692: 693: 694: 695: 696:
697: public function saveOutput($output = NULL) {
698: $fileName = $this->_modulePath . $this->_directories['php'] . $this->_moduleAlias . '_output.php';
699:
700: if (!$this->createModuleDirectory('php') || !$this->isWritable($fileName, $this->_modulePath . $this->_directories['php'])) {
701: return false;
702: }
703:
704: if ($output == NULL) {
705: $output = $this->_output;
706: }
707:
708: $output = iconv($this->_encoding, $this->_fileEncoding, $output);
709:
710: $fileOperation = cFileHandler::write($fileName, $output);
711:
712: if ($fileOperation === false) {
713: return false;
714: } else {
715: cFileHandler::setDefaultFilePerms($fileName);
716: return true;
717: }
718: }
719:
720: 721: 722: 723: 724: 725: 726:
727: public function saveInput($input = NULL) {
728: $fileName = $this->_modulePath . $this->_directories['php'] . $this->_moduleAlias . '_input.php';
729:
730: if (!$this->createModuleDirectory('php') || !$this->isWritable($fileName, $this->_modulePath . $this->_directories['php'])) {
731: return false;
732: }
733:
734: if ($input == NULL) {
735: $input = $this->_input;
736: }
737:
738: $input = iconv($this->_encoding, $this->_fileEncoding, $input);
739:
740: $fileOperation = cFileHandler::write($fileName, $input);
741:
742: if ($fileOperation === false) {
743: return false;
744: } else {
745: cFileHandler::setDefaultFilePerms($fileName);
746: return true;
747: }
748: }
749:
750: 751: 752: 753: 754: 755: 756: 757: 758:
759: public function saveInfoXML($moduleName = NULL, $description = NULL, $type = NULL, $alias = NULL) {
760: if ($moduleName == NULL) {
761: $moduleName = $this->_moduleName;
762: }
763:
764: if ($description == NULL) {
765: $description = $this->_description;
766: }
767:
768: if ($type == NULL) {
769: $type = $this->_type;
770: }
771:
772: if ($alias == NULL) {
773: $alias = $this->_moduleAlias;
774: }
775:
776: $oWriter = new cXmlWriter();
777: $oRootElement = $oWriter->addElement('module', '', null);
778:
779: $oWriter->addElement('name', conHtmlSpecialChars($moduleName), $oRootElement);
780: $oWriter->addElement('description', conHtmlSpecialChars($description), $oRootElement);
781: $oWriter->addElement('type', conHtmlSpecialChars($type), $oRootElement);
782: $oWriter->addElement('alias', conHtmlSpecialChars($alias), $oRootElement);
783:
784: return $oWriter->saveToFile($this->_modulePath, 'info.xml');
785: }
786:
787: 788: 789: 790: 791: 792: 793: 794: 795: 796:
797: public function createModule($input = '', $output = '') {
798: if ($input != '') {
799: $this->_input = $input;
800: }
801:
802: if ($output != '') {
803: $this->_output = $output;
804: }
805:
806: if ($this->modulePathExists()) {
807: return true;
808: }
809:
810: if (mkdir($this->_modulePath) == false) {
811: return false;
812: } else {
813: cFileHandler::setDefaultDirPerms($this->_modulePath);
814: }
815:
816:
817: foreach ($this->_directories as $directory) {
818: if (!is_dir($this->_modulePath . $directory)) {
819: if (mkdir($this->_modulePath . $directory) == false) {
820: return false;
821: } else {
822: cFileHandler::setDefaultDirPerms($this->_modulePath . $directory);
823: }
824: }
825: }
826:
827:
828: if ($this->saveInfoXML() == false) {
829: return false;
830: }
831:
832:
833:
834: $retInput = $this->saveInput();
835: $retOutput = $this->saveOutput();
836:
837: if ($retInput == false || $retOutput == false) {
838: return false;
839: }
840:
841: return true;
842: }
843:
844: 845: 846: 847: 848: 849: 850: 851:
852: public function renameModul($old, $new) {
853:
854: if (rename($this->_path . $old, $this->_path . $new) == false) {
855: return false;
856: } else {
857: $retInput = true;
858: $retOutput = true;
859:
860:
861: if (cFileHandler::exists($this->_path . $new . '/' . $this->_directories['php'] . $old . '_input.php'))
862: $retInput = rename($this->_path . $new . '/' . $this->_directories['php'] . $old . '_input.php', $this->_path . $new . '/' . $this->_directories['php'] . $new . '_input.php');
863:
864:
865: if (cFileHandler::exists($this->_path . $new . '/' . $this->_directories['php'] . $old . '_output.php'))
866: $retOutput = rename($this->_path . $new . '/' . $this->_directories['php'] . $old . '_output.php', $this->_path . $new . '/' . $this->_directories['php'] . $new . '_output.php');
867:
868:
869: if (cFileHandler::exists($this->_path . $new . '/' . $this->_directories['css'] . $old . '.css'))
870: rename($this->_path . $new . '/' . $this->_directories['css'] . $old . '.css', $this->_path . $new . '/' . $this->_directories['css'] . $new . '.css');
871:
872:
873: if (cFileHandler::exists($this->_path . $new . '/' . $this->_directories['js'] . $old . '.js'))
874: rename($this->_path . $new . '/' . $this->_directories['js'] . $old . '.js', $this->_path . $new . '/' . $this->_directories['js'] . $new . '.js');
875:
876:
877: if (cFileHandler::exists($this->_path . $new . '/' . $this->_directories['template'] . $old . '.html'))
878: rename($this->_path . $new . '/' . $this->_directories['template'] . $old . '.html', $this->_path . $new . '/' . $this->_directories['template'] . $new . '.html');
879:
880: if ($retInput == true && $retOutput == true) {
881: return true;
882: } else {
883: return false;
884: }
885: }
886: }
887:
888: 889: 890: 891: 892:
893: public function modulePathExists() {
894: return is_dir($this->_modulePath);
895: }
896:
897: }
898: