Overview

Packages

  • CONTENIDO
  • Core
    • Authentication
    • Backend
    • Cache
    • CEC
    • Chain
    • ContentType
    • Database
    • Debug
    • Exception
    • Frontend
      • Search
      • URI
      • Util
    • GenericDB
      • Model
    • GUI
      • HTML
    • I18N
    • LayoutHandler
    • Log
    • Security
    • Session
    • Util
    • Validation
    • Versioning
    • XML
  • Module
    • ContentRssCreator
    • ContentSitemapHtml
    • ContentSitemapXml
    • ContentUserForum
    • NavigationTop
    • ScriptCookieDirective
  • mpAutoloaderClassMap
  • None
  • Plugin
    • ContentAllocation
    • CronjobOverview
    • FormAssistant
    • FrontendLogic
    • FrontendUsers
    • Linkchecker
    • ModRewrite
    • Newsletter
    • Repository
      • FrontendNavigation
      • KeywordDensity
    • SearchSolr
    • SmartyWrapper
    • UrlShortener
    • UserForum
    • Workflow
  • PluginManager
  • Setup
    • Form
    • GUI
    • Helper
      • Environment
      • Filesystem
      • MySQL
      • PHP
    • UpgradeJob

Classes

  • cLayoutHandler
  • cLayoutSynchronizer
  • Overview
  • Package
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: /**
  3:  * This file contains the layout synchronizer class.
  4:  *
  5:  * @package Core
  6:  * @subpackage LayoutHandler
  7:  * @version SVN Revision $Rev:$
  8:  *
  9:  * @author Rusmir Jusufovic
 10:  * @copyright four for business AG <www.4fb.de>
 11:  * @license http://www.contenido.org/license/LIZENZ.txt
 12:  * @link http://www.4fb.de
 13:  * @link http://www.contenido.org
 14:  */
 15: defined('CON_FRAMEWORK') || die('Illegal call: Missing framework initialization - request aborted.');
 16: 
 17: /**
 18:  * This class synchronizes layouts from filesystem to database table.
 19:  *
 20:  * @package Core
 21:  * @subpackage LayoutHandler
 22:  */
 23: class cLayoutSynchronizer {
 24: 
 25:     /**
 26:      *
 27:      * @var array
 28:      */
 29:     protected $_cfg;
 30: 
 31:     /**
 32:      *
 33:      * @var array
 34:      */
 35:     protected $_cfgClient;
 36: 
 37:     /**
 38:      *
 39:      * @var int
 40:      */
 41:     protected $_lang;
 42: 
 43:     /**
 44:      *
 45:      * @var int
 46:      */
 47:     protected $_client;
 48: 
 49:     /**
 50:      *
 51:      * @var array
 52:      */
 53:     private $_outputMessage = array();
 54: 
 55:     /**
 56:      *
 57:      * @param array $cfg
 58:      * @param array $cfgClient
 59:      * @param int $lang
 60:      * @param int $client
 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:      * Add a Layout to table or update a layout
 71:      *
 72:      * @param string $dir
 73:      * @param string $oldLayoutName
 74:      * @param string $newLayoutName
 75:      * @param string $idclient
 76:      */
 77:     private function _addOrUpdateLayout($dir, $oldLayoutName, $newLayoutName, $idclient) {
 78:         // if layout dont exist in the $cfg["tab"]["lay"] table.
 79:         if ($this->_isExistInTable($oldLayoutName, $idclient) == false) {
 80:             // add new Layout in db-table
 81:             $layoutCollection = new cApiLayoutCollection();
 82:             $layoutCollection->create($newLayoutName, $idclient, $newLayoutName);
 83: 
 84:             // make a layout file if not exist
 85:             if (!cFileHandler::exists($dir . $newLayoutName . '/' . $newLayoutName . '.html')) {
 86:                 cFileHandler::write($dir . $newLayoutName . '/' . $newLayoutName . '.html', '');
 87:             }
 88: 
 89:             // set output message
 90:             $this->_outputMessage['info'][] = sprintf(i18n("Layout synchronization successful: %s"), $newLayoutName);
 91:         } else {
 92:             // update the name of the layout
 93:             if ($oldLayoutName != $newLayoutName) {
 94:                 $this->_updateModulnameInDb($oldLayoutName, $newLayoutName, $idclient);
 95:             }
 96:         }
 97:     }
 98: 
 99:     /**
100:      * Update the name of layout (if the name not allowes)
101:      *
102:      * @param string $oldName
103:      *         old name
104:      * @param string $newName
105:      *         new module name
106:      * @param int $idclient
107:      *         id of client
108:      */
109:     private function _updateModulnameInDb($oldName, $newName, $idclient) {
110:         $oLayColl = new cApiLayoutCollection();
111:         $oLayColl->select("alias='" . $oLayColl->escape($oldName) . "' AND idclient=" . (int) $idclient);
112:         if (false !== $oLay = $oLayColl->next()) {
113:             $oLay->set('alias', $newName);
114:             $oLay->store();
115:         }
116:     }
117: 
118:     /**
119:      * Rename the directory and files
120:      *
121:      * @param string $dir
122:      * @param string $dirNameOld
123:      * @param string $dirNameNew
124:      * @param int $client
125:      * @return bool
126:      */
127:     private function _renameFileAndDir($dir, $dirNameOld, $dirNameNew, $client) {
128:         if (rename($dir . $dirNameOld, $dir . $dirNameNew) == false) {
129:             return false;
130:         }
131: 
132:         $this->_renameFiles($dir, $dirNameOld, $dirNameNew);
133: 
134:         return true;
135:     }
136: 
137:     /**
138:      * Exist the layout in db-table
139:      *
140:      * @param string $alias
141:      *         layout name
142:      * @param int $idclient
143:      *         client id
144:      * @return bool
145:      */
146:     private function _isExistInTable($alias, $idclient) {
147:         // Select depending from idclient all moduls wiht the name $name
148:         $oLayColl = new cApiLayoutCollection();
149:         $ids = $oLayColl->getIdsByWhereClause("alias='" . $oLayColl->escape($alias) . "' AND idclient=" . (int) $idclient);
150:         return (count($ids) > 0) ? true : false;
151:     }
152: 
153:     /**
154:      * Rename the Layout
155:      *
156:      * @param string $dir
157:      *         path to client layout-direcotry $dir
158:      * @param string $oldLayoutName
159:      *         layout name in file directory
160:      * @param string $newLayoutName
161:      *         clear layout name
162:      */
163:     private function _renameFiles($dir, $oldLayoutName, $newLayoutName) {
164:         if (cFileHandler::exists($dir . $newLayoutName . '/' . $oldLayoutName . '.html') == true) {
165:             rename($dir . $newLayoutName . '/' . $oldLayoutName . '.html', $dir . $newLayoutName . '/' . $newLayoutName . '.html');
166:         }
167:     }
168: 
169:     /**
170:      * Update the con_mod, the field lastmodified
171:      *
172:      * @param int $timestamp
173:      *         timestamp of last modification
174:      * @param int $idlay
175:      *         Id of layout
176:      */
177:     public function setLastModified($timestamp, $idlay) {
178:         $oLay = new cApiLayout((int) $idlay);
179:         if ($oLay->isLoaded()) {
180:             $oLay->set('lastmodified', date('Y-m-d H:i:s', $timestamp));
181:             $oLay->store();
182:         }
183:     }
184: 
185:     /**
186:      * Compare file change timestamp and the timestamp in ["tab"]["lay"].
187:      * If file had changed make new code :conGenerateCodeForAllArtsUsingMod
188:      */
189:     private function _compareFileAndLayoutTimestamp() {
190:         // get all layouts from client
191:         $sql = sprintf("SELECT UNIX_TIMESTAMP(lastmodified) AS lastmodified, alias, name, description, idlay FROM %s WHERE idclient=%s", $this->_cfg['tab']['lay'], $this->_client);
192:         $notification = new cGuiNotification();
193:         $dir = $this->_cfgClient[$this->_client]['layout']['path'];
194: 
195:         $db = cRegistry::getDb();
196:         $db->query($sql);
197:         $retIdMod = 0;
198:         while ($db->nextRecord()) {
199:             $lastmodified = $db->f('lastmodified');
200: 
201:             // exist layout directory
202:             if (is_dir($dir . $db->f('alias') . '/')) {
203:                 if (cFileHandler::exists($dir . $db->f('alias') . '/' . $db->f('alias') . '.html')) {
204:                     $lastmodifiedLayout = filemtime($dir . $db->f('alias') . '/' . $db->f('alias') . '.html');
205: 
206:                     // update layout data
207:                     if ($lastmodified < $lastmodifiedLayout) {
208:                         // update field lastmodified in table lay
209:                         $this->setLastModified($lastmodifiedLayout, $db->f('idlay'));
210:                         $layout = new cLayoutHandler($db->f('idlay'), ' ', $this->_cfg, $this->_lang);
211:                         // Update CODE table
212:                         conGenerateCodeForAllartsUsingLayout($db->f('idlay'));
213:                         $this->_outputMessage['info'][] = i18n("Layout synchronization successful: ") . $db->f('name');
214:                     }
215:                 }
216:             } else {
217:                 $oLayout = new cApiLayout($db->f('idlay'));
218: 
219:                 $layout = new cLayoutHandler($db->f('idlay'), '', $this->_cfg, $this->_lang);
220:                 // is layout in use
221:                 if ($oLayout->isInUse()) {
222:                     // make layout file
223:                     $layout->saveLayout('');
224:                     $this->_outputMessage['info'][] = i18n("Layout synchronization successful, created: ") . $db->f('name');
225:                 } else {
226:                     // if not in use delete layout
227:                     if ($layout->eraseLayout()) {
228:                         layDeleteLayout($db->f('idlay'));
229:                         $this->_outputMessage['info'][] = i18n("Layout synchronization successful, deleted: ") . $db->f('name');
230:                     } else {
231:                         $this->_outputMessage['error'][] = i18n("Synchronization failed could not delete layout: ") . $db->f('name');
232:                     }
233:                 }
234:             }
235:         }
236:     }
237: 
238:     /**
239:      */
240:     private function _showOutputMessage() {
241:         $emptyMessage = true;
242:         $notification = new cGuiNotification();
243:         foreach ($this->_outputMessage as $typ) {
244:             foreach ($typ as $message) {
245:                 $emptyMessage = false;
246:                 // show display massage
247:                 $notification->displayNotification($typ, $message);
248:             }
249:         }
250:         if ($emptyMessage) {
251:             $notification->displayNotification('info', i18n("Synchronization successful!"));
252:         }
253:     }
254: 
255:     /**
256:      * Synchronize the Layout directory with the lay-table und the lay-table
257:      * with directory.
258:      *
259:      * @return bool
260:      */
261:     public function synchronize() {
262:         // update file and layout
263:         $this->_compareFileAndLayoutTimestamp();
264: 
265:         // get the path to clients layouts
266:         $dir = $this->_cfgClient[$this->_client]['layout']['path'];
267: 
268:         // is/exist directory
269:         if (!is_dir($dir)) {
270:             return false;
271:         }
272: 
273:         if (false !== ($handle = cDirHandler::read($dir))) {
274:             foreach ($handle as $file) {
275:                 // skip dirs to exclude
276:                 // @todo should use setting for dirs to exclude
277:                 if (cFileHandler::fileNameBeginsWithDot($file)) {
278:                     continue;
279:                 }
280: 
281:                 // skip entries that are no directories
282:                 if (false === is_dir($dir . $file . "/")) {
283:                     continue;
284:                 }
285: 
286:                 $newFile = strtolower(cString::cleanURLCharacters($file));
287: 
288:                 if ($newFile == $file) {
289:                     // dir is ok
290:                     $this->_addOrUpdateLayout($dir, $file, $newFile, $this->_client);
291:                 } else {
292:                     // dir not ok (with not allowed characters)
293:                     if (is_dir($dir . $newFile) && strtolower($file) != $newFile) {
294:                         // exist the new dir name after clean?
295:                         // make new dirname
296:                         $newDirName = $newFile . substr(md5(time() . rand(0, time())), 0, 4);
297:                         // rename
298:                         if ($this->_renameFileAndDir($dir, $file, $newDirName, $this->_client) != false) {
299:                             $this->_addOrUpdateLayout($dir, $file, $newDirName, $this->_client);
300:                         }
301:                     } else {
302:                         // $newFile (dir) not exist
303:                         // rename dir old
304:                         if ($this->_renameFileAndDir($dir, $file, $newFile, $this->_client) != false) {
305:                             $this->_addOrUpdateLayout($dir, $file, $newFile, $this->_client);
306:                         }
307:                     }
308:                 }
309:             }
310:         }
311: 
312:         $this->_showOutputMessage();
313:     }
314: }
315: 
CMS CONTENIDO 4.9.8 API documentation generated by ApiGen 2.8.0