*/ /** * @class layoutModel * @author NAVER (developers@xpressengine.com) * @version 0.1 * Model class of the layout module */ class LayoutModel extends Layout { /** * Check user layout temp * @var string */ var $useUserLayoutTemp = null; /** * Get a layout list created in the DB * If you found a new list, it means that the layout list is inserted to the DB * * @param int $site_srl * @param string $layout_type (P : PC, M : Mobile) * @param array $columnList * @return array layout lists in site */ public static function getLayoutList($site_srl = 0, $layout_type="P", $columnList = array()) { $args = new stdClass(); $args->layout_type = $layout_type; $output = executeQueryArray('layout.getLayoutList', $args, $columnList); foreach($output->data as $no => &$val) { if(!self::isExistsLayoutFile($val->layout, $layout_type)) { unset($output->data[$no]); } } $oLayoutAdminModel = LayoutAdminModel::getInstance(); $siteDefaultLayoutSrl = $oLayoutAdminModel->getSiteDefaultLayout($layout_type); if($siteDefaultLayoutSrl) { $siteDefaultLayoutInfo = self::getLayout($siteDefaultLayoutSrl); $siteDefaultLayoutInfo->layout_srl = -1; $siteDefaultLayoutInfo->layout = $siteDefaultLayoutInfo->title; $siteDefaultLayoutInfo->title = lang('use_site_default_layout'); array_unshift($output->data, $siteDefaultLayoutInfo); } if ($layout_type === 'M') { $responsiveLayoutInfo = new stdClass(); $responsiveLayoutInfo->layout_srl = -2; $responsiveLayoutInfo->layout = ''; $responsiveLayoutInfo->title = lang('use_responsive_pc_layout'); array_unshift($output->data, $responsiveLayoutInfo); } return $output->data; } /** * Get the list layout instance with thumbnail link. for setting design. * * @return void */ public function getLayoutInstanceListForJSONP() { $layoutType = Context::get('layout_type'); $layoutList = $this->getLayoutInstanceList(0, $layoutType); $thumbs = array(); foreach($layoutList as $key => $val) { if(!empty($thumbs[$val->layouts ?? ''])) { $val->thumbnail = $thumbs[$val->layouts]; continue; } $token = explode('|@|', $val->layout); if(count($token) == 2) { $thumbnailPath = sprintf('./themes/%s/layouts/%s/thumbnail.png' , $token[0], $token[1]); } else if($layoutType == 'M') { $thumbnailPath = sprintf('./m.layouts/%s/thumbnail.png' , $val->layout); } else { $thumbnailPath = sprintf('./layouts/%s/thumbnail.png' , $val->layout); } if(is_readable($thumbnailPath)) { $val->thumbnail = $thumbnailPath; } else { $val->thumbnail = sprintf('./modules/layout/tpl/img/noThumbnail.png'); } $thumbs[$val->layout] = $val->thumbnail; } $this->add('layout_list', $layoutList); } /** * Get layout instance list * @param int $siteSrl * @param string $layoutType (P : PC, M : Mobile) * @param string $layout name of layout * @param array $columnList * @return array layout lists in site */ public static function getLayoutInstanceList($siteSrl = 0, $layoutType = 'P', $layout = null, $columnList = array()) { if ($columnList && !isset($columnList['layout_type'])) { $columnList[] = 'layout_type'; } $args = new stdClass(); $args->layout_type = $layoutType === 'P' ? 'P' : 'P,M'; $args->layout = $layout; $output = executeQueryArray('layout.getLayoutList', $args, $columnList); // Create instance name list $instanceList = array(); if(is_array($output->data)) { foreach($output->data as $no => $iInfo) { if (file_exists(\RX_BASEDIR . 'files/faceOff/' . getNumberingPath($iInfo->layout_srl) . 'layout.html') || file_exists(\RX_BASEDIR . 'files/faceOff/' . getNumberingPath($iInfo->layout_srl) . 'layout.css')) { $iInfo->is_edited = true; } else { $iInfo->is_edited = false; } if(self::isExistsLayoutFile($iInfo->layout, $iInfo->layout_type) && $iInfo->layout_type === $layoutType) { $instanceList[] = $iInfo->layout; } else { unset($output->data[$no]); } } } // Create downloaded name list $downloadedList = array(); $titleList = array(); $_downloadedList = self::getDownloadedLayoutList($layoutType); if(is_array($_downloadedList)) { foreach($_downloadedList as $dLayoutInfo) { $downloadedList[$dLayoutInfo->layout] = $dLayoutInfo->layout; $titleList[$dLayoutInfo->layout] = $dLayoutInfo->title; } } if($layout) { if(count($instanceList) < 1 && $downloadedList[$layout]) { $insertArgs = new stdClass(); $insertArgs->layout_srl = getNextSequence(); $insertArgs->layout = $layout; $insertArgs->title = $titleList[$layout]; $insertArgs->layout_type = $layoutType; $oLayoutAdminController = LayoutAdminController::getInstance(); $oLayoutAdminController->insertLayout($insertArgs); $isCreateInstance = TRUE; } } else { // Get downloaded name list have no instance $noInstanceList = array_diff($downloadedList, $instanceList); foreach($noInstanceList as $layoutName) { $insertArgs = new stdClass(); $insertArgs->layout_srl = getNextSequence(); $insertArgs->layout = $layoutName; $insertArgs->title = $titleList[$layoutName]; $insertArgs->layout_type = $layoutType; $oLayoutAdminController = LayoutAdminController::getInstance(); $oLayoutAdminController->insertLayout($insertArgs); $isCreateInstance = TRUE; } } // If create layout instance, reload instance list if($isCreateInstance) { $output = executeQueryArray('layout.getLayoutList', $args, $columnList); if(is_array($output->data)) { foreach($output->data as $no => $iInfo) { if(!self::isExistsLayoutFile($iInfo->layout, $layoutType)) { unset($output->data[$no]); } } } } return $output->data; } /** * If exists layout file returns true * * @param string $layout layout name * @param string $layoutType P or M * @return bool */ public static function isExistsLayoutFile($layout, $layoutType) { //TODO If remove a support themes, remove this codes also. if($layoutType == 'P') { $pathPrefix = RX_BASEDIR . 'layouts/'; $themePathFormat = RX_BASEDIR . 'themes/%s/layouts/%s'; } else { $pathPrefix = RX_BASEDIR . 'm.layouts/'; $themePathFormat = RX_BASEDIR . 'themes/%s/m.layouts/%s'; } if(strpos($layout, '|@|') !== FALSE) { list($themeName, $layoutName) = explode('|@|', $layout); $path = sprintf($themePathFormat, $themeName, $layoutName); } else { $path = $pathPrefix . $layout; } if (file_exists($path . '/layout.html') && is_readable($path . '/layout.html')) { return true; } elseif (file_exists($path . '/layout.blade.php') && is_readable($path . '/layout.blade.php')) { return true; } else { return false; } } /** * Get one of layout information created in the DB * Return DB info + XML info of the generated layout * @param int $layout_srl * @param bool $use_cache * @return object info of layout */ public static function getLayout($layout_srl, $use_cache = true) { // Get information from cache $layout_info = Rhymix\Framework\Cache::get("layout:$layout_srl"); if ($use_cache && $layout_info !== null) { return $layout_info; } // Get information from the DB $args = new stdClass(); $args->layout_srl = $layout_srl; $output = executeQuery('layout.getLayout', $args); if (!$output->data) { return; } // Return xml file informaton after listing up the layout and extra_vars $layout = $output->data->layout; $layout_info = self::getLayoutInfo($layout, $output->data, $output->data->layout_type); if (!$layout_info) { return; } // Check if layout has been edited if (file_exists(\RX_BASEDIR . 'files/faceOff/' . getNumberingPath($layout_srl) . 'layout.html') || file_exists(\RX_BASEDIR . 'files/faceOff/' . getNumberingPath($layout_srl) . 'layout.css')) { $layout_info->is_edited = true; } else { $layout_info->is_edited = false; } // Store in cache Rhymix\Framework\Cache::set("layout:$layout_srl", $layout_info); return $layout_info; } public static function getLayoutRawData($layout_srl, $columnList = array()) { $args = new stdClass(); $args->layout_srl = $layout_srl; $output = executeQuery('layout.getLayout', $args, $columnList); if(!$output->toBool()) { return; } return $output->data; } /** * Get a layout path * @param string $layout_name * @param string $layout_type (P : PC, M : Mobile) * @return string path of layout */ public function getLayoutPath($layout_name = "", $layout_type = "P") { $layout_parse = explode('|@|', $layout_name ?? ''); if(count($layout_parse) > 1) { $class_path = './themes/'.$layout_parse[0].'/layouts/'.$layout_parse[1].'/'; } else if($layout_name == 'faceoff') { $class_path = './modules/layout/faceoff/'; } else if($layout_type == "M") { $class_path = sprintf("./m.layouts/%s/", $layout_name); } else { $class_path = sprintf('./layouts/%s/', $layout_name); } if(is_dir($class_path)) return $class_path; return ""; } /** * Get a type and information of the layout * A type of downloaded layout * @param string $layout_type (P : PC, M : Mobile) * @param boolean $withAutoinstallInfo * @return array info of layout */ public static function getDownloadedLayoutList($layout_type = "P", $withAutoinstallInfo = false) { if ($withAutoinstallInfo) { $oAutoinstallModel = AutoinstallModel::getInstance(); } // Get a list of downloaded layout and installed layout $searched_list = self::_getInstalledLayoutDirectories($layout_type); $searched_count = count($searched_list); if(!$searched_count) return; // natcasesort($searched_list); // Return information for looping searched list of layouts $list = array(); for($i=0;$i<$searched_count;$i++) { // Name of the layout $layout = $searched_list[$i]; // Get information of the layout $layout_info = self::getLayoutInfo($layout, null, $layout_type); if(!$layout_info) { continue; } if($withAutoinstallInfo && false) { // get easyinstall remove url $packageSrl = $oAutoinstallModel->getPackageSrlByPath($layout_info->path); $layout_info->remove_url = $oAutoinstallModel->getRemoveUrlByPackageSrl($packageSrl); // get easyinstall need update $package = $oAutoinstallModel->getInstalledPackages($packageSrl); $layout_info->need_update = $package[$packageSrl]->need_update; // get easyinstall update url if($layout_info->need_update) { $layout_info->update_url = $oAutoinstallModel->getUpdateUrlByPackageSrl($packageSrl); } } $list[] = $layout_info; } usort($list, array(self::class, 'sortLayoutByTitle')); return $list; } /** * Sort layout by title */ public static function sortLayoutByTitle($a, $b) { if(!$a->title) { $a->title = $a->layout; } if(!$b->title) { $b->title = $b->layout; } $aTitle = strtolower($a->title ?? ''); $bTitle = strtolower($b->title ?? ''); if($aTitle == $bTitle) { return 0; } return ($aTitle < $bTitle) ? -1 : 1; } /** * Get a count of layout * @param string $layoutType (P : PC, M : Mobile) * @return int */ public static function getInstalledLayoutCount($layoutType = 'P') { $searchedList = self::_getInstalledLayoutDirectories($layoutType); return count($searchedList); } /** * Get list of layouts directory * @param string $layoutType (P : PC, M : Mobile) * @return array */ public static function _getInstalledLayoutDirectories($layoutType = 'P') { if($layoutType == 'M') { $directory = './m.layouts'; $globalValueKey = 'MOBILE_LAYOUT_DIRECTOIES'; } else { $directory = './layouts'; $globalValueKey = 'PC_LAYOUT_DIRECTORIES'; } if(!empty($GLOBALS[$globalValueKey])) { return $GLOBALS[$globalValueKey]; } $searchedList = FileHandler::readDir($directory); if (!$searchedList) $searchedList = array(); $GLOBALS[$globalValueKey] = $searchedList; return $searchedList; } /** * Get information by reading conf/info.xml in the module * It uses caching to reduce time for xml parsing .. * @param string $layout * @param object $info * @param string $layoutType (P : PC, M : Mobile) * @return object info of layout */ public static function getLayoutInfo($layout, $info = null, $layout_type = "P") { if($info) { $layout_title = $info->title; $layout = $info->layout; $layout_srl = $info->layout_srl; $site_srl = $info->site_srl; $vars = unserialize($info->extra_vars); if($info->module_srl) { $layout_path = preg_replace('/([a-zA-Z0-9\_\.]+)(\.html)$/','',$info->layout_path); $xml_file = sprintf('%sskin.xml', $layout_path); } } else { $layout_title = $layout_srl = null; $site_srl = 0; $vars = new stdClass; } // Get a path of the requested module. Return if not exists. if(!isset($layout_path)) { $layout_path = self::getInstance()->getLayoutPath($layout, $layout_type); } if(!is_dir($layout_path)) { return; } // Read the xml file for module skin information if(!isset($xml_file)) { $xml_file = sprintf("%sconf/info.xml", $layout_path); } if(!file_exists($xml_file)) { $layout_info = new stdClass; $layout_info->title = $layout; $layout_info->layout = $layout; $layout_info->path = $layout_path; $layout_info->layout_title = $layout_title; if(empty($layout_info->layout_type)) { $layout_info->layout_type = $layout_type; } return $layout_info; } // Include the cache file if it is valid and then return $layout_info variable if(empty($layout_srl)) { $cache_file = self::getLayoutCache($layout, Context::getLangType(), $layout_type); } else { $cache_file = self::getUserLayoutCache($layout_srl, Context::getLangType()); } if(file_exists($cache_file) && filemtime($cache_file) > filemtime($xml_file)) { $layout_info = new stdClass; include($cache_file); if($layout_info->extra_var && $vars) { foreach($vars as $key => $value) { if(!isset($layout_info->extra_var->{$key}) && !isset($layout_info->{$key})) { $layout_info->{$key} = $value; } } } if(!$layout_info->title) { $layout_info->title = $layout; } return $layout_info; } // If no cache file exists, parse the xml and then return the variable. $tmp_xml_obj = Rhymix\Framework\Parsers\XEXMLParser::loadXMLFile($xml_file); if (!$tmp_xml_obj) { return; } $xml_obj = !empty($tmp_xml_obj->layout) ? $tmp_xml_obj->layout : $tmp_xml_obj->skin; if (!$xml_obj) { return; } $buff = array(); $buff[] = '$layout_info = new stdClass;'; $buff[] = sprintf('$layout_info->site_srl = %s;', var_export($site_srl ?? 0, true)); if($xml_obj->version && $xml_obj->attrs->version == '0.2') { // Layout title, version and other information $date_obj = new stdClass; sscanf($xml_obj->date->body, '%d-%d-%d', $date_obj->y, $date_obj->m, $date_obj->d); $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); $buff[] = sprintf('$layout_info->layout = %s;', var_export($layout, true)); $buff[] = sprintf('$layout_info->type = %s;', var_export($xml_obj->attrs->type ?? null, true)); $buff[] = sprintf('$layout_info->path = %s;', var_export($layout_path, true)); $buff[] = sprintf('$layout_info->title = %s;', var_export($xml_obj->title->body ?? null, true)); $buff[] = sprintf('$layout_info->description = %s;', var_export($xml_obj->description->body ?? null, true)); $buff[] = sprintf('$layout_info->version = %s;', var_export($xml_obj->version->body ?? null, true)); $buff[] = sprintf('$layout_info->date = %s;', var_export($date, true)); $buff[] = sprintf('$layout_info->homepage = %s;', var_export($xml_obj->link->body ?? null, true)); $buff[] = sprintf('$layout_info->layout_srl = $layout_srl;'); $buff[] = sprintf('$layout_info->layout_title = $layout_title;'); $buff[] = sprintf('$layout_info->license = %s;', var_export($xml_obj->license->body ?? null, true)); $buff[] = sprintf('$layout_info->license_link = %s;', var_export($xml_obj->license->attrs->link ?? null, true)); $buff[] = sprintf('$layout_info->layout_type = %s;', var_export($layout_type, true)); // Author information if(!is_array($xml_obj->author)) $author_list[] = $xml_obj->author; else $author_list = $xml_obj->author; $buff[] = '$layout_info->author = array();'; for($i=0, $c=count($author_list); $i<$c; $i++) { $buff[] = sprintf('$layout_info->author[%d] = new stdClass;', $i); $buff[] = sprintf('$layout_info->author[%d]->name = %s;', $i, var_export($author_list[$i]->name->body, true)); $buff[] = sprintf('$layout_info->author[%d]->email_address = %s;', $i, var_export($author_list[$i]->attrs->email_address, true)); $buff[] = sprintf('$layout_info->author[%d]->homepage = %s;', $i, var_export($author_list[$i]->attrs->link, true)); } // Extra vars (user defined variables to use in a template) $extra_var_groups = $xml_obj->extra_vars->group; if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); $buff[] = '$layout_info->extra_var = new stdClass;'; $extra_var_count = 0; foreach($extra_var_groups as $group) { $extra_vars = $group->var; if($extra_vars) { if(!is_array($extra_vars)) $extra_vars = array($extra_vars); $count = count($extra_vars); $extra_var_count += $count; for($i=0;$i<$count;$i++) { unset($var, $options); $var = $extra_vars[$i]; $name = $var->attrs->name; $buff[] = sprintf('$layout_info->extra_var->%s = new stdClass;', $name); $buff[] = sprintf('$layout_info->extra_var->%s->group = %s;', $name, var_export($group->title->body ?? null, true)); $buff[] = sprintf('$layout_info->extra_var->%s->title = %s;', $name, var_export($var->title->body ?? null, true)); $buff[] = sprintf('$layout_info->extra_var->%s->type = %s;', $name, var_export($var->attrs->type ?? null, true)); $buff[] = sprintf('$layout_info->extra_var->%s->value = $vars->%s ?? null;', $name, $name); $buff[] = sprintf('$layout_info->extra_var->%s->description = %s;', $name, var_export($var->description->body ?? null, true)); $options = $var->options; if(!$options) continue; if(!is_array($options)) $options = array($options); $buff[] = sprintf('$layout_info->extra_var->%s->options = array();', $var->attrs->name); $options_count = count($options); $thumbnail_exist = false; for($j=0; $j < $options_count; $j++) { $buff[] = sprintf('$layout_info->extra_var->%s->options[%s] = new stdClass;', $var->attrs->name, var_export($options[$j]->attrs->value, true)); $thumbnail = $options[$j]->attrs->src; if($thumbnail) { $thumbnail = $layout_path.$thumbnail; if(file_exists($thumbnail)) { $buff[] = sprintf('$layout_info->extra_var->%s->options[%s]->thumbnail = %s;', $var->attrs->name, var_export($options[$j]->attrs->value, true), var_export($thumbnail, true)); if(!$thumbnail_exist) { $buff[] = sprintf('$layout_info->extra_var->%s->thumbnail_exist = true;', $var->attrs->name); $thumbnail_exist = true; } } } $buff[] = sprintf('$layout_info->extra_var->%s->options[%s]->val = %s;', $var->attrs->name, var_export($options[$j]->attrs->value, true), var_export($options[$j]->title->body, true)); } } } } $buff[] = sprintf('$layout_info->extra_var_count = %d;', $extra_var_count); // Menu if($xml_obj->menus->menu) { $menus = $xml_obj->menus->menu; if(!is_array($menus)) $menus = array($menus); $menu_count = count($menus); $buff[] = sprintf('$layout_info->menu_count = %d;', $menu_count); $buff[] = '$layout_info->menu = new stdClass;'; for($i=0;$i<$menu_count;$i++) { $name = $menus[$i]->attrs->name; if($menus[$i]->attrs->default == "true") $buff[] = sprintf('$layout_info->default_menu = %s;', var_export($name, true)); $buff[] = sprintf('$layout_info->menu->%s = new stdClass;', $name); $buff[] = sprintf('$layout_info->menu->%s->name = %s;', $name, var_export($menus[$i]->attrs->name, true)); $buff[] = sprintf('$layout_info->menu->%s->title = %s;', $name, var_export($menus[$i]->title->body, true)); $buff[] = sprintf('$layout_info->menu->%s->maxdepth = %s;', $name, var_export($menus[$i]->attrs->maxdepth, true)); $buff[] = sprintf('$layout_info->menu->%s->menu_srl = $vars->%s;', $name, $name); $buff[] = sprintf('$layout_info->menu->%s->xml_file = "./files/cache/menu/".$vars->%s.".xml.php";',$name, $name); $buff[] = sprintf('$layout_info->menu->%s->php_file = "./files/cache/menu/".$vars->%s.".php";',$name, $name); } } } else { // Layout title, version and other information $date_obj = new stdClass; sscanf($xml_obj->author->attrs->date, '%d. %d. %d', $date_obj->y, $date_obj->m, $date_obj->d); $date = sprintf('%04d%02d%02d', $date_obj->y, $date_obj->m, $date_obj->d); $buff[] = sprintf('$layout_info->layout = %s;', var_export($layout, true)); $buff[] = sprintf('$layout_info->path = %s;', var_export($layout_path, true)); $buff[] = sprintf('$layout_info->title = %s;', var_export($xml_obj->title->body ?? null, true)); $buff[] = sprintf('$layout_info->description = %s;', var_export($xml_obj->author->description->body ?? null, true)); $buff[] = sprintf('$layout_info->version = %s;', var_export($xml_obj->attrs->version ?? null, true)); $buff[] = sprintf('$layout_info->date = %s;', var_export($date, true)); $buff[] = sprintf('$layout_info->layout_srl = $layout_srl;'); $buff[] = sprintf('$layout_info->layout_title = $layout_title;'); // Author information $buff[] = '$layout_info->author[0] = new stdClass();'; $buff[] = sprintf('$layout_info->author[0]->name = %s;', var_export($xml_obj->author->name->body ?? null, true)); $buff[] = sprintf('$layout_info->author[0]->email_address = %s;', var_export($xml_obj->author->attrs->email_address ?? null, true)); $buff[] = sprintf('$layout_info->author[0]->homepage = %s;', var_export($xml_obj->author->attrs->link ?? null, true)); // Extra vars (user defined variables to use in a template) $extra_var_groups = $xml_obj->extra_vars->group; if(!$extra_var_groups) $extra_var_groups = $xml_obj->extra_vars; if(!is_array($extra_var_groups)) $extra_var_groups = array($extra_var_groups); $extra_var_count = 0; $buff[] = '$layout_info->extra_var = new stdClass;'; foreach($extra_var_groups as $group) { $extra_vars = $group->var; if($extra_vars) { if(!is_array($extra_vars)) $extra_vars = array($extra_vars); $count = count($extra_vars); $extra_var_count += $count; for($i=0;$i<$count;$i++) { unset($var, $options); $var = $extra_vars[$i]; $name = $var->attrs->name; $buff[] = sprintf('$layout_info->extra_var->%s = new stdClass();', $name); $buff[] = sprintf('$layout_info->extra_var->%s->group = %s;', $name, var_export($group->title->body ?? null, true)); $buff[] = sprintf('$layout_info->extra_var->%s->title = %s;', $name, var_export($var->title->body ?? null, true)); $buff[] = sprintf('$layout_info->extra_var->%s->type = %s;', $name, var_export($var->attrs->type ?? null, true)); $buff[] = sprintf('$layout_info->extra_var->%s->value = $vars->%s ?? null;', $name, $name); $buff[] = sprintf('$layout_info->extra_var->%s->description = %s ?? null;', $name, var_export($var->description->body ?? null, true)); $options = $var->options; if(!$options) continue; if(!is_array($options)) $options = array($options); $options_count = count($options); for($j=0;$j<$options_count;$j++) { $buff[] = sprintf('$layout_info->extra_var->%s->options[%s] = new stdClass;', $var->attrs->name, var_export($options[$j]->value->body, true)); $buff[] = sprintf('$layout_info->extra_var->%s->options[%s]->val = %s;', $var->attrs->name, var_export($options[$j]->value->body, true), var_export($options[$j]->title->body, true)); } } } } $buff[] = sprintf('$layout_info->extra_var_count = %d;', $extra_var_count); // Menu if($xml_obj->menus->menu) { $menus = $xml_obj->menus->menu; if(!is_array($menus)) $menus = array($menus); $menu_count = count($menus); $buff[] = sprintf('$layout_info->menu_count = %d;', $menu_count); $buff[] = '$layout_info->menu = new stdClass();'; for($i=0;$i<$menu_count;$i++) { $name = $menus[$i]->attrs->name; if($menus[$i]->attrs->default == "true") $buff[] = sprintf('$layout_info->default_menu = %s;', var_export($name, true)); $buff[] = sprintf('$layout_info->menu->%s = new stdClass();', $name); $buff[] = sprintf('$layout_info->menu->%s->name = %s;', $name, var_export($name, true)); $buff[] = sprintf('$layout_info->menu->%s->title = %s;', $name, var_export($menus[$i]->title->body ?? null, true)); $buff[] = sprintf('$layout_info->menu->%s->maxdepth = %s;', $name, var_export($menus[$i]->maxdepth->body ?? null, true)); $buff[] = sprintf('$layout_info->menu->%s->menu_srl = $vars->%s;', $name, $name); $buff[] = sprintf('$layout_info->menu->%s->xml_file = "./files/cache/menu/".$vars->%s.".xml.php";',$name, $name); $buff[] = sprintf('$layout_info->menu->%s->php_file = "./files/cache/menu/".$vars->%s.".php";',$name, $name); } } } // header_script $layout_config = ModuleModel::getModulePartConfig('layout', $layout_srl); $header_script = trim($layout_config->header_script ?? ''); if(!empty($header_script)) { $buff[] = sprintf(' $layout_info->header_script = %s; ', var_export($header_script, true)); } FileHandler::writeFile($cache_file, 'title) { $layout_info->title = $layout; } return $layout_info; } /** * Return a list of images which are uploaded on the layout setting page * @param int $layout_srl * @return array image list in layout */ public static function getUserLayoutImageList($layout_srl) { return FileHandler::readDir(self::getUserLayoutImagePath($layout_srl)); } /** * Get ini configurations and make them an array. * @param int $layout_srl * @param string $layout_name * @return array */ public function getUserLayoutIniConfig($layout_srl, $layout_name=null) { $file = self::getUserLayoutIni($layout_srl); if($layout_name && FileHandler::exists($file) === FALSE) { FileHandler::copyFile($this->getDefaultLayoutIni($layout_name), $this->getUserLayoutIni($layout_srl)); } return FileHandler::readIniFile($file); } /** * get user layout path * @param int $layout_srl * @return string */ public static function getUserLayoutPath($layout_srl) { return sprintf("./files/faceOff/%s", getNumberingPath($layout_srl,3)); } /** * get user layout image path * @param int $layout_srl * @return string */ public static function getUserLayoutImagePath($layout_srl) { return self::getUserLayoutPath($layout_srl). 'images/'; } /** * css which is set by an administrator on the layout setting page * @param int $layout_srl * @return string */ public static function getUserLayoutCss($layout_srl) { return self::getUserLayoutPath($layout_srl). 'layout.css'; } /** * Import faceoff css from css module handler * @param int $layout_srl * @return string */ public function getUserLayoutFaceOffCss($layout_srl) { if($this->useUserLayoutTemp == 'temp') return; return $this->_getUserLayoutFaceOffCss($layout_srl); } /** * Import faceoff css from css module handler * @param int $layout_srl * @return string */ public function _getUserLayoutFaceOffCss($layout_srl) { return self::getUserLayoutPath($layout_srl). 'faceoff.css'; } /** * get user layout tmp html * @param int $layout_srl * @return string */ public static function getUserLayoutTempFaceOffCss($layout_srl) { return self::getUserLayoutPath($layout_srl). 'tmp.faceoff.css'; } /** * user layout html * @param int $layout_srl * @return string */ public function getUserLayoutHtml($layout_srl) { $src = self::getUserLayoutPath($layout_srl). 'layout.html'; if($this->useUserLayoutTemp == 'temp') { $temp = $this->getUserLayoutTempHtml($layout_srl); if(FileHandler::exists($temp) === FALSE) FileHandler::copyFile($src,$temp); return $temp; } return $src; } /** * user layout tmp html * @param int $layout_srl * @return string */ public static function getUserLayoutTempHtml($layout_srl) { return self::getUserLayoutPath($layout_srl). 'tmp.layout.html'; } /** * user layout ini * @param int $layout_srl * @return string */ public function getUserLayoutIni($layout_srl) { $src = self::getUserLayoutPath($layout_srl). 'layout.ini'; if($this->useUserLayoutTemp == 'temp') { $temp = self::getUserLayoutTempIni($layout_srl); if(!file_exists(FileHandler::getRealPath($temp))) FileHandler::copyFile($src,$temp); return $temp; } return $src; } /** * user layout tmp ini * @param int $layout_srl * @return string */ public static function getUserLayoutTempIni($layout_srl) { return self::getUserLayoutPath($layout_srl). 'tmp.layout.ini'; } /** * user layout cache * TODO It may need to remove the file itself * @param int $layout_srl * @param string $lang_type * @return string */ public static function getUserLayoutCache($layout_srl,$lang_type) { return self::getUserLayoutPath($layout_srl). "{$lang_type}.cache.php"; } /** * layout cache * @param int $layout_srl * @param string $lang_type * @return string */ public static function getLayoutCache($layout_name,$lang_type,$layout_type='P') { if($layout_type=='P') { return sprintf("%sfiles/cache/layout/%s.%s.cache.php", RX_BASEDIR, $layout_name,$lang_type); } else { return sprintf("%sfiles/cache/layout/m.%s.%s.cache.php", RX_BASEDIR, $layout_name,$lang_type); } } /** * default layout ini to prevent arbitrary changes by a user * @param string $layout_name * @return string */ public function getDefaultLayoutIni($layout_name) { return $this->getDefaultLayoutPath($layout_name). 'layout.ini'; } /** * default layout html to prevent arbitrary changes by a user * @param string $layout_name * @return string */ public function getDefaultLayoutHtml($layout_name) { return $this->getDefaultLayoutPath($layout_name). 'layout.html'; } /** * default layout css to prevent arbitrary changes by a user * @param string $layout_name * @return string */ public function getDefaultLayoutCss($layout_name) { return $this->getDefaultLayoutPath($layout_name). 'css/layout.css'; } /** * default layout path to prevent arbitrary changes by a user * @deprecated * @return string */ public function getDefaultLayoutPath() { return "./modules/layout/faceoff/"; } /** * faceoff is * @param string $layout_name * @return boolean (true : faceoff, false : layout) */ public function useDefaultLayout($layout_name) { $info = $this->getLayoutInfo($layout_name); return ($info->type == 'faceoff'); } /** * Set user layout as temporary save mode * @param string $flag (default 'temp') * @return void */ public function setUseUserLayoutTemp($flag='temp') { $this->useUserLayoutTemp = $flag; } /** * Temp file list for User Layout * @param int $layout_srl * @return array temp files info */ public function getUserLayoutTempFileList($layout_srl) { return array( $this->getUserLayoutTempHtml($layout_srl), $this->getUserLayoutTempFaceOffCss($layout_srl), $this->getUserLayoutTempIni($layout_srl) ); } /** * Saved file list for User Layout * @param int $layout_srl * @return array files info */ public function getUserLayoutFileList($layout_srl) { $file_list = array( basename($this->getUserLayoutHtml($layout_srl)), basename($this->getUserLayoutFaceOffCss($layout_srl)), basename($this->getUserLayoutIni($layout_srl)), basename($this->getUserLayoutCss($layout_srl)) ); $image_path = $this->getUserLayoutImagePath($layout_srl); $image_list = FileHandler::readDir($image_path,'/\.(?:jpg|jpeg|gif|bmp|png)$/i'); foreach($image_list as $image) { $file_list[] = 'images/' . $image; } return $file_list; } /** * faceOff related services for the operation run out * @deprecated * @param object $layout_info * @return void */ public function doActivateFaceOff(&$layout_info) { $layout_info->faceoff_ini_config = $this->getUserLayoutIniConfig($layout_info->layout_srl, $layout_info->layout); // faceoff layout CSS Context::addCSSFile($this->getDefaultLayoutCss($layout_info->layout)); // CSS generated in the layout manager $faceoff_layout_css = $this->getUserLayoutFaceOffCss($layout_info->layout_srl); if($faceoff_layout_css) Context::addCSSFile($faceoff_layout_css); // CSS output for the widget Context::loadFile($this->module_path.'/tpl/css/widget.css', true); if($layout_info->extra_var->colorset->value == 'black') Context::loadFile($this->module_path.'/tpl/css/widget@black.css', true); else Context::loadFile($this->module_path.'/tpl/css/widget@white.css', true); // Different page displayed upon user's permission $logged_info = Context::get('logged_info'); // Display edit button for faceoff layout if(Context::get('module')!='admin' && strpos(Context::get('act'),'Admin')===false && ($logged_info->is_admin == 'Y' || $logged_info->is_site_admin)) { Context::addHtmlFooter('
'.lang('cmd_layout_edit').'
'); } // Display menu when editing the faceOff page if(Context::get('act')=='dispLayoutAdminLayoutModify' && ($logged_info->is_admin == 'Y' || $logged_info->is_site_admin)) { $oTemplate = TemplateHandler::getInstance(); Context::addBodyHeader($oTemplate->compile($this->module_path.'/tpl', 'faceoff_layout_menu')); } } } /* End of file layout.model.php */ /* Location: ./modules/layout/layout.model.php */