코노리님께서 난달아님의 원작모듈을 새롭게 수정한 메뉴 새글표시 모듈을 배포해서 많이 사용하고 있습니다. 그런데 이 새로운 메뉴새글표시 모듈의 경우 새글 표시가 사라지는 문제가 여전하게 있습니다.
메뉴에 관련된 모듈에서 설정등의 변경이 있을 경우 모든 메뉴를 새롭게 불러와서 새글표시 여부를 다시 표시해줘야 하는데 방식이 바뀌면서 레이아웃에 연결된 메뉴들만 새롭게 초기화? 하는 방식으로 바뀌면서 메뉴에 연결되지 않은 메뉴들에서 새글표시가 사라지고 다시 생기지 않는 문제가 발생합니다.
레이아웃 설정에서 선택되지 않고 연결되지 않는 메뉴들이 있어? 라고 할 수 있지만 사이트에서 바로가기 등을 클릭하고 이동된 페이지에서 메뉴가 출력되는 형태는 흔히 사용될 수 있습니다. 예를 들면 게시판 수량이 엄청 많은 사이트의 경우 해당 게시판의 수 많은 메뉴를 레이아웃의 메인에 걸지 못하고 별도 페이지로 제공하게 됩니다. 이 경우 메뉴를 초기화 해 줘야 하는 대상에서 이 페이지의 메뉴는 제외가 되는 문제가 발생합니다.
또 다른 케이스는 회원에게 제공하는 즐겨찾는 메뉴에 제공하는 메뉴를 사이트 메인에 노출된 메뉴가 아닌 전체 게시판 목록을 제공하기 위해 별도의 다른 메뉴로 제공할 수 도 있습니다. 이 경우도 이 메뉴은 새롭게 갱신되지 못합니다.
그래서 저는 게시판 설정 등을 했을때 모든 메뉴를 다시 불러와주는 코드를 사용한 원작 모듈의 코드로 교체 했습니다.
menunew 모듈명을 가진 최근 배포되고 있는 모듈의 menunew.controller.php 의 맨 하단에 아래와 같은 함수가 있습니다.
/**
* @brief procNew 코드 추가
**/
function triggerModuleHandlerProc($oModule)
{
$layout_srl = Mobile::isFromMobilePhone() ? $oModule->module_info->mlayout_srl : $oModule->module_info->layout_srl;
if($layout_srl == -1)
{
$viewType = Mobile::isFromMobilePhone() ? 'M' : 'P';
$layout_srl = getAdminModel('layout')->getSiteDefaultLayout($viewType, $oModule->module_info->site_srl);
}
if($layout_srl && !$oModule->getLayoutFile())
{
if($layout_info = getModel('layout')->getLayout($layout_srl))
{
if($layout_info->menu_count)
{
foreach($layout_info->menu as $menu_id => $menu)
{
$this->procMenuInclude($menu->menu_srl);
}
}
}
}
return new BaseObject();
}
위 함수를 원작의 함수로 통째로 교체했습니다.
function triggerModuleHandlerProc(&$oModule) {
$target_act = array(
'procHomepageInsertMenuItem',
'procHomepageDeleteMenuItem',
'procHomepageMenuItemMove',
'procMenuAdminInsertItem',
'procMenuAdminUpdateItem',
'procMenuAdminDeleteItem',
'procMenuAdminMoveItem',
'procMenuAdminCopyItem',
'procMenuAdminMakeXmlFile',
'procMenuAdminButtonUpload',
'procMenuAdminUpdateAuth',
'getMenuAdminSiteMap',
'procBoardAdminInsertBoard',
'procPointrushAdminInsertPointrush'
);
if (in_array($oModule->act, $target_act)) {
$file_list = FileHandler::readDir($this->menu_cache_path);
if (empty($file_list)) return new BaseObject(-1, 'error');
foreach($file_list as $file) {
if (strpos($file, 'xml')) continue;
$token = explode('.', $file);
$menu_srl = $token[0];
$this->procMenuInclude($menu_srl);
}
}
return new BaseObject();
}
위와 같은 함수로 변경했습니다. 이 코드의 특징은 어떤 액션에서 메뉴를 새로 불러올지 특정하고 있어서 원하는 액션을 추가해 줄 수 있습니다.
마지막 'procPointrushAdminInsertPointrush' 은 제가 사용하는 포인트러쉬 모듈의 설정을 저장할때 새글표시가 사라져서 제가 추가한 부분입니다.