/** * Компилирует тему * * @param array $aParams Передаваемые параметры * @return bool */ public function CompileTheme($aParams, $bDownload = FALSE) { if (!E::User()) { return FALSE; } $sCompiledStyle = E::ModuleLess()->CompileFile(array(C::Get('path.skins.dir') . 'experience-simple/themes/custom/less/theme.less' => C::Get('path.root.web')), __DIR__ . '/../../../cache/', C::Get('path.skins.dir') . 'experience-simple/themes/custom/css/theme.custom.css.map', $aParams, $bDownload); if ($sCompiledStyle) { if (!$bDownload || E::IsAdmin()) { F::File_PutContents(C::Get('path.skins.dir') . 'experience-simple/themes/custom/css/theme.custom.css', $sCompiledStyle); } else { $sPath = C::Get('plugin.estheme.path_for_download') . E::UserId() . '/theme.custom.css'; F::File_PutContents($sPath, $sCompiledStyle); } } }
public function PrepareFile($sFile, $sDestination) { $sContents = F::File_GetContents($sFile); if ($sContents !== false) { $sContents = $this->PrepareContents($sContents, $sFile, $sDestination); if (F::File_PutContents($sDestination, $sContents) !== false) { return $sDestination; } } F::SysWarning('Can not prepare asset file "' . $sFile . '"'); return null; }
/** * Clear cache * * @param string $sMode * @param array $aTags * @param string|null $sCacheType - Type of cache (if null then clear in all cache types) * * @return bool */ public function Clean($sMode = Zend_Cache::CLEANING_MODE_ALL, $aTags = array(), $sCacheType = null) { // Проверим разрешено ли кэширование if ($this->_cacheOn($sCacheType)) { $aTags = $this->_prepareTags($aTags); $bResult = $this->_backendClean($sCacheType, $sMode, $aTags); } else { $bResult = false; } F::File_PutContents(C::Get('sys.cache.dir') . self::CHECK_FILENAME, microtime(true)); return $bResult; }
/** * @param string $sText * @param string $sLogFile * @param string $sLevel * * @return bool */ public static function _log($sText, $sLogFile, $sLevel = null) { if (class_exists('ModuleLogger', false) || class_exists('Loader', false) && Loader::Autoload('ModuleLogger')) { // Если загружен модуль Logger, то логгируем ошибку с его помощью return E::ModuleLogger()->Dump($sLogFile, $sText, $sLevel); } elseif (class_exists('Config', false)) { // Если логгера нет, но есть конфиг, то самостоятельно пишем в файл $sFile = Config::Get('sys.logs.dir') . $sLogFile; if (!$sFile) { // Непонятно, куда писать } else { $sText = '[' . date('Y-m-d H:i:s') . ']' . "\n" . $sText; return F::File_PutContents($sFile, $sText, FILE_APPEND | LOCK_EX); } } return false; }
/** * Save cache and check-file of current asset pack */ protected function _saveAssets() { $sCheckFileName = $this->GetAssetsCheckName(); F::File_PutContents($sCheckFileName, time(), LOCK_EX, true); $sCacheFileName = $this->GetAssetsCacheName(); F::File_PutContents($sCacheFileName, F::Serialize($this->aAssets), LOCK_EX, true); F::File_Delete($sCacheFileName . '.tmp'); }
/** * Записывает список активных плагинов в файл PLUGINS.DAT * * @param array|string $aPlugins Список плагинов * * @return bool */ public function SetActivePlugins($aPlugins) { if (!is_array($aPlugins)) { $sPlugin = (string) $aPlugins; $aPlugins = array($sPlugin => array('id' => $sPlugin, 'dirname' => $sPlugin)); } //$aPlugins = array_unique(array_map('trim', $aPlugins)); $aSaveData = array(date(';Y-m-d H:i:s')); foreach ($aPlugins as $sPlugin => $aPluginInfo) { $aSaveData[] = $sPlugin . ' ' . (!empty($aPluginInfo['dirname']) ? $aPluginInfo['dirname'] : $sPlugin) . (!empty($aPluginInfo['name']) ? ' ;' . $aPluginInfo['name'] : ''); } // * Записываем данные в файл PLUGINS.DAT $sFile = F::GetPluginsDatFile(); if (F::File_PutContents($sFile, implode(PHP_EOL, $aSaveData)) !== false) { return true; } return false; }
/** * Upload remote file by URL * * @param string $sUrl * @param string $sTarget * @param string $sDir * @param array $aParams [max_size => «размер в килобайтах»] * * @return bool */ public function UploadRemote($sUrl, $sTarget = 'default', $sDir = null, $aParams = array()) { $this->nLastError = 0; if (!isset($aParams['max_size'])) { $aParams['max_size'] = 0; } else { $aParams['max_size'] = intval($aParams['max_size']); } $sContent = ''; if ($aParams['max_size']) { $hFile = @fopen($sUrl, 'r'); if (!$hFile) { $this->nLastError = self::ERR_REMOTE_FILE_OPEN; return false; } $nSizeKb = 0; while (!feof($hFile) && $nSizeKb <= $aParams['max_size']) { $sPiece = fread($hFile, 1024); if ($sPiece) { $nSizeKb += strlen($sPiece); $sContent .= $sPiece; } else { break; } } fclose($hFile); // * Если конец файла не достигнут, значит файл имеет недопустимый размер if ($nSizeKb > $aParams['max_size']) { $this->nLastError = self::ERR_REMOTE_FILE_MAXSIZE; return false; } } else { $sContent = @file_get_contents($sUrl); if ($sContent === false) { $this->nLastError = self::ERR_REMOTE_FILE_READ; return false; } } if ($sContent) { $sTmpFile = F::File_UploadUniqname(F::File_GetExtension($sUrl)); if (!F::File_PutContents($sTmpFile, $sContent)) { $this->nLastError = self::ERR_REMOTE_FILE_WRITE; return false; } } if (!empty($sTmpFile) && $this->_checkUploadedFile($sTmpFile, $sTarget)) { if ($sDir) { return $this->MoveTmpFile($sTmpFile, $sDir); } else { return $sTmpFile; } } return false; }
/** * Сохраняет в файловом кеше кастомную конфигурацию * * @param $aConfig * @param $bReset */ protected static function _putCustomCfg($aConfig, $bReset = false) { if (is_array($aConfig) && ($sFile = self::_checkCustomCfg())) { $aConfig['_timestamp_'] = time(); if (!$bReset) { // Объединяем текущую конфигурацию с сохраняемой $aOldConfig = self::_getCustomCfg(); if ($aOldConfig) { $aConfig = F::Array_Merge($aOldConfig, $aConfig); } } F::File_PutContents($sFile, F::Serialize($aConfig)); } }
/** * @return bool */ public function Process() { $bResult = true; foreach ($this->aLinks as $nIdx => $aLinkData) { if (empty($aLinkData['throw']) && !empty($aLinkData['compress'])) { $sAssetFile = $aLinkData['asset_file']; $sExtension = 'min.' . F::File_GetExtension($sAssetFile); $sCompressedFile = F::File_SetExtension($sAssetFile, $sExtension); if (!$this->CheckDestination($sCompressedFile)) { if ($sContents = F::File_GetContents($sAssetFile)) { $sContents = $this->Compress($sContents); if (F::File_PutContents($sCompressedFile, $sContents, LOCK_EX, true)) { F::File_Delete($sAssetFile); $this->aLinks[$nIdx]['link'] = F::File_SetExtension($this->aLinks[$nIdx]['link'], $sExtension); } if (C::Get('compress.js.gzip') && C::Get('compress.js.merge') && C::Get('compress.js.use')) { // Сохраним gzip $sCompressedContent = gzencode($sContents, 9); F::File_PutContents($sCompressedFile . '.gz.js', $sCompressedContent, LOCK_EX, true); } } } else { $this->aLinks[$nIdx]['link'] = F::File_SetExtension($this->aLinks[$nIdx]['link'], $sExtension); } } } return $bResult; }
/** * Save cache and check-file of current asset pack */ protected function _saveAssets() { F::File_PutContents($this->GetAssetsCheckName(), time()); $sFile = $this->GetAssetsCacheName(); F::File_PutContents($sFile, F::Serialize($this->aAssets)); F::File_Delete($sFile . '.tmp'); }
/** * @param int $nStage * @param bool $bFinal */ protected function _stageEnd($nStage, $bFinal = false) { $sFile = F::File_GetAssetDir() . '_check/' . $this->GetHash(); F::File_PutContents($sFile . '.' . $nStage . '.end.tmp', time()); for ($n = 1; $n <= $nStage; $n++) { F::File_Delete($sFile . '.' . $n . '.begin.tmp'); if ($n < $nStage || $bFinal) { F::File_Delete($sFile . '.' . $n . '.end.tmp'); } } }
/** * @param string $sTplName * * @return string|bool */ protected function _autocreateOldTemplate($sTplName) { $sOldTemplatesDir = $this->_getAutocreateOldTemplatesDir(); if ($sFile = F::File_Exists($sTplName, $sOldTemplatesDir)) { return $sFile; } $aSourceTemplatesDir = array(Config::Get('path.skin.dir') . '/themes/default/layouts'); if ($sTplName == 'header.tpl' || $sTplName == 'footer.tpl') { if ($sSourceFile = F::File_Exists('default.tpl', $aSourceTemplatesDir)) { $sSource = F::File_GetContents($sSourceFile); $sStr1 = "{hook run='content_begin'}"; $sStr2 = "{hook run='content_end'}"; if (stripos($sSource, '<!DOCTYPE') !== false) { $iPos1 = stripos($sSource, $sStr1); $iPos2 = stripos($sSource, $sStr2); $sHeaderSrc = $this->_clearUnclosedBlocks(substr($sSource, 0, $iPos1 + strlen($sStr1))); $sFooterSrc = $this->_clearUnclosedBlocks(substr($sSource, $iPos2)); F::File_PutContents($sOldTemplatesDir . 'header.tpl', $sHeaderSrc); F::File_PutContents($sOldTemplatesDir . 'footer.tpl', $sFooterSrc); } } } if ($sFile = F::File_Exists($sTplName, $sOldTemplatesDir)) { return $sFile; } return false; }
/** * Writes message to log file * * @param string $sMsg - message to log * * @return bool|int */ protected function _write($sMsg) { $xResult = false; // if no filename then nothing to do if (!($sFileName = $this->GetFileName())) { //throw new Exception("Empty file name for log!"); return false; } // if filename equal '-' then wtites message to browser if ($sFileName == '-') { echo $sMsg . "<br/>\n"; } else { // writes to file $sFile = $this->GetFileDir() . $sFileName; // file for locking $sCheckFileName = $sFile . '.lock'; if (is_file($sCheckFileName) && !is_writeable($sCheckFileName)) { F::SysWarning('Cannot write to file ' . $sCheckFileName); } else { $fp = @fopen($sCheckFileName, 'c'); if (!$fp) { // It is not clear what to do here if ($xResult = F::File_PutContents($sFile, $sMsg . "\n", FILE_APPEND | LOCK_EX)) { // Do rotation if need if ($this->GetUseRotate() && $this->GetSizeForRotate()) { $this->_rotate(); } } } else { // Tries to lock $iTotal = 0; // Check the count of attempts at competitive lock requests for ($iCnt = 0; $iCnt < self::MAX_LOCK_CNT; $iCnt++) { if (flock($fp, LOCK_EX)) { if ($xResult = F::File_PutContents($sFile, $sMsg . "\n", FILE_APPEND | LOCK_EX)) { // Do rotation if need if ($this->GetUseRotate() && $this->GetSizeForRotate()) { $this->_rotate(); } } flock($fp, LOCK_UN); break; } else { $iTotal += self::MAX_LOCK_PERIOD; if ($iTotal >= self::MAX_LOCK_TIME) { break; } usleep(self::MAX_LOCK_PERIOD); } } fclose($fp); } } } return $xResult; }
/** * Сохраняет в файловом кеше кастомную конфигурацию * * @param array $aConfig * @param bool $bReset */ protected static function _putFileCfg($aConfig, $bReset = false) { if (is_array($aConfig) && ($sFile = self::_checkFileCfg())) { if (!$bReset) { // Объединяем текущую конфигурацию с сохраняемой $aOldConfig = self::_getFileCfg(); if ($aOldConfig) { $aData = new DataArray($aOldConfig); foreach ($aConfig as $sKey => $xVal) { $aData[$sKey] = $xVal; } $aConfig = $aData->getArrayCopy(); } } $aConfig['_timestamp_'] = time(); $aConfig['_alto_hash_'] = self::_getHash(); F::File_PutContents($sFile, F::Serialize($aConfig), LOCK_EX); } }