Merge pull request #863 from kijin/pr/responsive-skin

PC용 스킨이나 레이아웃을 모바일에서도 선택할 수 있도록 개선
This commit is contained in:
Kijin Sung 2017-07-02 00:06:21 +09:00 committed by GitHub
commit 99cc64163f
14 changed files with 103 additions and 52 deletions

View file

@ -313,7 +313,7 @@ class ModuleHandler extends Handler
}
$viewType = (Mobile::isFromMobilePhone()) ? 'M' : 'P';
$targetSrl = (Mobile::isFromMobilePhone()) ? 'mlayout_srl' : 'layout_srl';
$targetSrl = $viewType === 'M' ? 'mlayout_srl' : 'layout_srl';
// use the site default layout.
if($module_info->{$targetSrl} == -1)
@ -321,6 +321,16 @@ class ModuleHandler extends Handler
$oLayoutAdminModel = getAdminModel('layout');
$layoutSrl = $oLayoutAdminModel->getSiteDefaultLayout($viewType, $module_info->site_srl);
}
elseif($module_info->{$targetSrl} == -2 && $viewType === 'M')
{
$layoutSrl = $module_info->layout_srl;
if($layoutSrl == -1)
{
$viewType = 'P';
$oLayoutAdminModel = getAdminModel('layout');
$layoutSrl = $oLayoutAdminModel->getSiteDefaultLayout($viewType, $module_info->site_srl);
}
}
else
{
$layoutSrl = $module_info->{$targetSrl};
@ -960,9 +970,15 @@ class ModuleHandler extends Handler
}
// Check if layout_srl exists for the module
if(Mobile::isFromMobilePhone())
$viewType = (Mobile::isFromMobilePhone()) ? 'M' : 'P';
if($viewType === 'M')
{
$layout_srl = $oModule->module_info->mlayout_srl;
if($layout_srl == -2)
{
$layout_srl = $oModule->module_info->layout_srl;
$viewType = 'P';
}
}
else
{
@ -972,7 +988,6 @@ class ModuleHandler extends Handler
// if layout_srl is rollback by module, set default layout
if($layout_srl == -1)
{
$viewType = (Mobile::isFromMobilePhone()) ? 'M' : 'P';
$oLayoutAdminModel = getAdminModel('layout');
$layout_srl = $oLayoutAdminModel->getSiteDefaultLayout($viewType, $oModule->module_info->site_srl);
}

View file

@ -531,6 +531,9 @@ class ModuleObject extends Object
{
return FALSE;
}
// Check mobile status
$is_mobile = Mobile::isFromMobilePhone();
// trigger call
$triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'before', $this);
@ -544,9 +547,13 @@ class ModuleObject extends Object
// execute an addon(call called_position as before_module_proc)
$called_position = 'before_module_proc';
$oAddonController = getController('addon');
$addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone() ? "mobile" : "pc");
$addon_file = $oAddonController->getCacheFilePath($is_mobile ? "mobile" : "pc");
if(FileHandler::exists($addon_file)) include($addon_file);
// Check mobile status again, in case a trigger changed it
$is_mobile = Mobile::isFromMobilePhone();
// Perform action if it exists
if(isset($this->xml_info->action->{$this->act}) && method_exists($this, $this->act))
{
// Check permissions
@ -555,17 +562,17 @@ class ModuleObject extends Object
$this->stop("msg_not_permitted_act");
return FALSE;
}
// integrate skin information of the module(change to sync skin info with the target module only by seperating its table)
$is_default_skin = ((!Mobile::isFromMobilePhone() && $this->module_info->is_skin_fix == 'N') || (Mobile::isFromMobilePhone() && $this->module_info->is_mskin_fix == 'N'));
$usedSkinModule = !($this->module == 'page' && ($this->module_info->page_type == 'OUTSIDE' || $this->module_info->page_type == 'WIDGET'));
if($usedSkinModule && $is_default_skin && $this->module != 'admin' && strpos($this->act, 'Admin') === false && $this->module == $this->module_info->module)
$oModuleModel = getModel('module');
$default_skin = ((!$is_mobile && $this->module_info->is_skin_fix == 'N') || ($is_mobile && $this->module_info->is_mskin_fix == 'N'));
$disable_skin = ($this->module == 'page' && ($this->module_info->page_type == 'OUTSIDE' || $this->module_info->page_type == 'WIDGET'));
if(!$disable_skin && $default_skin && $this->module != 'admin' && strpos($this->act, 'Admin') === false && $this->module == $this->module_info->module)
{
$dir = (Mobile::isFromMobilePhone()) ? 'm.skins' : 'skins';
$valueName = (Mobile::isFromMobilePhone()) ? 'mskin' : 'skin';
$oModuleModel = getModel('module');
$skinType = (Mobile::isFromMobilePhone()) ? 'M' : 'P';
$skinName = $oModuleModel->getModuleDefaultSkin($this->module, $skinType);
$skinType = ($is_mobile && $this->module_info->mskin !== '/USE_RESPONSIVE/') ? 'M' : 'P';
$dir = $skinType === 'M' ? 'm.skins' : 'skins';
$valueName = $skinType === 'M' ? 'mskin' : 'skin';
$skinName = $this->module_info->{$valueName} === '/USE_DEFAULT/' ? $oModuleModel->getModuleDefaultSkin($this->module, $skinType) : $this->module_info->{$valueName};
if($this->module == 'page')
{
$this->module_info->{$valueName} = $skinName;
@ -580,7 +587,6 @@ class ModuleObject extends Object
}
}
$oModuleModel = getModel('module');
$oModuleModel->syncSkinInfoToModuleInfo($this->module_info);
Context::set('module_info', $this->module_info);
// Run
@ -615,7 +621,7 @@ class ModuleObject extends Object
// execute an addon(call called_position as after_module_proc)
$called_position = 'after_module_proc';
$oAddonController = getController('addon');
$addon_file = $oAddonController->getCacheFilePath(Mobile::isFromMobilePhone() ? "mobile" : "pc");
$addon_file = $oAddonController->getCacheFilePath($is_mobile ? "mobile" : "pc");
if(FileHandler::exists($addon_file)) include($addon_file);
if($original_output instanceof Object && !$original_output->toBool())

View file

@ -66,12 +66,24 @@ class boardMobile extends boardView
$oDocumentModel = getModel('document');
$extra_keys = $oDocumentModel->getExtraKeys($this->module_info->module_srl);
Context::set('extra_keys', $extra_keys);
$template_path = sprintf("%sm.skins/%s/",$this->module_path, $this->module_info->mskin);
if(!is_dir($template_path)||!$this->module_info->mskin)
if($this->module_info->mskin === '/USE_RESPONSIVE/')
{
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
if(!is_dir($template_path)||!$this->module_info->skin)
{
$this->module_info->skin = 'default';
$template_path = sprintf("%sskins/%s/",$this->module_path, $this->module_info->skin);
}
}
else
{
$this->module_info->mskin = 'default';
$template_path = sprintf("%sm.skins/%s/",$this->module_path, $this->module_info->mskin);
if(!is_dir($template_path)||!$this->module_info->mskin)
{
$this->module_info->mskin = 'default';
$template_path = sprintf("%sm.skins/%s/",$this->module_path, $this->module_info->mskin);
}
}
$this->setTemplatePath($template_path);
Context::addJsFilter($this->module_path.'tpl/filter', 'input_password.xml');

View file

@ -95,20 +95,6 @@
<p id="footer_text_help" class="x_help-block">{$lang->about_footer_text}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_mobile_header_text">{$lang->mobile_header_text}</label>
<div class="x_controls">
<textarea name="mobile_header_text" id="mobile_header_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->mobile_header_text}<!--@else-->{htmlspecialchars($module_info->mobile_header_text)}<!--@end--></textarea>
<p id="mobile_header_text_help" class="x_help-block">{$lang->about_mobile_header_text}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_mobile_footer_text">{$lang->mobile_footer_text}</label>
<div class="x_controls">
<textarea name="mobile_footer_text" id="mobile_footer_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->mobile_footer_text}<!--@else-->{htmlspecialchars($module_info->mobile_footer_text)}<!--@end--></textarea>
<p id="mobile_footer_text_help" class="x_help-block">{$lang->about_mobile_footer_text}</p>
</div>
</div>
</section>
<section class="section">
<h1>{$lang->mobile_settings}</h1>
@ -123,7 +109,7 @@
<div class="x_controls">
<select name="mlayout_srl" id="mlayout_srl">
<option value="0">{$lang->notuse}</option>
<option loop="$mlayout_list => $key, $val" value="{$val->layout_srl}" selected="selected"|cond="$module_info->mlayout_srl== $val->layout_srl">{$val->title} ({$val->layout})</option>
<option loop="$mlayout_list => $key, $val" value="{$val->layout_srl}" selected="selected"|cond="$module_info->mlayout_srl== $val->layout_srl">{$val->title} <block cond="$val->layout">({$val->layout})</block></option>
</select>
<a href="#mobile_layout_help" class="x_icon-question-sign" data-toggle>{$lang->help}</a>
<p id="mobile_layout_help" class="x_help-block" hidden>{$lang->about_layout}</p>
@ -160,6 +146,20 @@
<p class="x_help-inline">{$lang->about_mobile_page_count}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_mobile_header_text">{$lang->mobile_header_text}</label>
<div class="x_controls">
<textarea name="mobile_header_text" id="mobile_header_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->mobile_header_text}<!--@else-->{htmlspecialchars($module_info->mobile_header_text)}<!--@end--></textarea>
<p id="mobile_header_text_help" class="x_help-block">{$lang->about_mobile_header_text}</p>
</div>
</div>
<div class="x_control-group">
<label class="x_control-label" for="lang_mobile_footer_text">{$lang->mobile_footer_text}</label>
<div class="x_controls">
<textarea name="mobile_footer_text" id="mobile_footer_text" class="lang_code" rows="8" cols="42"><!--@if(strpos($module_info->footer_text, '$user_lang->') === false)-->{$module_info->mobile_footer_text}<!--@else-->{htmlspecialchars($module_info->mobile_footer_text)}<!--@end--></textarea>
<p id="mobile_footer_text_help" class="x_help-block">{$lang->about_mobile_footer_text}</p>
</div>
</div>
</section>
<section class="section">
<h1>{$lang->subtitle_advanced}</h1>

View file

@ -111,6 +111,7 @@ $lang->msg_empty_origin_layout = '원본 Layout이 없습니다.';
$lang->msg_empty_target_layout = '복사할 Layout이 지정되어 있지 않습니다.';
$lang->msg_at_least_one_layout = '해당 레이아웃의 마지막 한개 레이아웃은 삭제할 수 없습니다.';
$lang->use_site_default_layout = '사이트 기본 레이아웃 사용';
$lang->use_responsive_pc_layout = 'PC와 동일한 반응형 레이아웃 사용';
$lang->msg_unabled_preview = '해당 메뉴 타입의 페이지가 하나도 없어 미리보기가 불가능합니다.';
$lang->article_preview_title = '문서의 제목입니다.';
$lang->article_preview_content = '무궁화 꽃이 피었습니다.';

View file

@ -50,20 +50,27 @@ class layoutModel extends layout
unset($output->data[$no]);
}
}
$oLayoutAdminModel = getAdminModel('layout');
$siteDefaultLayoutSrl = $oLayoutAdminModel->getSiteDefaultLayout($layout_type, $site_srl);
if($siteDefaultLayoutSrl)
{
$siteDefaultLayoutInfo = $this->getlayout($siteDefaultLayoutSrl);
$newLayout = sprintf('%s, %s', $siteDefaultLayoutInfo->title, $siteDefaultLayoutInfo->layout);
$siteDefaultLayoutInfo->layout_srl = -1;
$siteDefaultLayoutInfo->layout = $siteDefaultLayoutInfo->title;
$siteDefaultLayoutInfo->title = lang('use_site_default_layout');
$siteDefaultLayoutInfo->layout = $newLayout;
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;
}
@ -127,7 +134,7 @@ class layoutModel extends layout
}
$args = new stdClass();
$args->site_srl = $siteSrl;
$args->layout_type = $layoutType;
$args->layout_type = $layoutType === 'P' ? 'P' : 'P,M';
$args->layout = $layout;
$output = executeQueryArray('layout.getLayoutList', $args, $columnList);
@ -137,7 +144,7 @@ class layoutModel extends layout
{
foreach($output->data as $no => $iInfo)
{
if($this->isExistsLayoutFile($iInfo->layout, $layoutType))
if($this->isExistsLayoutFile($iInfo->layout, $iInfo->layout_type))
{
$instanceList[] = $iInfo->layout;
}

View file

@ -7,7 +7,7 @@
</columns>
<conditions>
<condition operation="equal" column="site_srl" var="site_srl" filter="number" default="0" notnull="notnull" />
<condition operation="equal" column="layout_type" var="layout_type" default="P" pipe="and" />
<condition operation="in" column="layout_type" var="layout_type" default="P" pipe="and" />
<condition operation="equal" column="layout" var="layout" pipe="and" />
</conditions>
<navigation>

View file

@ -125,3 +125,5 @@ $lang->msg_confirm_save_and_use_multilingual = 'Do you want to save and use this
$lang->msg_empty_multilingual = 'Please enter value for multilingual.';
$lang->cmd_set_multilingual_text = 'Set multilingual text';
$lang->cmd_remove_multilingual_text = 'Remove multilingual text';
$lang->use_site_default_skin = 'Use site default skin';
$lang->use_responsive_pc_skin = 'Use responsive PC skin';

View file

@ -81,8 +81,8 @@ $lang->about_module_category = '분류를 통한 관리를 할 수 있도록 합
$lang->about_description = '관리용으로 사용되는 설명입니다.';
$lang->about_header_text = '콘텐츠 상단에 표시되는 내용입니다. (HTML 태그 사용 가능)';
$lang->about_footer_text = '콘텐츠 하단에 표시되는 내용입니다. (HTML 태그 사용 가능)';
$lang->about_mobile_header_text = '입력하지 않을 경우 위에서 지정한 상단 내용을 사용합니다. (HTML 태그 사용 가능)';
$lang->about_mobile_footer_text = '입력하지 않을 경우 위에서 지정한 하단 내용을 사용합니다. (HTML 태그 사용 가능)';
$lang->about_mobile_header_text = '입력하지 않을 경우 PC와 동일한 상단 내용을 사용합니다. (HTML 태그 사용 가능)';
$lang->about_mobile_footer_text = '입력하지 않을 경우 PC와 동일한 하단 내용을 사용합니다. (HTML 태그 사용 가능)';
$lang->skin_fix = '스킨 고정';
$lang->about_skin_fix = '스킨을 고정시킵니다. 일괄 스킨 설정 대상에서 제외됩니다.';
$lang->about_skin = '콘텐츠 스킨을 선택할 수 있습니다.';
@ -124,3 +124,4 @@ $lang->msg_empty_multilingual = '다국어를 입력해 주세요.';
$lang->cmd_set_multilingual_text = '다국어 텍스트 설정';
$lang->cmd_remove_multilingual_text = '다국어 텍스트 해제';
$lang->use_site_default_skin = '사이트 기본 스킨 사용';
$lang->use_responsive_pc_skin = 'PC와 동일한 반응형 스킨 사용';

View file

@ -380,7 +380,8 @@ class moduleAdminController extends module
}
else
{
$skin = $oModuleModel->getModuleDefaultSkin($module_info->module, 'M');
$skin_type = $module_info->mskin === '/USE_RESPONSIVE/' ? 'P' : 'M';
$skin = $oModuleModel->getModuleDefaultSkin($module_info->module, $skin_type);
}
}
else

View file

@ -332,7 +332,8 @@ class moduleAdminModel extends module
{
if($module_info->is_mskin_fix == 'N')
{
$skin = $oModuleModel->getModuleDefaultSkin($module_info->module, 'M', $module_info->site_srl);
$skin_type = $module_info->mskin === '/USE_RESPONSIVE/' ? 'P' : 'M';
$skin = $oModuleModel->getModuleDefaultSkin($module_info->module, $skin_type, $module_info->site_srl);
}
else
{

View file

@ -409,7 +409,7 @@ class moduleController extends module
}
}
if($args->mskin == '/USE_DEFAULT/')
if($args->mskin == '/USE_DEFAULT/' || $args->mskin == '/USE_RESPONSIVE/')
{
$args->is_mskin_fix = 'N';
}
@ -540,7 +540,7 @@ class moduleController extends module
}
}
if($args->mskin == '/USE_DEFAULT/')
if($args->mskin == '/USE_DEFAULT/' || $args->mskin == '/USE_RESPONSIVE/')
{
$args->is_mskin_fix = 'N';
}

View file

@ -291,7 +291,7 @@ class moduleModel extends module
$layoutSrlPc = ($moduleInfo->layout_srl == -1) ? $oLayoutAdminModel->getSiteDefaultLayout('P', $moduleInfo->site_srl) : $moduleInfo->layout_srl;
$layoutSrlMobile = ($moduleInfo->mlayout_srl == -1) ? $oLayoutAdminModel->getSiteDefaultLayout('M', $moduleInfo->site_srl) : $moduleInfo->mlayout_srl;
$skinNamePc = ($moduleInfo->is_skin_fix == 'N') ? $this->getModuleDefaultSkin($moduleInfo->module, 'P') : $moduleInfo->skin;
$skinNameMobile = ($moduleInfo->is_mskin_fix == 'N') ? $this->getModuleDefaultSkin($moduleInfo->module, 'M') : $moduleInfo->mskin;
$skinNameMobile = ($moduleInfo->is_mskin_fix == 'N') ? $this->getModuleDefaultSkin($moduleInfo->module, $moduleInfo->mskin === '/USE_RESPONSIVE/' ? 'P' : 'M') : $moduleInfo->mskin;
$oLayoutModel = getModel('layout');
$layoutInfoPc = $layoutSrlPc ? $oLayoutModel->getLayoutRawData($layoutSrlPc, array('title')) : NULL;
@ -315,7 +315,7 @@ class moduleModel extends module
$moduleInfo->designSettings->layout->mobile = $layoutInfoMobile->title;
$moduleInfo->designSettings->skin->pcIsDefault = $moduleInfo->is_skin_fix == 'N' ? 1 : 0;
$moduleInfo->designSettings->skin->pc = $skinInfoPc->title;
$moduleInfo->designSettings->skin->mobileIsDefault = $moduleInfo->is_mskin_fix == 'N' ? 1 : 0;
$moduleInfo->designSettings->skin->mobileIsDefault = ($moduleInfo->is_mskin_fix == 'N' && $moduleInfo->mskin !== '/USE_RESPONSIVE/') ? 1 : 0;
$moduleInfo->designSettings->skin->mobile = $skinInfoMobile->title;
$module_srl = Rhymix\Framework\Cache::get('site_and_module:module_srl:' . $mid . '_' . $site_srl);
@ -402,11 +402,12 @@ class moduleModel extends module
$moduleInfo->skin = '/USE_DEFAULT/';
}
if($moduleInfo->is_mskin_fix == 'N')
if($moduleInfo->is_mskin_fix == 'N' && $moduleInfo->mskin !== '/USE_RESPONSIVE/')
{
$moduleInfo->mskin = '/USE_DEFAULT/';
}
}
/**
* @brief Get module information corresponding to layout_srl
*/
@ -1125,6 +1126,10 @@ class moduleModel extends module
$useDefault->title = lang('use_site_default_skin') . ' (' . $defaultSkinInfo->title . ')';
$useDefaultList['/USE_DEFAULT/'] = $useDefault;
if($type === 'M')
{
$useDefaultList['/USE_RESPONSIVE/'] = (object)array('title' => lang('use_responsive_pc_skin'));
}
$skin_list = array_merge($useDefaultList, $skin_list);
}
@ -1876,7 +1881,7 @@ class moduleModel extends module
{
if(!$module_info->module_srl) return;
if(Mobile::isFromMobilePhone())
if(Mobile::isFromMobilePhone() && $module_info->mskin !== '/USE_RESPONSIVE/')
{
$skin_vars = $this->getModuleMobileSkinVars($module_info->module_srl);
}

View file

@ -76,7 +76,7 @@
<div class="x_controls">
<select name="mlayout_srl" id="mlayout_srl">
<option value="0">{$lang->notuse}</option>
<option loop="$mlayout_list => $key, $val" value="{$val->layout_srl}" selected="selected"|cond="$module_info->mlayout_srl==$val->layout_srl">{$val->title}({$val->layout})</option>
<option loop="$mlayout_list => $key, $val" value="{$val->layout_srl}" selected="selected"|cond="$module_info->mlayout_srl==$val->layout_srl">{$val->title} <block cond="$val->layout">({$val->layout})</block></option>
</select>
<a href="#aboutMobileLayout" class="x_icon-question-sign" data-toggle>{$lang->help}</a>
<p class="x_help-block" id="aboutMobileLayout" hidden>{$lang->about_layout}</p>